我正在使用 useState
来管理 状态,它工作正常。但是当我在 itseft 内部返回状态时,它总是初始值
import react, {useState} from 'react'
const MyComponent = () => {
const [myState, setMyState] = useState({
value: 'initial value',
setValue: (newValue) => {
setMyState({...myState, value: newValue})
console.log(myState.value) //<--always is 'initial value'
}
})
return(
<>
<p>{myState.value}</p> //<-- it's working fine
<input value={myState.value} onChange={(e) => myState.setValue(e.target.value)} /> //<--working fine too
</>
)
}
我希望 console.log
是输入值,但实际输出始终是初始值
原文由 mikenlanggio 发布,翻译遵循 CC BY-SA 4.0 许可协议
第一次运行组件函数时,
setValue
函数捕获myState
的 初始 值。第二次运行时,您复制了setValue
函数——但这是捕获了myState
初始 值的函数。它从不更新。由于函数永远不会改变,所以您不应该首先将它放在
useState()
中。您可以单独定义函数。现在,每次运行组件函数时都会创建一个新的
setValue
副本。捕获变量时,可以使用useCallback()
进行优化;如果值没有改变,React 将重用该函数的旧副本。正如 Shubham Khatri 所提到的,在这种情况下有一种更快更好的方法:使用
setState
的函数形式。不过,这三种方法中的任何一种都可以使用;对于大多数用例,它们都可以正常工作并表现得足够好。
根据评论,您正在尝试创建一个通过上下文传递下来的对象。一种方法是在单独的步骤中创建上下文对象,类似于我们创建回调函数的方式。这一次,我们使用
useMemo
,它类似于useCallback
但适用于任何类型的对象。