connect()深度连接的组件依赖于顶部连接的组件

时间:2018-04-26 11:36:25

标签: javascript reactjs redux

以下内容似乎是控制台错误消息的原因,并且还不时地挂起我的应用程序,使其成为现在不可取消的。

如何重现行为

假设我们有一个容器组件CatContainer,如果属性cat存在于该状态,它将呈现其子项。状态中的“猫”是cats = { snowy: { height: 5, width: 10, weight: 50 }, muschi: { height: 1, width: 12, weight: 20 } }之类的对象。

对于cats对象中的每只猫,CatContainer呈现Cat组件,传递Cat的名称。

Cat组件连接到状态并将特定的cat从cat状态对象中拉出。

如果我现在从猫状态中移除一只猫,那么Cat-Component仍会从顶部接收cat-name,但该状态中的cat不再存在,从而产生异常。

我期望发生的事情是CatContainer以自上而下的方式确定性地呈现在Cat组件之前。

然而,这似乎没有发生,导致某些未定义的行为。

我尝试过的可能解决方案

  • Cat组件中的安全检查又称为“muschi in cats”。这有效,但这意味着我需要重写应用程序的大部分内容,我不惜一切代价避免这些内容。
  • 寻找一种根据嵌套级别使connect()传播状态的方法

我搜索了这个问题,发现了以下内容:

  1. https://github.com/reactjs/react-redux/issues/509 - 表示>我正在使用它的v5在某种程度上可以使react-redux传播状态变化自上而下,这将解决cat问题。
  2. How React rerenders tree, if both parent and child components are dependent from one Redux store prop? - 基本上和我在这里问的一样。
  3. 这两个链接都没有提出直接的解决方案,我相信,这个问题与每个使用react-redux的人都更加相关。

    对于任何磕磕绊绊的人,我有以下管道胶带解决方案,我真的不想实现。

    1. 换行连接并使其接受“nestingLevel”和“renderedNestingLevel”上下文道具
    2. 增加“nestingLevel”并在组件包装器组件更新后传递“renderedNestingLevel”
    3. 阻止在连接包装器的shouldComponentUpdate()函数中呈现,直到nestingLevel === renderedNestingLevel-1
    4. 祝你好运

0 个答案:

没有答案