ReactJs:如何在渲染组件时传递初始状态?
ReactJs: How to pass the initial state while rendering a component?
我知道我可以在渲染组件时通过 props
。我也知道 getInitialState
方法。但问题是,getInitialState
并没有多大帮助,因为我的组件不知道它的初始状态。我愿意。所以我想在渲染的时候传递它。
类似这样的东西(伪代码):
React.render(<Component initialState={...} />);
我知道我可以使用 prop
作为初始状态,但这闻起来像反模式。
我该怎么办?
为清晰起见编辑
假设我有一个 CommentList
组件。当我第一次渲染它时,初始状态对应于我数据库中当前评论的快照。当用户添加评论时,此列表将发生变化,这就是为什么它应该是 state
而不是 props
的原因。现在,为了呈现评论的初始快照,我应该将它传递给 CommentsList
组件,因为它无法知道它。我的困惑是,我看到传递此信息的唯一方法是通过 props
,这似乎是一种反模式。
免责声明:较新版本的 React 以不同的方式处理此问题。
只有永久组件可以使用 getInitialState
中的道具。如果同步是您的目标,getInitialState
中的道具是一种反模式。 getInitialState
仅在首次创建组件时调用,因此它可能会引发一些错误,因为事实来源不是唯一的。 。
Using props, passed down from parent, to generate state in
getInitialState often leads to duplication of "source of truth", i.e.
where the real data is. Whenever possible, compute values on-the-fly
to ensure that they don't get out of sync later on and cause
maintenance trouble
您仍然可以:
getInitialState: function() {
return {foo: this.props.foo}
}
因为它们将成为您应用的默认道具。但是只要您使用道具来设置一个可能不会改变的值,您就可以在 render
函数中使用相同的道具。
<span>{this.props.foo}</span>
这个道具不会被修改,所以每次调用render
时都可以使用它。
编辑后的答案:
在这种情况下,您的初始状态不应是道具,而应是填充评论列表的 ajax 调用。
如果您知道状态,那么我倾向于认为您正在渲染的组件并不能真正控制它。 React 中的想法是任何特定的状态都只存在于一个位置。
看了其他答案,稍微研究了一下,得出这样的结论:
如果您在客户端渲染 React(编译或未编译),这是默认方法,您应该尝试从组件内部进行额外的 Ajax 调用以获取初始状态。也就是说,不要使用 props
。它更干净,更不容易出错。
但是,如果您在服务器中呈现(Node.js 或 ReactJs.NET),则没有理由为每个请求进行额外的 Ajax 调用。此外,它不是搜索引擎优化友好。您希望完整的页面作为您请求的结果(包括数据)出现。因此,正如@RandyMorris 指出的那样,在这种情况下,可以使用道具作为初始状态,只要它完全是初始状态即可。即不同步。
Using props, passed down from parent, to generate state in getInitialState
often leads to duplication of "source of truth", i.e. where the real data is. Whenever possible, compute values on-the-fly to ensure that they don't get out of sync later on and cause maintenance trouble
并且:
However, it's not an anti-pattern if you make it clear that synchronization's not the goal here
所以如果你的props包含了一个value
和一个initialValue
,那么很明显后者是用来初始化的,不会混淆。
有关代码示例,请参阅 the React docs。
我知道我可以在渲染组件时通过 props
。我也知道 getInitialState
方法。但问题是,getInitialState
并没有多大帮助,因为我的组件不知道它的初始状态。我愿意。所以我想在渲染的时候传递它。
类似这样的东西(伪代码):
React.render(<Component initialState={...} />);
我知道我可以使用 prop
作为初始状态,但这闻起来像反模式。
我该怎么办?
为清晰起见编辑
假设我有一个 CommentList
组件。当我第一次渲染它时,初始状态对应于我数据库中当前评论的快照。当用户添加评论时,此列表将发生变化,这就是为什么它应该是 state
而不是 props
的原因。现在,为了呈现评论的初始快照,我应该将它传递给 CommentsList
组件,因为它无法知道它。我的困惑是,我看到传递此信息的唯一方法是通过 props
,这似乎是一种反模式。
免责声明:较新版本的 React 以不同的方式处理此问题。
只有永久组件可以使用 getInitialState
中的道具。如果同步是您的目标,getInitialState
中的道具是一种反模式。 getInitialState
仅在首次创建组件时调用,因此它可能会引发一些错误,因为事实来源不是唯一的。
Using props, passed down from parent, to generate state in getInitialState often leads to duplication of "source of truth", i.e. where the real data is. Whenever possible, compute values on-the-fly to ensure that they don't get out of sync later on and cause maintenance trouble
您仍然可以:
getInitialState: function() {
return {foo: this.props.foo}
}
因为它们将成为您应用的默认道具。但是只要您使用道具来设置一个可能不会改变的值,您就可以在 render
函数中使用相同的道具。
<span>{this.props.foo}</span>
这个道具不会被修改,所以每次调用render
时都可以使用它。
编辑后的答案:
在这种情况下,您的初始状态不应是道具,而应是填充评论列表的 ajax 调用。
如果您知道状态,那么我倾向于认为您正在渲染的组件并不能真正控制它。 React 中的想法是任何特定的状态都只存在于一个位置。
看了其他答案,稍微研究了一下,得出这样的结论:
如果您在客户端渲染 React(编译或未编译),这是默认方法,您应该尝试从组件内部进行额外的 Ajax 调用以获取初始状态。也就是说,不要使用 props
。它更干净,更不容易出错。
但是,如果您在服务器中呈现(Node.js 或 ReactJs.NET),则没有理由为每个请求进行额外的 Ajax 调用。此外,它不是搜索引擎优化友好。您希望完整的页面作为您请求的结果(包括数据)出现。因此,正如@RandyMorris 指出的那样,在这种情况下,可以使用道具作为初始状态,只要它完全是初始状态即可。即不同步。
Using props, passed down from parent, to generate state in
getInitialState
often leads to duplication of "source of truth", i.e. where the real data is. Whenever possible, compute values on-the-fly to ensure that they don't get out of sync later on and cause maintenance trouble
并且:
However, it's not an anti-pattern if you make it clear that synchronization's not the goal here
所以如果你的props包含了一个value
和一个initialValue
,那么很明显后者是用来初始化的,不会混淆。
有关代码示例,请参阅 the React docs。