javascript - 如何通过组合在 React 组件之间共享 hooks

标签 javascript reactjs inheritance composition

我有一个更高阶的组件,它为一组类似的组件添加了通用功能。出于讨论的目的,我将调用 HOC Wrapper 和子级 CompACompB 等。

Wrapper 已connected,并处理与 Redux 存储的交互以及 API 交互。它发送的数据由包装的子级拥有,因此我通过 props 将 API/调度函数从 Wrapper 传递给子级。现在,CompA、CompB 等都有一个在 Wrapper 中定义一次的 props.doStuff 函数。

这没问题,但是决定何时调用 doStuff 函数的事件是 CompA、CompB 等中本地状态的更改。因此,我复制/粘贴相同的 children 之间使用Effect...

function CompA(props) {
  const [data, setData] = useState({});
  useEffect( () => {
    if (props.doStuffNow === true) {
      props.doStuff(data);
    }
  }, [props.something]);
  return <div>CompA</div>
}

function CompB(props) {
  const [differentData, setDifferentData] = useState({});
  useEffect( () => {
    if (props.doStuffNow === true) {
      props.doStuff(differentData);
    }
  }, [props.something]);
  return <div>CompB</div>
}

这不是 D.R.Y.我真的很想将useEffect等移动到Wrapper类中,并允许CompA和CompB扩展该类。

但是,React documentation strongly recommends composition over inheritance使用高阶组件。链接的文章甚至说他们从未遇到过继承比组合更好的情况。

那我错过了什么?有没有办法让我使用 HOC 使这段代码干燥?我可以通过 props 传递 useEffect 吗?如果我只是跟随我的直觉,天会塌下来吗:class CompA extends Wrapper...??

最佳答案

创建一个名为 useDoStuff 的新钩子(Hook),它执行 useEffect 钩子(Hook),然后在需要的地方执行 useDoStuff(props)

function useDoStuff(props) {
  const [data, setData] = useState({}):
  useEffect(...)
}

function CompA (props) {
  useDoStuff(props);
  ...
}

function CompB (props) {
  useDoStuff(props);
  ...
}

关于javascript - 如何通过组合在 React 组件之间共享 hooks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62380151/

相关文章:

C++ 继承具有多个参数的构造函数 [作业]

asp.net - 继承一个类以删除属性并更改方法逻辑

Javascript:如何检查一个 css 样式然后更改另一个 css 样式?

javascript - JavaScript 准备好可视化大型数据集了吗?

javascript - 使用 node.js 和自然语言处理来处理多个词组

javascript - ReactJS:操作 redux 后不重新渲染

reactjs - React.js - ForEach 作为一流组件?

javascript - 如何根据 bool 属性对对象数组进行排序?

javascript - 如何在html标签中使用useState?

c++ - 是否可以在父类中引用子类?