这是来自父母的代码:
_handleSelectedTodo(e) {
e.preventDefault();
this.setState({checkedIds: [...this.state.checkedIds, e.target.value]});
}
// render () { ...
<ul>
{todos.map((todo,todoIndex) => // The map method has default argument on second index, the index of the current todo in map execution. We use it so we do not have to use findIndex when we need to dispatch action that needs index of a specific todo
<Todo
key={todo.id}
{...todo} // pass all the todo property
onClick={() => onTodoClick(todo.id)}
onTrashClick={() => onDeleteClick(todoIndex)}
handleSelectedTodo = {this._handleSelectedTodo}
checked={Boolean(this.state.checkedIds.includes(todo.id))}
/>
)}
这是我尝试的,因为在复选框上分配道具并没有更新Child Todo代码,检查可以是真或假,这将取决于道具:
componentWillMount() {
this.setState({ checked: this.props.checked })
}
// render() { ...
<input
checked={this.state.checked}
onChange={handleSelectedTodo}
type="checkbox"
value={id}
></input>
选中复选框会更新父组件状态,但不会选中子组件上的复选框。帮助
答案 0 :(得分:1)
原因是,componentWillMount
仅在初始渲染之前被调用,而不是在此之后,当您更新父组件的state
时,子组件的state
未得到更新。
使用componentWillReceiveProps
方法更新子组件的state
:
componentWillReceiveProps(nextProps){
if(nextProps.checked != this.state.checked)
this.setState({checked: nextProps.checked})
}
或最简单的解决方案将不会将值保存在子组件的state
中,直接使用props
值,如下所示:
<input
checked={this.props.checked} //here use this.props.checked directly
onChange={handleSelectedTodo}
type="checkbox"
value={id}
>
</input>
<强> componentWillReceiveProps: 强>
在安装的组件之前调用componentWillReceiveProps() 收到新的道具。如果您需要更新状态以响应 prop更改(例如,重置它),您可以比较this.props 和nextProps并使用this.setState()执行状态转换 这种方法。
<强> componentWillMount: 强>
在安装发生之前立即调用componentWillMount()。它 在render()之前调用。
答案 1 :(得分:1)
此代码也可以这样写: -
_handleSelectedTodo(e) {
e.preventDefault();
this.setState({checkedIds: [...this.state.checkedIds, e.target.value]});
}
render () { ...
<ul>
{todos.map((todo,todoIndex) => {
let isChecked = (this.state.checkedIds.indexOf(todo.id) >= 0);
return (
<Todo
key={todo.id}
{...todo} // pass all the todo property
onClick={(id) => onTodoClick(todo.id)} //This event should be binded to 'this' inside the constructor
onTrashClick={(todoIndex) => onDeleteClick(todoIndex)}
handleSelectedTodo = {this._handleSelectedTodo}
checked={isChecked}
/>
)
});
}
这个子组件应该依赖于它的父状态来检查它的属性
<input
checked={this.props.checked}
onChange={handleSelectedTodo}
type="checkbox"
value={id}
></input>
如果你想将子项的checked属性保持为子状态,那么Mayank所说的componentWillReceiveProps将是正确的方法。