Javascript React useEffect:返回函数中的setState未及时更新状态
我在这里举了一个例子: 我正在制作一个选项卡式界面,当从一个组件切换到另一个组件时,组件应该首先通过Javascript React useEffect:返回函数中的setState未及时更新状态,javascript,reactjs,react-hooks,use-effect,Javascript,Reactjs,React Hooks,Use Effect,我在这里举了一个例子: 我正在制作一个选项卡式界面,当从一个组件切换到另一个组件时,组件应该首先通过useffect返回函数注销自身(从父状态清除一些值),然后重新注册自身(在父状态中设置一些值)。然而,清理工作似乎不起作用。i、 e.在寄存器功能启动之前,该值不会改变 查看控制台日志,第一次将空对象记录为初始值时。但当点击tab20时,记录的值显示注销前的状态 这里有什么问题 我期望发生的是: (应用程序加载)->控制台日志:{}->[register]aaa设置为1->(开关选项卡)->[
useffect
返回函数注销自身(从父状态清除一些值),然后重新注册自身(在父状态中设置一些值)。然而,清理工作似乎不起作用。i、 e.在寄存器功能启动之前,该值不会改变
查看控制台日志,第一次将空对象记录为初始值时。但当点击tab20时,记录的值显示注销前的状态
这里有什么问题
我期望发生的是:
(应用程序加载)->控制台日志:{}->[register]aaa设置为1->(开关选项卡)->[unregister]aaa设置为未定义->控制台日志:{aaa:未定义(但为1)}->[register]aaa设置为1
(应用程序加载)->控制台日志:{}->[register]aaa设置为1->(开关选项卡)->[unregister]aaa设置为未定义->控制台日志:{aaa:未定义(但为1)}->[register]aaa设置为1
实际上是:
(应用程序加载)->控制台日志(myVal):{}->[注册]aaa设置为1->(开关选项卡)->
使用(myVal={aaa:1})->[unregister]aaa将注册表中的闭包更新为undefined->console log:{aaa:1}(因为以前的闭包)
问题是,当您切换选项卡时,组件重新呈现,并且重新声明register
函数,该函数正在更新其闭包(myVal
)
要修复它(日志记录结果),请删除闭包:
const register = useCallback(name => {
setMyVal(prevState => {
console.log(prevState);
return { ...prevState, [name]: 1 };
});
}, []);
您希望什么日志记录?应该是{aaa:undefined},因为unregister被调用->控制台日志->注册,所以控制台日志应该显示unregister之后和注册之前的值非常感谢!我对他不太熟悉。我得去看看