在父

时间:2018-05-30 11:28:43

标签: reactjs

我有一个有趣的用例,用于存储对属于子组件的函数的引用。另外,我使用React的新上下文API将数据传递给深层嵌套的子组件。

我找到了许多解决类似问题的其他答案,但它们与我的用例完全不符。请参阅herehere

这是高级问题:

  1. 名为Provider的{​​{1}}组件包含传递给<Parent />所有<Child />组件的逻辑和状态。
  2. Consumers个组件会收到一个Child道具,它实际上是该特定verify的各种类型的验证函数。每次调用Child都会根据来自verify的状态变化生成verificationResult
  3. 重要的是,必须通知所有其他Parent组件或了解其兄弟姐妹生成的每个Child的结果。
  4. 为了让事情变得更有趣,我不希望将每个孩子的所谓verificationResult存储在父母的状态中,如果我不需要,因为它本质上是派生状态,并且可以在verificationResult Parent中计算。
  5. 解决方案1:

    将每个孩子的render()存储在verificationResult中。这可以通过等待每个Parent Child中的相关值进行更改来完成,如下所示:

    componentDidUpdate()

    注意:

    • // Child.js ... componentDidUpdate(pp) { const { hash, value, verify, setVerificationResult } = this.props // this check is a little more involved but // the next line captures the gist of it. if(pp.value[pp.hash] !== value[hash]) { setVerificationResult(hash, verify(value[hash], value)) } } ... // Parent.js ... setVerificationResult(hash, result) { this.setState(({ verificationResults }) => ({ ...verificationResults, [hash]: result })) } ... this.props.value是从this.props.setVerificationResult收到的,这是一个上下文Parent,而

    • Providerthis.props.hash会直接传递给this.props.verify组件。

    Child抓取this.props.hash此特定value需要了解的部分。

    Child

    解决方案1符合反应鼓励的单向数据流原则。但是我对此解决方案有2个问题。首先,我必须存储可以导出的本质状态。其次,调用// MyComponent.js render() { return ( ... <Child hash="someHash" verify={(value, allValues) => { return value === 42 && allValues["anotherHash"] === 42 }} render={({ verificationResults }) => ( <pre>{JSON.stringify(verificationResults["someHash"], null, ' ')}</pre> )} /> ... ) 会导致不必要的重新渲染。更不用说setVerificationResult()

    中的其他逻辑了

    解决方案2

    接下来的选项看起来像这样。请注意,我尝试过只显示重要位:

    componentDidUpdate

    请注意,在第二个解决方案中,我没有存储任何其他状态,因为它刚刚计算出来。但是我存储对子组件的函数的引用。

    有谁可以告诉我为什么使用解决方案2?关于如何使这项工作的任何其他建议?

    附加说明:

    • 为什么不直接将验证功能传递给Parent?我可以,但它不会制作一个非常干净的API。
    • 您可以假设我在卸载等时执行必要的清理工作
    • 问题比这里显示的更复杂 - 事实上,深层嵌套的消费者与本地&#34;本地&#34;提供商&#34;分裂&#34;价值观和逻辑,直到他们达到所谓的叶子组件,而一个&#34;大师&#34; Provider用作根节点,包含组件层次结构中的所有组件状态和逻辑。

0 个答案:

没有答案