Я ожидаю, что состояние перезагрузится при изменении реквизита, но это не работает, и user
переменная не обновляется при следующем useState
вызове, что не так?
function Avatar(props) {
const [user, setUser] = React.useState({...props.user});
return user.avatar ?
(<img src={user.avatar}/>)
: (<p>Loading...</p>);
}
reactjs
react-hooks
виталистер
источник
источник
React.useEffect
для установки начального состояния каждый раз.Функциональные компоненты, в которых мы используем
useState
для установки начальных значений нашей переменной, если мы передаем начальное значение через реквизиты, оно всегда будет устанавливать одно и то же начальное значение, пока вы не используетеuseEffect
ловушку,например, в вашем случае это сделает вашу работу
React.useEffect(() => { setUser(props.user); }, [props.user])
Функция, переданная в useEffect, будет запущена после фиксации рендеринга на экране.
По умолчанию эффекты запускаются после каждого завершенного рендеринга, но вы можете активировать их только при изменении определенных значений.
если вы передадите только один аргумент для useEffect, он будет запускать этот метод после каждого рендеринга, вы можете решить, когда его запускать
FunctionYouWantToRunAfterEveryRender
, передав второй аргумент в useEffectкак вы заметили, я передаю [props.user], теперь
useEffect
этаFunctionYouWantToRunAfterEveryRender
функция будет запускаться только приprops.user
измененииНадеюсь, это поможет вам понять, дайте мне знать, если требуются какие-либо улучшения, спасибо
источник
Переданный параметр
React.useState()
- это только начальное значение для этого состояния. React не распознает это как изменение состояния, а только устанавливает значение по умолчанию. Сначала вы захотите установить состояние по умолчанию, а затем условно вызватьsetUser(newValue)
, которое будет распознано как новое состояние, и повторно отрендерить компонент.Я бы порекомендовал с осторожностью обновлять состояние без каких-либо условий, чтобы оно не обновлялось постоянно и, следовательно, повторно рендерилось каждый раз при получении реквизита. Вы можете захотеть перенести функциональность состояния в родительский компонент и передать состояние родительского компонента этому Аватару в качестве опоры.
источник
Согласно документации ReactJS о хуках :
Единственное ваше взаимодействие здесь должно происходить при смене реквизита, которая, похоже, не работает. Вы можете (все еще согласно документу) использовать componentDidUpdate (prevProps) для упреждающего отслеживания любых обновлений для реквизита.
PS: У меня недостаточно кода, чтобы судить, но не могли бы вы активно установить User () внутри своей функции Avatar (props)?
источник
В таких случаях в мире реакции вы должны обновить свое состояние в функции componentWillRecieveProps (nextProps).
источник