为啥回调中的 React useState 依赖项为空?

Posted

技术标签:

【中文标题】为啥回调中的 React useState 依赖项为空?【英文标题】:Why is React useState dependency empty in callback?为什么回调中的 React useState 依赖项为空? 【发布时间】:2021-01-14 12:55:17 【问题描述】:

useCallback 中使用的依赖项以 null 的形式出现,即使它是在 useCallback 之外调用它时填充的。我什至尝试删除 useCallback 并在常规函数中使用 data 变量。它仍然为空。知道为什么会这样吗?

const [data, setData] = useState(null);

useEffect(() =>  //on page load
  const data = fetchData();
  setData(data)
, []);

const func = useCallback(async (payload) => 
    console.debug(data); //null
    if (data) //call api with payload
, [data]);

console.debug(data); //correct population of data

return <MyComponent onSubmit=func /> //passed to and called from second child down from here

【问题讨论】:

data = fetchData() 是异步函数吗? 获取她的一个很好的例子(通过钩子或类组件):reactjs.org/docs/faq-ajax.html 是的。这只是数据来源的快速演示。每次页面刷新时都存在正确的数据。它在 func() 中使用时不可用 所以当一切都发生在同一个组件中时,这是有效的。但是当我将函数传递给子 Modal 并从那里调用它时,它调用 func() 没有问题。但此时datafunc() 不可用。我看到了一些关于 forwardRefs 的 Hooks 错误,但我真的不明白为什么/如何使用这些错误(即使是文档)或者这是否会有所不同。我还尝试将data 传递给子模态,然后将其直接传递回func(payload, data) 以查看它是否会以这种方式捕获它。还是没有运气。 【参考方案1】:

这样做

    将数据作为 useState 中的参数传递给函数。没关系,我没有数据。所以我使用了 'abc'。

    useEffect(() =>  //on page load
     const data = 'abc';
     setData(data)
     func(data)
      , []);
    

    下一步将数据作为函数中的参数。

     const func = (data) => 
         console.log(data); //now it will have abc
     ;
    

【讨论】:

是的,这基本上就是我所做的。但我将func() 的主要部分移动到具有属性的子组件,以允许来自父级的额外回调【参考方案2】:

我能让它在所有情况下都能正常工作的唯一方法是将func() 向下移动到孩子...使用它的地方。并且因为data 用于父级和子级,所以我将它传递给子级,并在运行func() 后将对其的任何修改推回父级,因此修改后的data 可能是父级中的set() .

【讨论】:

以上是关于为啥回调中的 React useState 依赖项为空?的主要内容,如果未能解决你的问题,请参考以下文章

useReducer 和 useState

useState 中的变量未在 useEffect 回调中更新

不能在回调中调用 React Hook “useState”

带有回调的 React Hooks useState [重复]

react中的useState与setState的异步问题

React:如何使用功能性 usestate/useEffect 复制特定的组件类 setstate 回调示例?