React:自定义钩子中的石板状态值

React: Slate state value in a custom hook

提问人:Abhinandan Khilari 提问时间:8/18/2023 最后编辑:Abhinandan Khilari 更新时间:8/18/2023 访问量:37

问:

我有一个自定义的 react 钩子,如下所示,返回一个方法useSearchAllLocations()fetchLocations()

export const useSearchAllLocations = (isFilterSelected = false) => {
  console.log('Outer isFilterSelected ', isFilterSelected);
  const fetchLocations = useCallback(
    async () => {
      console.log('Inner isFilterSelected ', isFilterSelected);
      // Some async functionality...
    },
    [isFilterSelected],
  );
  return { fetchLocations };
};

我正在这样的组件中使用这个钩子

const isFilterSelected = useSelector(isFilterSelectedSelector);
const { fetchLocations } = useSearchAllLocations(isFilterSelected);

在组件中,有一个 onSearch 函数,该函数具有调用。fetchLocations()

  const onSearch = () => {
    // Some code...
    fetchLocations();
  };

该函数在按钮单击事件上调用,并且还作为子组件传递。然后,子组件对某些用户事件调用该函数,从而导致调用 。onSearchproponSearchfetchLocations()

当组件中的 isFilterSelected 发生更改时,钩子会按预期重新触发,并在日志中的钩子中显示 isFilterSelected 参数的正确值 -console.log('Outer isFilterSelected ', isFilterSelected);

但是,对于来自日志中的组件的调用,变量的值似乎已经过时 - 并且与外部日志不匹配。为什么日志中的 isFilterSelected 值过时 -fetchLocations()console.log('Inner isFilterSelected ', isFilterSelected);console.log('Inner isFilterSelected ', isFilterSelected);

我已经很好地提供了作为依赖项,甚至尝试删除包装器,但问题仍然存在。isFilterSelecteduseCallbackuseCallback

我知道在最初调用钩子时会创建一个闭包,因此其中方法中当时 的值是初始值,即 .但是,当组件中的值发生更改时,钩子的重新调用难道不应该根据词法范围用方法的新闭包更新以前的闭包吗?useSearchAllLocationsisFilterSelectedfetchLocationsfalseisFilterSelecteduseSearchAllLocationsfetchLocations

JavaScript ReactJS React-Redux 闭包

评论

0赞 Nick Parsons 8/18/2023
你能分享一下如何/在哪里打电话吗?fetchLocations
0赞 Abhinandan Khilari 8/18/2023
@NickParsons,现在在问题中添加了详细信息
1赞 Nick Parsons 8/18/2023
谢谢,并确保,是记住了,还是传递给自己的电话?此外,子组件是否被记住(即:它是否偶然被包裹)。我想我正在尝试查看是否调用了正确的“版本”,我想您可以通过登录内部并查看它是否记录了新值或旧值来检查。onSearchuseCallback()React.memo()onSearchfetchLocationsisFilterSelectedonSearch

答: 暂无答案