【问题标题】:Using React, how do you pass a function from a parent component to a child component and run it in the useEffect hook?使用 React,如何将一个函数从父组件传递给子组件并在 useEffect 挂钩中运行?
【发布时间】:2020-01-31 03:56:51
【问题描述】:

我正在使用 React 将一个函数从父组件传递给子组件,并尝试在 useEffect() 挂钩中运行它。

家长

function Parent(props) {

  function alertMe() {
    alert('me');
  }

  render (
    <div>
      <Child alertMe={alertMe} />
    </div>
  );
}

儿童

function Child(props) {

  const { alertMe } = props;

  useEffect(() => {
    alertMe();
  }, [alertMe]);

  render (
    <div>
      // stuff
    </div>
  );
}

如果我将 alertMe 作为子组件的 useEffect() 中的依赖项删除,它只会触发一次,但我会收到警告:

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

alertMe 函数在加载时在 Parent 组件中定义一次,所以我不明白为什么它会在 Child 组件中无休止地运行。它不会像状态一样改变。

如何将alertMe 添加为useEffect() 依赖项但仍运行一次?

【问题讨论】:

  • useEffect的第二个参数数组中删除它。如果你给 useEffect 一个空数组作为第二个参数,它只会在挂载时运行。
  • @skellertor 是的,但后来我收到了警告。

标签: reactjs dependency-injection use-effect


【解决方案1】:

看,您的 Parent 每次重新渲染时都会重新声明 alertMe。由于 alertMeuseEffect 中的 Child 引用不同,因此会检测到并重新运行。

最好不要与useEffect 的依赖关系(它们是有原因的!)。让我们确保您的 alertMe 引用相同:

function Parent(props) {

  const alertMe = useCallback(() => {
    alert('me');
  });

  render (
    <div>
      <Child alertMe={alertMe} />
    </div>
  );
}

想想 useEffect 和 hooks 世界中的 componentDidUpdate 的依赖关系列表。最好让组件与 props 保持同步,而不是忽略外部的变化。

【讨论】:

  • 你将如何向 alertMe 传递额外的参数?例如&lt;Child alertMe={(index) =&gt; alertMe(index)} /&gt;
  • 答案取决于这些参数的来源、是否可以稍后更改以及它们是在什么层定义的 - ParentChild
猜你喜欢
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
相关资源
最近更新 更多