我知道在渲染组件时我可以传递props
。我也知道getInitialState
方法。但问题是,getInitialState
并不是很有帮助,因为我的组件不知道它的初始状态。我做。所以我想在渲染时传递它。
像这样的东西(伪代码):
React.render(<Component initialState={...} />);
我知道我可以使用prop
作为初始状态,但这有点像反模式。
我该怎么办?
编辑清晰度
想象一下,我有一个CommentList
组件。到我第一次渲染它时,初始状态对应于我数据库中当前注释的快照。由于用户包含评论,此列表将会更改,这就是为什么它应该是state
而不是props
。现在,为了呈现注释的初始快照,我应该将它传递给CommentsList
组件,因为它无法知道它。我的困惑是,我看到传递这些信息的唯一方法是通过props
,这似乎是一种反模式。
答案 0 :(得分:15)
只有永久性组件才能在getInitialState
中使用道具。如果同步是您的目标,getInitialState
中的道具是反模式。 getInitialState
仅在首次创建组件时调用,因此可能会引发一些错误,因为事实来源并不是唯一的。 Check this answer。
使用从父传递下来的props来生成状态 getInitialState经常导致重复“真相来源”,即 真实数据在哪里。尽可能在运行中计算值 确保他们以后不会失去同步并导致 维修麻烦
你仍然可以这样做:
getInitialState: function() {
return {foo: this.props.foo}
}
因为它们将成为您应用的默认道具。但只要你使用prop来设置一个可能不会改变的值,你就可以在render
函数中使用相同的prop。
<span>{this.props.foo}</span>
此道具不会被修改,因此每次调用render
时都不会出现问题。
编辑回答:
在这种情况下,您的初始状态不应该是prop,应该是填充注释列表的ajax调用。
答案 1 :(得分:3)
使用从父传承下来的道具来生成
getInitialState
中的状态经常会导致真实来源的重复,即真实数据所在的地方。在可能的情况下,即时计算值,以确保它们以后不会失去同步并导致维护问题
和
但是,如果您明确指出同步不是此处的目标,那么
因此,如果您的道具包含value
和initialValue
,那么很明显后者是用于初始化,并且没有混淆。
有关代码示例,请参阅the React docs。
答案 2 :(得分:1)
如果您了解状态,那么我倾向于认为您渲染的组件并非真正控制它。 React的想法是,任何特定的州都只生活在一个地方。
答案 3 :(得分:0)
在看到其他答案并稍微研究一下后,我得出了这样的结论:
如果要在客户端(已编译或未编译)中呈现React(这是默认方法),则应尝试从组件内部进行额外的Ajax调用以获取初始状态。也就是说,不要使用props
。它更干净,不易出错。
但是,如果你在服务器(Node.js或ReactJs.NET)中进行渲染,那么没有理由为每个请求进行额外的Ajax调用..此外,它不是SEO友好的。您希望整个页面是您的请求(包括数据)的结果。因此,正如@RandyMorris指出的那样,在这种情况下,只要将道具作为初始状态,就可以使用道具作为初始状态。也就是说,没有同步。