javascript - 缺少依赖项 : 'prop' when calling `prop.function` in `useEffect` but no warning when reading `prop.variable`

标签 javascript reactjs eslint

当我将 prop.value 添加到 DependencyList 时,没有任何警告。

但是当我将 prop.func 添加到 DependencyList 时出现一个警告

React Hook useEffect has a missing dependency: 'prop'. Either include it or remove the dependency array. (react-hooks/exhaustive-deps)

DependencyList 中的变量和函数似乎不同,这是为什么?我应该将 prop 添加到 useEffect 中的 DependencyList 吗?

function Box(prop) {
  useEffect(() => {
    console.log(prop.value);
  }, [prop.value]);

  useEffect(() => {
    prop.func();
  }, [prop.func]);
     //^  React Hook useEffect has a missing dependency: 'prop'. Either include it or remove the dependency array. (react-hooks/exhaustive-deps)

  return <div></div>;
}

function App() {
  return (
    <Box
      func={() => {
        console.log("function");
      }}
      value={"value"}
    ></Box>
  );
}

https://codesandbox.io/s/react-useeffect-issue-6m5kxg?file=/src/index.js

最佳答案

linter 会提示,因为 prop.func() 是一个在 prop 对象上下文中运行函数的方法调用。考虑一下

<Box
  func={function() {
    console.log(this.value);
  }}
  value={"value"}
/>

这将记录“value”,并且可能应该在prop.value更改时再次记录,而不仅仅是在prop.func更改时。您可以通过在效果中不使用方法语法来解决此问题:

useEffect(() => {
  const f = prop.func;
  f();
}, [prop.func]);

useEffect(() => {
  const {func} = prop;
  func();
}, [prop.func]);

const {func} = prop;
useEffect(() => {
  func();
}, [func]);

关于javascript - 缺少依赖项 : 'prop' when calling `prop.function` in `useEffect` but no warning when reading `prop.variable` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76810218/

相关文章:

javascript - 使用 setTimeout 打破长时间运行的功能以允许事件处理

javascript - 在 ReactJS 中渲染一对随机选择的对象(某些属性不匹配)作为扑克牌

javascript - 未捕获的类型错误 : Cannot read property 'props' of null

javascript - Reactjs - 未捕获的类型错误 : Cannot read property 'map' of undefined

javascript - Grunt-eslint 并启用 `--fix` 标志以自动修复违规

java - 数组中元素的梯度分布

javascript - 如何将悬停图像与 twitter bootstrap 下拉菜单一起使用

javascript - 动态地将 Javascript 对象存储在另一个对象中

javascript - JavaScript 上的 ESLint 错误 (Unexpected token ...) 简化为字典

reactjs - 使用 eslint-config-airbnb 后出现 "tsx"错误,缺少文件扩展名 "./reducer"