即使父状态更新,Checkbox也不会更新对孩子的反应?

时间:2017-06-05 19:55:11

标签: javascript reactjs checkbox

这是来自父母的代码:

_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>

选中复选框会更新父组件状态,但不会选中子组件上的复选框。帮助

2 个答案:

答案 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将是正确的方法。