我期望状态在道具更改时重新加载,但这不起作用,并且user
变量在下次useState
调用时不会更新,这是怎么回事?
function Avatar(props) {
const [user, setUser] = React.useState({...props.user});
return user.avatar ?
(<img src={user.avatar}/>)
: (<p>Loading...</p>);
}
Answers:
传递给useState的参数是初始状态,就像在类组件的构造函数中设置状态一样,并且不用于在重新渲染时更新状态
如果您想在道具变更时更新状态,请使用useEffect
钩子
function Avatar(props) {
const [user, setUser] = React.useState({...props.user});
React.useEffect(() => {
setUser(props.user);
}, [props.user])
return user.avatar ?
(<img src={user.avatar}/>)
: (<p>Loading...</p>);
}
React.useEffect
每次使用来设置初始状态。
我们用来useState
为变量设置初始值的功能组件,如果我们通过prop传递初始值,它将始终设置相同的初始值,直到您不使用useEffect
钩子,
例如你的情况,这将做你的工作
React.useEffect(() => {
setUser(props.user);
}, [props.user])
传递给useEffect的函数将在将渲染提交到屏幕后运行。
默认情况下,效果会在每个完成的渲染之后运行,但是您可以选择仅在某些值更改后才触发效果。
React.useEffect(FunctionYouWantToRunAfterEveryRender)
如果仅将一个参数传递给useEffect,则它将在每次渲染后运行此方法,您可以FunctionYouWantToRunAfterEveryRender
通过将第二个参数传递给useEffect来决定何时触发该方法
React.useEffect(FunctionYouWantToRunAfterEveryRender, [props.user])
如您所知,我正在传递[props.user]现在useEffect
仅FunctionYouWantToRunAfterEveryRender
在props.user
更改时会触发此功能
我希望这有助于您的理解,让我知道是否需要任何改进,谢谢
在react world中,在这种情况下,您应该在componentWillRecieveProps(nextProps)函数中更新状态。