ReactJs:如何在渲染组件时传递初始状态?

时间:2015-01-13 17:47:20

标签: javascript reactjs

我知道在渲染组件时我可以传递props。我也知道getInitialState方法。但问题是,getInitialState并不是很有帮助,因为我的组件不知道它的初始状态。我做。所以我想在渲染时传递它。

像这样的东西(伪代码):

React.render(<Component initialState={...} />);

我知道我可以使用prop作为初始状态,但这有点像反模式。

我该怎么办?

编辑清晰度

想象一下,我有一个CommentList组件。到我第一次渲染它时,初始状态对应于我数据库中当前注释的快照。由于用户包含评论,此列表将会更改,这就是为什么它应该是state而不是props。现在,为了呈现注释的初始快照,我应该将它传递给CommentsList组件,因为它无法知道它。我的困惑是,我看到传递这些信息的唯一方法是通过props,这似乎是一种反模式。

4 个答案:

答案 0 :(得分:15)

只有永久性组件才能在getInitialState中使用道具。如果同步是您的目标,getInitialState中的道具是反模式。 getInitialState仅在首次创建组件时调用,因此可能会引发一些错误,因为事实来源并不是唯一的。 Check this answer

Quoting documentation:

  

使用从父传递下来的props来生成状态   getInitialState经常导致重复“真相来源”,即   真实数据在哪里。尽可能在运行中计算值   确保他们以后不会失去同步并导致   维修麻烦

你仍然可以这样做:

getInitialState: function() {
   return {foo: this.props.foo}
}

因为它们将成为您应用的默认道具。但只要你使用prop来设置一个可能不会改变的值,你就可以在render函数中使用相同的prop。

<span>{this.props.foo}</span>

此道具不会被修改,因此每次调用render时都不会出现问题。

编辑回答:

在这种情况下,您的初始状态不应该是prop,应该是填充注释列表的ajax调用。

答案 1 :(得分:3)

引用the React docs

  

使用从父传承下来的道具来生成getInitialState中的状态经常会导致真实来源的重复,即真实数据所在的地方。在可能的情况下,即时计算值,以确保它们以后不会失去同步并导致维护问题

  

但是,如果您明确指出同步不是此处的目标,那么

因此,如果您的道具包含valueinitialValue,那么很明显后者是用于初始化,并且没有混淆。

有关代码示例,请参阅the React docs

答案 2 :(得分:1)

如果您了解状态,那么我倾向于认为您渲染的组件并非真正控制它。 React的想法是,任何特定的州都只生活在一个地方。

答案 3 :(得分:0)

在看到其他答案并稍微研究一下后,我得出了这样的结论:

如果要在客户端(已编译或未编译)中呈现React(这是默认方法),则应尝试从组件内部进行额外的Ajax调用以获取初始状态。也就是说,不要使用props。它更干净,不易出错。

但是,如果你在服务器(Node.js或ReactJs.NET)中进行渲染,那么没有理由为每个请求进行额外的Ajax调用..此外,它不是SEO友好的。您希望整个页面是您的请求(包括数据)的结果。因此,正如@RandyMorris指出的那样,在这种情况下,只要将道具作为初始状态,就可以使用道具作为初始状态。也就是说,没有同步。