React实现全选和反选

CheckboxList.js

class CheckboxList extends React.Component{
  constructor(props){
    super(props)
    this.state = {
      data: [
        { 'name':'red', 'checked': true },
        { 'name':'green', 'checked': false },
        { 'name':'blue', 'checked': false }
      ],
      checkedAll: false, //全选状态
      checkedInvert: false //反选状态
    }
    this.handleAllChange = this.handleAllChange.bind(this);
    this.handleInvertChange = this.handleInvertChange.bind(this);
    this.handleItemChange = this.handleItemChange.bind(this);
  }

  // 全选事件
  handleAllChange(){
    const { checkedAll,data } = this.state;

    data.map(function(item,index){
      return item.checked = !checkedAll;
    })

    this.setState({
      checkedAll: !checkedAll,
      checkedInvert: false,
      data: data
    });
  }

  // 反选事件
  handleInvertChange(){
    const { checkedInvert, data } = this.state;

    data.map(function(item,index){
      return item.checked = !item.checked;
    })

    const checkedAll = data.every(function(item,index){
      return item.checked;
    })

    this.setState({
      checkedAll: checkedAll,
      checkedInvert: !checkedInvert,
      data: data
    });
  }

  // CheckItem事件
  handleItemChange(ckitem){
    const data = this.state.data;
    const checked = ckitem.checked;
    let checkedInvert = this.state.checkedInvert;

    data.map(function(item,index){
      if(item.name === ckitem.name){
        return item.checked = ckitem.checked
      }
    })

    const checkedAll = data.every(function(item,index){
      return item.checked;
    })

    checkedInvert = checkedAll ? false : checkedInvert;

    this.setState({
      data: data,
      checkedAll: checkedAll,
      checkedInvert: checkedInvert
    })
  }

  renderList(){
    var that = this;
    return this.state.data.map(function(item,index){
      return <CheckboxItem {...item} key={index} handleItemChange={that.handleItemChange}/>
    })
  }

  render(){
    const {checkedAll,checkedInvert} = this.state
    return(
      <div className="container">
        <div className="checkbox-control">
          <label><input type="checkbox" checked={checkedAll} onChange={ this.handleAllChange }/>全选</label>
          <label><input type="checkbox" checked={checkedInvert} onChange={ this.handleInvertChange }/>反选</label>
        </div>
        <div className="checkbox-list">
          {this.renderList()}
        </div>
      </div>
    ) 
  }
}
复制代码

CheckboxItem.js

class CheckboxItem extends React.Component{
  constructor(props){
    super(props)
    this.state = {
      checked: props.checked,
      name: props.name
    }
    this.handleChange = this.handleChange.bind(this);
  }

  componentWillReceiveProps(nextProps,prevProps){
    if(nextProps.checked != prevProps.checked){
      this.setState({
        checked: nextProps.checked
      })
    }
  }

  handleChange(){
    const { checked,name } = this.state
    this.setState({
      checked: !checked
    },function(){
      this.props.handleItemChange({ name: name, checked: !checked });
    })
  }

  render(){
    const {checked,name} = this.state
    return(
      <div>
        <label className="checkbox-item"><input type="checkbox" checked={checked} onChange={ this.handleChange }/>{name}</label>
      </div>
    )
  }
}
复制代码

App.js

ReactDOM.render(
  <CheckboxList />,
  document.getElementById('root')
);
复制代码

预览效果
http://m.pengjielee.cn/htmls/checkall.html

转载于:https://juejin.im/post/5ae2cd2d6fb9a07acc117106

可以使用React的状态来实现全选购物车功能。 首先,你需要定义一个组件,例如 `ShoppingCart` 组件,它包含多个 `CartItem` 子组件。每个 `CartItem` 组件都有一个 `checked` 属性,表示该商品是否被中。 在 `ShoppingCart` 组件中,需要定义一个 `selectedAll` 状态,表示是否全选。同时,还需要定义一个 `handleSelectAll` 函数,用于处理全选/功能。该函数将会通过 `onChange` 事件绑定到全选的复框上。 以下是示例代码: ```jsx import React, { useState } from "react"; const ShoppingCart = ({ items }) => { const [selectedAll, setSelectedAll] = useState(false); // 处理全选/ const handleSelectAll = () => { setSelectedAll(!selectedAll); }; // 处理子组件中状态改变 const handleItemChange = (index, checked) => { // TODO: 更新 items[index] 的中状态 }; return ( <div> <label> <input type="checkbox" checked={selectedAll} onChange={handleSelectAll} /> 全选 </label> {items.map((item, index) => ( <CartItem key={index} item={item} checked={item.checked} onChange={handleItemChange} /> ))} </div> ); }; const CartItem = ({ item, checked, onChange }) => { const handleItemChange = (event) => { onChange(item.id, event.target.checked); }; return ( <div> <label> <input type="checkbox" checked={checked} onChange={handleItemChange} /> {item.name} </label> </div> ); }; ``` 在 `ShoppingCart` 组件中,我们通过 `map` 方法遍历所有的商品,并渲染 `CartItem` 子组件。在 `CartItem` 组件中,我们通过 `checked` `onChange` 属性来控制中状态处理状态改变。 在 `handleSelectAll` 函数中,我们使用 `setSelectedAll` 来更新 `selectedAll` 状态。在 `handleItemChange` 函数中,我们需要更新 `items` 数组中对应商品的中状态。你可以通过 `useState` 状态管理库来管理 `items` 数组的状态,或者通过 `Redux` 等状态管理工具来管理状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值