getDefaultProps中的缓存道具是React中的反模式吗?

时间:2014-04-10 06:13:33

标签: javascript reactjs react-jsx

我正在编写一个复杂的反应应用程序并使用Cortex作为我的中心模型。皮质的哲学是它包装你的数据和更改数据,从根调用完整的重新渲染。这非常有用,尤其是当您有非分层视图改变状态并影响另一个时。

我面临的问题是在重新渲染时保持状态/道具。例如,我有一个特定的层次结构,如下所示:

<Page>
  <EditorCard>
     <Editor/>
     <PublishButton/>
  </EditorCard>
</Page>

EditorCard需要Editor的JavaScript实例,以便在点击Editor时对PublishButton进行更改(我在{{}}内使用外部库1}}公开了编辑方法)。因此,Editor上的Editor通过调用传递给它的函数将实例设置为ComponentDidMount上的prop

我的问题是,当我单击EditorCard时,我更改了皮质对象的值,导致从根重新渲染,我松开了PublishButton的道具(因为组件已经是挂起的Editor不再被调用。)

我处理这个问题的方法是缓存ComponentDidMount

getDefaultProps内,我的默认道具是:

EditorCard

并将编辑器实例保存为 getDefaultProps: function() { return { cachedData: {}, } },

这可以在多次重新渲染中保存道具。

这是如何使用this.props.cachedData.editor = editorInstance缓存的吗?在通过多次重新渲染保存道具时,我打破了这个黑客的一些核心反应规则?如果是这样,你能建议一个更好的结构吗?

1 个答案:

答案 0 :(得分:6)

不,getDefaultProps就是它的意思:获取默认道具,以防所有者未将这些道具传递给您。你可以说它是a = this.props.bla || 'hello';的简写。

话虽如此,如果我理解你的问题,我会看到三种方法来解决它。

  1. 在您的州内缓存该内容。道具由父母传递,并且应该从孩子内部读取,至少在香草React中。

  2. 为什么不把它放在componentDidMount中,而不是让道具传递逻辑?

  3. ref可让您抓取实例并直接调用其方法。