我在React表单和正确管理状态方面遇到问题。我在表单中有一个时间输入字段(在模态中)。初始值在getInitialState中设置为状态变量,并从父组件传入。这本身就很好
当我想通过父组件更新默认的开始时间值时,问题就出现了。更新本身通过setState start\u time:new\u time在父组件中进行。但是在我的表单中,默认的start\u time值从未更改,因为它在getInitialState中只定义了一次
我曾尝试使用组件willupdate通过设置状态开始时间:next_props.start_时间强制更改状态,这确实有效,但它给了我未捕获范围错误:超过了最大调用堆栈大小错误
所以我的问题是,在这种情况下,更新状态的正确方法是什么?我是不是想错了
当前代码:
@ModalBody=React.createClass
getInitialState:->;
开始时间:@props.start.time.format(";HH:mm";)
#有效,但需要很长时间,原因如下:
#&引用;未捕获范围错误:超过最大调用堆栈大小;
组件将更新:(下一个道具,下一个状态)>;
@设置状态(开始时间:下一个道具。开始时间。格式(";HH:mm";)
fieldChanged:(fieldName,event)——>;
stateUpdate={}
stateUpdate[fieldName]=event.target.value
@设置状态(状态更新)
渲染:->;
React.DOM.div
类名:";“模态体”;
React.DOM.form null,
React.createElement FormLabelInputField,
类型:";时间“;
id:“;开始时间;
标签“U名称:”;“开始时间”;
值:@state.start\u时间
onChange:@fieldChanged.bind(null,“开始时间”)
@FormLabelInputField=React.createClass
渲染:->;
React.DOM.div
类名:";“表格组”;
React.DOM.label
htmlFor:@props.id
@props.label_name+";:&引用;
React.DOM.input
类名:";“表格控制”;
类型:@props.type
id:@props.id
value:@props.value
onChange:@props.onChange
componentWillReceiveProps自react 16起取消注册:改用getDerivedStateFromProps
如果我理解正确,您有一个父组件正在传递start\u time到ModalBody组件,该组件将其分配到自己的状态?您希望从父组件而不是子组件更新该时间
React提供了一些处理这种情况的技巧。(注意,这是一篇已经从网上删除的老文章。这里有一个指向组件道具当前文档的链接)
在
getInitialState中使用道具生成状态通常会导致;“真理之源”;,i、 e.实际数据的位置。这是因为只有在首次创建组件时才会调用getInitialState只要有可能,随时计算值,以确保它们不会在以后失去同步并导致维护问题
基本上,每当您将父级的道具指定给子级的状态时,在道具更新时并不总是调用渲染方法。您必须使用componentWillReceiveProps方法手动调用它
组件将接收道具(下一步){
//您不必首先执行此检查,但它有助于防止不必要的渲染
if(nextrops.startTime!==this.state.startTime){
this.setState({startTime:nextProps.startTime});
}
}