ReactJS - 我可以在renderComponent之后立即调用setState吗?

时间:2014-07-22 02:03:35

标签: javascript facebook reactjs

我正在将React用于某些客户端组件。在某些情况下,组件不知道它们的初始状态,所以我需要一种方法来渲染组件并在外部为它提供初始状态。

renderComponent有一个回调方法:

ReactComponent renderComponent(
  ReactComponent component,
  DOMElement container,
  [function callback]
)

显然:

  

如果提供了可选的回调,它将在之后执行   组件被渲染或更新。

这很好,但是如果我在该回调中调用setState,在组件重新渲染之前,您仍会看到初始(错误)渲染一瞬间。

所以我的问题是,我可以这样做:

var myComponent = React.renderComponent(...);
myComponent.setState({...});

...安全?我可以假设renderComponent至少以同步的方式创建了组件的后备实例,那么有什么东西可以调用setState吗?

这种模式似乎在我的临时测试中使用本地主机服务器,但我想知道这是否有点类似于使用JS修改DOM而不等待ol'文档就绪信号(即,倾向于不一致的行为)。

另一方面,我可以将默认状态对象作为prop传递,然后构建组件,以便检查该prop,并在componentWillMount或其中某种情况下填充自己的状态。这会更多地在The React Way的范围内吗?

1 个答案:

答案 0 :(得分:5)

  

另一方面,我可以将默认状态对象作为prop传递,然后构建组件,以便检查该prop并在componentWillMount中填充自己的状态或者某些东西。这会更多地在The React Way的范围内吗?

是。应将状态视为组件的私有实例变量;你永远不应该从组件外部访问它们,但正如将选项传递给对象构造函数一样,在props中指定组件初始状态的某些部分是有意义的。 React的不受控制的组件(defaultValue)就是这种模式的一个例子。

如果可能的话,通常可以更好地保持状态存储得更高并防止它失去同步,就像React的受控组件一样。您可以通过让您的组件进行onChange回调来执行此操作,然后使用该回调来更新应用程序的真实来源。

另一个注意事项:您通常应使用getInitialState代替componentWillMount;目前允许使用后者,但将来可能会弃用。