【问题标题】:How to let a parent component manage the state of child components in React?React中如何让父组件管理子组件的状态?
【发布时间】:2017-09-16 01:00:44
【问题描述】:

我有 3 个使用 React 构建的组件。它们是:

  • 包装器
  • 列表
  • 列表项

如何管理被点击复选框的状态。我希望 Wrapper 知道检查了哪些复选框。

class ListItem extends React.Component {
  render(){
    return (
      <li>
        <input type="checkbox" onChange={e => handleSelect(e.target.checked)} />
        <label>Checkbox 1</label>
      </li>
    )
  }
}

class List extends React.Component {
  getList(){
    const itemsList = this.props.list.map(
      (item, index) => (
        <ListItem key={index} item={item} />
      )
    )
   return itemsList;
  }
  
  render(){
    <ul>
      {this.itemsList}
    </ul>
  }
}

class Wrapper extends React.Component {
  const list = [
    {"id": 1, "label": "label 1"},
    {"id": 2, "label": "label 2"},
  ]

  render(){
    <List list={list} />
  }
}

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

您应该改为在 Wrapper 组件中维护列表(以及复选框)的状态,并将其传递给您的 List 组件。

另外,在 Wrapper 组件中创建处理程序并将其传递下去。

所以你的代码变成了这样:

class Wrapper extends React.Component {
    constructor() {
        this.state = [
            {"id": 1, "label": "label 1", checked: false},
            {"id": 2, "label": "label 2", checked: false}
        ]
    }

    handleChange(id, checked) {
        this.setState((state) => {
            return state.map(item => {
                return {
                   ...item,
                   checked: item.id === id ? checked : item.checked
                }
            });
       });
    }

    render() {
        <List list={this.state} onChange={this.handleChange} />
    }
}


class List extends React.Component {
  render(){
    <ul>
    { this.props.list.map((item, index) => (
          <ListItem key={index} item={item} handleChange={this.props.handleChange} />
    )}
    </ul>
  }
}

class ListItem extends React.Component {
  render(){
    const { item } = this.props;
    return (
      <li>
        <input type="checkbox" onChange={(e) => this.props.handleChange(item.id, e.target.checked)} />
        <label>{ item.label } </label>
      </li>
    )
  }
}

我没有测试这段代码,但我希望你能明白它的要点。维护和更改顶部组件的状态,使用较低的组件仅用于显示和交互。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-07-04
  • 2022-10-24
  • 1970-01-01
  • 2023-03-26
  • 2020-12-14
  • 2019-07-29
  • 2016-12-26
  • 2020-12-03
相关资源
最近更新 更多