Автор оригинала: Amber Wilkie.
Примечание: как в Rection 16, ComponentWillReceiveProps () Оставается, что означает, что если вы используете эту версию или выше в вашем проекте, это не подходит для вас.
В реагированном мире принудительно замораживается рендеринг. Вы должны позволить DOM позаботиться о себе, когда реагируют воспринимать изменения в штат или реквизит . Для того, чтобы следовать этим шаблонам, мы иногда должны делать вещи, которые кажутся немного глупыми. Рассмотрим этот сценарий:
У нас есть два компонента – родитель и ребенок. Родитель делает вызов API для получения Пользователь Отказ Из этого мы получаем такие вещи, как имя , возраст , Любимый цвет Отказ Мы также получаем ID из нашей базы данных. Мы передадим это на наш дочерний компонент, который также собирается сделать вызов API с идентификатором пользователя. Потрясающие – много данных, которые вступают в наше приложение.
Допустим, мы храним список обуви в базе данных. Когда пользователь изменяет их предпочтение цвета, сервер записывает новые данные в список обуви пользователя. Большой! За исключением, мы не видим новый список обуви в нашем дочернем компоненте. Что дает?
Примечание Конечно, мы должны просто получить туфли из звонка для пользователя – это просто упрощенное объяснение.
Реагирование ререндеринга Основы
Короче говоря, это реагирование будет обновлять только части DOM, которые изменились. В этом случае реквизит Переходим к компоненту обуви ( UserId ) не изменился, Так что ничего не меняется в нашем дочернем компоненте.
Предпочтение цвета пользователя будет обновляться, когда вернусь новую информацию из API – предполагая, что мы делаем что-то с ответом после обновления пользователя.
Но поскольку реагировать не видит причин обновлять список обуви, это не будет – даже на нашем сервере обувь сейчас отличается.
Начальный код
const UserShow extends Component {
state = {
user: {}
}
componentDidMount() {
this.fetchUser().then(this.refreshUser)
}
setNewColor = color => {
this.updateUser({color}).then(this.refreshUser)
}
refreshUser = res => this.setState({user: res.data.user})
render() {
const { user } = this.state;
return (
User name: {user.name}
Pick color:
{colors.map(color =>
this.setNewColor(color)} />)}
)}
)
}
}Наше Shoeleist Просто будет список обуви, которые мы принесем с сервера с идентификатором пользователя:
const ShoeList extends Component {
state = {
shoes: []
}
componentDidMount() {
this.fetchShoes(this.props.id)
.then(this.refreshShoeList)
}
refreshShoeList = res => this.setState({ shoes: res.data.shoes })
render() {
// some list of shoes
}
}Если мы хотим, чтобы компонент обуви захватить новый список обуви, нам нужно обновить реквизиты, которые мы отправляем ему. В противном случае он не увидит необходимости обновлять.
На самом деле, как это написано, Shoeleist никогда не будет обновляться, так как мы не зависят от реквизитов для рендеринга. Давайте исправить это.
Вызвать дочерний компонент для повторного визуализации
Чтобы заставить дочерний компонент повторно рендеринга – и сделать новый вызов API – нам нужно будет пройти опоры, который изменится, если изменилось, что цвет пользователей изменилось.
Для этого мы добавим метод в setnewcolor. :
[...]
setNewColor = color => {
this.updateUser({color}).then(res => {
this.refreshUser(res);
this.refreshShoeList();
})
}
refreshShoeList = () =>
this.setState({refreshShoeList: !this.state.refreshShoeList})
[...]
Это простой выключатель, который мы можем перевернуть. Я сохранил вещи максимально простым, но в производстве мы хотели бы убедиться, что цвет, который мы установим, отличается от цвета, который мы имели раньше. В противном случае, чтобы обновить нечего.
Сейчас в Shoeleist :
componentWillReceiveProps(props) {
const { refresh, id } = this.props;
if (props.refresh !== refresh) {
this.fetchShoes(id)
.then(this.refreshShoeList)
}
}Если вы проходите только Обновление а затем переключаться на основе этого логика, компонент будет просто обновлять навсегда и всегда и всегда.
Нам нужно убедиться, что коммутатор перевернулся только один раз – поэтому мы просто проверим, что реквизиты, находящиеся различными, чем реквизиты, которые мы имели раньше. Если они отличаются, мы сделаем новый вызов API, чтобы получить новый список обувь.
А также Boom – наш дочерний компонент был «вынужден» обновлять.
ComponentWillReceiveProps
Стоит занимать еще одну минуту, чтобы просмотреть то, что происходит в этом последнем кусочке кода. В ComponentWillReceiveProps У нас есть единственная возможность просматривать новые реквизиты, поскольку они входят и сравнивают их с предыдущими реквизитами.
Здесь мы можем обнаружить изменения (например, в Обновить ), и мы также можем сделать чеки для новых реквизитов (например, например Обновить изначально undefined ).
Этот метод реагирования является очень мощным способом манипулирования и изучения реквизит Отказ
Оригинал: “https://www.freecodecamp.org/news/force-refreshing-a-react-child-component-the-easy-way-6cdbb9e6d99c/”