Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript React useEffect:返回函数中的setState未及时更新状态_Javascript_Reactjs_React Hooks_Use Effect - Fatal编程技术网

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之后和注册之前的值非常感谢!我对他不太熟悉。我得去看看