gpt4 book ai didi

javascript - 预填充受控组件

转载 作者:行者123 更新时间:2023-11-30 15:48:46 25 4
gpt4 key购买 nike

在我尝试处理更新表单时,编写了以下代码。它是一个受控输入组件,具有相应的状态值。当输入组件发生变化时,状态值会更新。这意味着 View 将始终反射(reflect)数据变化,反之亦然。我的问题是在尝试使用从数据库中获取的数据预填充输入组件时出现的。我的尝试是在构造函数中定义初始状态值,使其等于传递的 Prop ,但这没有用。当组件第一次被渲染时,它不会包含传递的精神 Prop ,因为它还没有被获取。当第二次渲染组件时(因为数据已经准备好)构造函数不会被调用。当数据准备好而不是之前如何设置初始状态?

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>
)
}
}
}

最佳答案

构造函数代码可能无法正常工作:

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 });
}
}

其余代码看起来没问题。

关于javascript - 预填充受控组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39679671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com