仅在反应应用中单击项目的setState

问题描述 投票:0回答:2

在我的反应应用程序中,我有多个复选框,我正在使用onClick切换已检查状态,它正在设置状态,但它正在为页面中的所有复选框更改它,我只想按下一个,这里是代码:

初始状态:

state: {checked: false}

复选框:

return boxes.map(box => (
<Checkbox checked={this.state.checked} onClick={() => this.onCheck(box.id)} />
))

功能:

onCheck(id) { this.setState({ checked: !this.state.checked }); }
javascript reactjs state checked
2个回答
0
投票

然后你必须为每个复选框都有一个状态变量。为简单起见,让我们将所有布尔值定义为是否已将第n个复选框检入单个数组。

你可以编写一个像这样的最小组件:

class App extends React.Component {

  constructor(props) {
    super(props);
    this.state = { boxes: [{id: 10}, {id: 20}] };
    this.state.checked = this.state.boxes.map(() => false);
    this.onCheck = this.onCheck.bind(this);
  }
  onCheck(id) {
    let index = this.state.boxes.findIndex(box => box.id==id);
    this.setState({
      checked: this.state.checked.map((c,i) => i==index ? !c : c)
    })
  }
  render() {
    return (<div>
      {this.state.boxes.map((box,i) => (
        <input
          key={box.id}
          type="checkbox"
          checked={this.state.checked[i]}
          onChange={() => this.onCheck(box.id)}
        />
      ))}
      <pre>this.state = {JSON.stringify(this.state,null,2)}</pre>
    </div>);
  }
}
  
ReactDOM.render(<App/>, document.querySelector('#root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="root"></div>

0
投票

它正在更改所有复选框,因为所有复选框都指的是状态中的相同变量。您可以将其ID存储在数组中:

state: {
  checkedIdArray: []
}

然后检查当前框的id是否在数组中以确定是否已检查:

<Checkbox
  key={box.id}
  checked={this.state.checkedIdArray.includes[box.id]}
  onClick={() => this.onCheck(box.id)}
/>

最后,你的onCheck()方法看起来像这样:

onCheck(id) {
  if (this.state.checkedIdArray.includes(id)) {
    this.setState({
      checkedIdArray: this.state.checkedIdArray.filter((val) => val !== id)
    });
  } else {
    this.setState({
      checkedIdArray: [...this.state.checkedIdArray, id]
    });
  }
}

没有测试或任何东西,但这样的东西应该让你到达你想去的地方。

© www.soinside.com 2019 - 2024. All rights reserved.