在我尝试处理更新表单时,编写了以下代码。它是受控输入组件,具有相应的状态值。当输入组件发生更改时,状态值会更新。这意味着视图将始终反映数据更改,反之亦然。当我尝试使用从数据库中提取的数据预填充输入组件时,我的问题出现了。我的尝试是在构造函数中定义初始状态值,等于传递的道具,但这不起作用。首次渲染组件时,它将不包含传递的精神道具,因为它尚未被提取。当第二次呈现组件时(因为数据已准备好),将不会调用构造函数。如何在数据准备好之前而不是之前设置初始状态?
SpiritsEditContainer
export default createContainer(({params}) => {
const handle = Meteor.subscribe("spirit", params.id);
return {
loading: !handle.ready(),
spirit: Spirits.find(params.id).fetch()[0]
}
}, SpiritsEditPage);
SpiritsEditPage
export default class SpiritsEditPage extends Component {
constructor(props) {
super(props)
this.state = {name: this.props.spirit.name}
}
handleNameChange(event) {
this.setState({name: event.target.value});
}
handleUpdate(event) {
event.preventDefault();
}
render() {
const {name} = this.state;
if (this.props.loading) {
return <div>loading</div>
} else {
return (
<div>
<h1>SpiritsEditPage</h1>
<form onSubmit={this.handleUpdate.bind(this)}>
<Input type="text"
label="Name"
value={name}
onChange={this.handleNameChange.bind(this)}/>
<button>Update</button>
</form>
</div>
)
}
}
}
答案 0 :(得分:2)
构造函数代码可能无法正常工作:
constructor(props) {
super(props)
this.state = {name: this.props.spirit.name}
}
而是检查props.spirit是否可用。
this.state = { name: this.props.spirit && this.props.spirit.name }
添加componentWillReceiveProps:
componentWillReceiveProps(nextProps) {
if (nextProps.spirit !== this.props.spirit) {
this.setState({ name: nextProps.spirit.name });
}
}
其余代码看起来没问题。