【问题标题】:Select/Unselect All checkbox in reactJsreactJs中的全选/取消全选复选框
【发布时间】:2020-06-30 22:27:57
【问题描述】:

我正在尝试在 reactJs 中实现选择/取消选择所有功能,但无法实现。

我已使选择/取消选择所有主标题复选框功能,并且单个元素也可以选择或取消选择。

我的工作链接:

import React, { Component } from 'react'
import ReactDOM from 'react-dom'

class Box extends Component{
    constructor(props){
        super(props);
        this.state = {
            allChecked: false,
            list: [
                {id:1, name: "item1", isChecked: false},
                {id:2, name: "item2", isChecked: false},
                {id:3, name: "item3", isChecked: false},
            ],
        };
    }

handleChange = (e) => {
    let list =  this.state.list;
    let allChecked = this.state.allChecked;
    if(e.target.value === "checkAll"){
        list.forEach(item => {
            item.isChecked = e.target.checked;
            allChecked = e.target.checked;
        });
    }
    else{
        list.find( item => item.name === e.target.name).isChecked = e.target.checked;
    }
    this.setState({list:list, allChecked: allChecked});
}

renderList = () => {
    return this.state.list.map(item =>
        <div>
            <input key={item.id} type="checkbox" name={item.name} value={item.name} checked={item.isChecked} onChange={this.handleChange} />
            <label>{item.name}</label>
        </div>
    )
}
render(){
    return(
        <div>
            <input type="checkbox" 
            value="checkAll" 
            checked={this.state.allChecked} 
            onChange={this.handleChange} />Check all
            <br/>
            {this.renderList()}
        </div>
    );
  }
}

ReactDOM.render(<Box/>, document.getElementById('root'));

直截了当,我希望这种 (https://jsfiddle.net/52uny55w/) 类型的功能使用纯 Javascript,但由于某些原因不使用 jquery。

【问题讨论】:

  • 我试试你的代码,一切正常。问题出在哪里?
  • @Wicak 我希望该 CheckAll 复选框也被选中,当我检查所有这些项目并希望该 CheckAll 复选框也被取消时当我取消选中其中一项时检查。
  • Codesandbox 中缺少该代码,我只是重新创建了相同的代码以供参考。 codesandbox.io/s/frosty-curie-75u6d?file=/src/App.js:395-833
  • 有人有按钮的工作示例吗?

标签: javascript reactjs


【解决方案1】:

我已经在https://codesandbox.io/s/vvxpny4xq3解决了这个问题

  handleChange = e => {
    let itemName = e.target.name;
    let checked = e.target.checked;
    this.setState(prevState => {
      let { list, allChecked } = prevState;
      if (itemName === "checkAll") {
        allChecked = checked;
        list = list.map(item => ({ ...item, isChecked: checked }));
      } else {
        list = list.map(item =>
          item.name === itemName ? { ...item, isChecked: checked } : item
        );
        allChecked = list.every(item => item.isChecked);
      }
      return { list, allChecked };
    });
  };

有几点需要注意。

1) 我已将 checkAll 按钮更新为具有 name 属性以确保一致性

2) 如果修改现有状态,使用新的函数式语法

3) 解构对象,如果可能的话不要在原地改变它们。您可以使用 map 代替 forEach 并使用扩展运算符来修改对象而不发生变异。

【讨论】:

  • 您好,非常感谢您的贡献。并感谢您的 function setState() 推荐和 .map() 方法推荐。我接受您的回答。再次感谢您。
猜你喜欢
  • 2016-02-20
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多