javascript - React Hooks useEffect,添加依赖触发死循环

标签 javascript reactjs react-hooks use-effect

在我的 useEffect 中,我有一个 Prop 依赖项 (setIsValid)。当我将此依赖项添加到 useEffect 时,它会陷入无限循环。

调用子组件时为父级:

const setIsValid = (bool) => {
  const tmpStateCopy = Object.assign({}, state);
  tmpStateCopy.isValid = bool;

  setState(tmpStateCopy);
};

return <Child
  setIsValid={setIsValid}
/>

在子组件中:

const { setIsValid } = props;

const [state, setState] = useState({
  transformations: [],
  duplicateIndexes: []
});

const { transformations, duplicateIndexes } = state;

useEffect(() => {
  const invalids = transformations.find(x => (x.value === '' || x.replaceWith === ''));
  const hasDuplicates = duplicateIndexes.length > 0;
  const isValid = ((invalids === undefined) && (transformations.length > 0) && !hasDuplicates);

  setIsValid(isValid)

  console.log('got triggered');
}, [state]);

这样代码可以工作,但我总是会收到警告。

我想要的是,当状态中的值之一发生变化(转换/重复索引)时,始终会触发验证。

通过添加 props 中的 setIsValid() 函数,它可以无限运行。

警告看起来像这样:

./src/components/UI/integrationBuilder/layoutElements/transformer/modules/ifModules/ifModule.js
  Line 103:  React Hook useEffect has missing dependencies: 'duplicateIndexes.length', 'setIsValid', and 'transformations'. Either include them or remove the dependency array  react-hooks/exhaustive-deps

我的问题是,如何在不收到此警告的情况下保持相同的逻辑?

最佳答案

因为,当状态发生变化时,您将调用效果。 transformations 和 duplicateIndexes 已经被考虑了。为避免警告,您可以在 useEffect

中移动 destructure
const { setIsValid } = props;

const [state, setState] = useState({
  transformations: [],
  duplicateIndexes: []
});



useEffect(() => {
  const { transformations, duplicateIndexes } = state;
  const invalids = transformations.find(x => (x.value === '' || x.replaceWith === ''));
  const hasDuplicates = duplicateIndexes.length > 0;
  const isValid = ((invalids === undefined) && (transformations.length > 0) && !hasDuplicates);

  setIsValid(isValid)

  console.log('got triggered');
}, [state]);

此外,将 setIsValid 视为 useEffect 的依赖项,你不能这样做,因为在每次渲染时都会为它创建一个新函数,除非你稍微重构一下代码,否则它会导致 useEffect 一次又一次地运行。

const setIsValid = useCallback((bool) => {
  setState(prev =>  Object.assign({}, prev, {isValid: bool});
}, []);

现在您可以将 setIsValid 设置为依赖项。

关于javascript - React Hooks useEffect,添加依赖触发死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56543368/

相关文章:

reactjs - 在 React 组件中结合 useState 钩子(Hook)

javascript - 如何在React js中找出带有键的数组元素

javascript - JQuery 一旦创建就附加到父级

reactjs - 如何在 Semantic-UI-React 中将 Modal 居中?

reactjs - 如何访问缓存以使用 React Query 显示数据?

python - Django 和 React 中的 TemplateDoesNotExist

javascript - 如何在javascript中获取特定时间的日期

javascript - IONIC 确保服务已加载

javascript - 汉堡包图标未在 Vuetify 2.0 中显示

javascript - Angular2 - 如何使用 console.log 查看模型驱动的表单数据