【问题标题】:My child component checkbox is not updating when props changed from the parent?当道具从父项更改时,我的子组件复选框没有更新?
【发布时间】:2017-06-05 21:42:35
【问题描述】:

这是来自我的父组件 TodoList 的代码:

_handleSelectedTodo(e) {
    e.preventDefault(); 
    this.setState({checkedIds: [...this.state.checkedIds, e.target.value]});
  }
//render() { ...
  <ul>
    {todos.map((todo,todoIndex) => 
      <Todo
        key={todo.id}
        {...todo} // pass all the todo property
        onClick={() => onTodoClick(todo.id)}
        onTrashClick={() => onDeleteClick(todoIndex)}
        handleSelectedTodo = {this._handleSelectedTodo}
        checked={(this.state.checkedIds.includes(todo.id))}
      />
    )}
  </ul>

检查Todo组件中的复选框时,我在鸟类组件状态上添加CheckedIds。您可以在我使用的待办事项上的已检查道具上看到包含将其设置为真或假。但我的问题是我的子组件没有更新,我正在使用 componentWillReceiveProps。这是代码:

constructor(props){
    super(props);
    this.state= { checked: false }
  }

  componentWillReceiveProps(nextProps) {
  this.setState({ checked: nextProps.checked });  
}
// render() { ...
<input
   checked={this.state.checked}
   onChange={handleSelectedTodo}
   type="checkbox"
   value={id}
></input>

一切正常,当点击时,React 调试器上的检查为真,但它不会重新呈现,只有当我选中另一个框时才会重新呈现,我检查的最后一个将被选中,而不是最新的?

【问题讨论】:

  • 是的,我尝试直接使用道具,但它仍然没有更新。它正在我的 React 调试器上更新,但不会被检查,一旦我检查了另一个复选框,即最后一个检查的复选框将重新呈现,而不是我尝试检查的最新复选框
  • onChange={handleSelectedTodo} 在您的子组件中。这不应该是onChange={this.props.handleSelectedTodo}吗?

标签: javascript reactjs checkbox


【解决方案1】:

您需要删除this.state.checkedIds.includes(todo.id) 周围的()

//render() { ...
  <ul>
    {todos.map((todo,todoIndex) => 
      <Todo
        key={todo.id}
        {...todo} // pass all the todo property
        onClick={() => onTodoClick(todo.id)}
        onTrashClick={() => onDeleteClick(todoIndex)}
        handleSelectedTodo = {this._handleSelectedTodo}
        checked={this.state.checkedIds.includes(todo.id)}
      />
    )}
  </ul>

【讨论】:

  • 我认为这与通过新生命周期将值传递到组件状态的渲染延迟有关。有额外的括号不应该真正影响协调算法是否决定重新呈现输入组件。
  • 解构{...todo}时包含什么?你可以在那里设置checked吗?
  • 不,只是将待办事项的属性作为道具传递给待办事项组件
  • @MichaelLyons 任何延迟都无关紧要,一旦新道具进入组件,它将触发重新渲染,除非在 shouldComponentUpdate 函数中停止。
  • 好的,试着在构造函数中设置你的状态:this.state = { checked: props.checked }。您可能会在每次重新渲染时销毁组件,默认情况下将选中状态设置为 false
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-12
  • 2018-07-02
  • 2019-08-27
  • 2021-11-04
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多