【问题标题】:React hooks : useMemo and useEffect has a Missing dependency when we are trying to call a functionReact 钩子:当我们尝试调用函数时,useMemo 和 useEffect 有一个 Missing 依赖项
【发布时间】:2020-05-13 20:58:02
【问题描述】:

triggerData函数用于多个函数。所以,如果我将函数放在useEffect 内以避免丢失依赖项,那么我不能在useEffect 之外调用triggerData,即buildData。如何避免丢失依赖项错误?

useEffect(()=>{
 //api call
  if(something){
    triggerData(state, props);
  }
}[values]);

const triggerData = (state, props) => {
  return values + 1;
}

const buildData = () => {
  triggerData(state, props);
}

React Hook useEffect 缺少一个依赖项:'triggerData'。要么包含它,要么移除依赖数组 react-hooks/exhaustive-deps

当我在useEffect 中添加triggerData 时,出现以下错误。 triggerData 在定义之前使用 no-use-before-define

useEffect(()=>{
     //api call
      const triggerData = (values) => {
        return values + 1;
      }
      if(something){
        triggerData(values);
      }
    }[values, triggerData]);

    const buildData = () => {
      triggerData(values);
    }

【问题讨论】:

  • 您的触发器数据是否使用了 state 或 prop 中的任何内容?
  • 问题不清楚,有没有可生产的最小例子?
  • @AmitChauhan 是的,它可以使用任何东西。
  • @DennisVash 我已经更新了这个问题,请检查

标签: javascript reactjs react-hooks eslint


【解决方案1】:

如果您想在 useEffect 之外使用 triggerData,您可以使用另一个名为 useCallback 的钩子。

您不需要传递 props 和 state 来运行,因为它可以从父级的范围中使用。

const triggerData = useCallback(() => {
  return values + 1;
}, [ /* pass required depedencies here */])

useEffect(()=>{
 //api call
  if(something){
    triggerData(); // don't pass state and props here
  }
}[values, triggerData]);

const buildData = () => {
  triggerData(); // dont pass state and props here
}

【讨论】:

  • 我尝试了上面的答案,但它说triggerDatauseEffect()末尾定义之前已使用
  • 你需要在useEffect之前而不是之后定义triggerData
  • 我做了建议的更改,现在一个 api 被无限次调用
  • 你传递的依赖是什么?
  • 局部变量
【解决方案2】:

如果您只在钩子内使用triggerData,那么我更愿意在useEffect 钩子内声明函数。喜欢:

useEffect(()=>{
  //api call
  const triggerData = (values) => {
     return values + 1;
  }
  if(something){
    triggerData(values);
  }
}, [values]);

你错过了什么。您我们在钩子内声明triggerData 并将其传递给useEffect,这就是它抱怨已声明函数的原因。

如果你真的想在 useEffect 之外声明 triggerData 以在其他地方使用它,你可以这样做:

useEffect(()=>{
 //api call
  if(something){
    triggerData(state, props);
  }
}, [values, triggerData]);

const triggerData = useCallback((state, props) => {
  return values + 1;
}, [state, props]);


const buildData = () => {
  triggerData(state, props);
}

在使用中useCallback 提供准确的参数以根据场景最小化调用它。假设您正在从triggerData 的状态访问value。然后你可以传递state.value 而不是整个state

希望这对你有用。

【讨论】:

  • 但是,如何从 builddata 访问 triggerdata?
  • 在这种情况下,useEffect 将在每次渲染后运行。
  • @AmitChauhan 谢谢。我知道useCallback 并相应地更新了我的答案。
猜你喜欢
  • 2020-06-03
  • 2020-12-19
  • 2021-09-29
  • 2021-01-28
  • 2020-01-23
  • 1970-01-01
  • 2023-02-07
  • 2020-04-05
  • 2019-10-08
相关资源
最近更新 更多