REACT全选单选

身为react初学者,遇到这个问题记录一下,在代码编译器里面可以直接运行,不会存在一点报错,测试了很多遍了,

就不放gif图片了

效果展示:可能不是特别明显

如上图所示

下方是全部代码

  1. useState 用于创建状态变量,list 存储列表数据,allChecked 存储全选状态。

  2. useEffect 用于监听 list 的变化,根据已选中的列表项数量来更新全选状态。

  3. 第二个 useEffect 用于监听全选状态的变化,根据全选状态来更新每个列表项的选中状态。

  4. 在渲染部分,通过 list.map 方法循环渲染每个列表项,每个列表项包含一个复选框和一个名称。复选框的选中状态与列表项的 checked 属性绑定,通过 onChange 事件来更新列表项的选中状态。

  5. 最后一个 Checkbox 组件是全选复选框,它的选中状态与 allChecked 变量绑定,通过 onChange 事件来更新全选状态。

  6. setList 函数用于更新列表数据,通过创建一个新的列表副本并修改相应的项来实现。

总的来说,这段代码演示了如何使用 useStateuseEffect 来管理组件状态,以及如何使用 react-vant 组件库中的复选框组件来创建一个多选列表。每次用户点击复选框时,都会更新相关的状态以实现选择和取消选择功能。同时,全选复选框也可以控制所有列表项的选中状态。

import React, { useEffect, useState } from "react";
import { Stepper, Checkbox } from "react-vant";
function calculateTotalQuantity(cart) {
  let totalQuantity = 0;
  for (let item of cart) {
    totalQuantity += item.num;
  }
  return totalQuantity;
}
export default function App() {
  const [list, setList] = useState([
    { name: "上官二" },
    { name: "张三" },
    { name: "李四" },
    { name: "王五" },
    { name: "赵六" },
    { name: "李七" },
    { name: "真的是" },
  ]);
  const [allChecked, setAllChecked] = useState(false);
  // useEffect(() => {
  //     // render()
  // }, []);
  useEffect(() => {
    if (list.length === list.filter((item) => item.checked).length) {
      setAllChecked(true);
    } else {
      setAllChecked(false);
    }
  }, [list]);

  useEffect(() => {
    if (allChecked) {
      setList(
        list.map((item) => {
          item.checked = true;
          return item;
        })
      );
    } else {
      setList(
        list.map((item) => {
          item.checked = false;
          return item;
        })
      );
    }
  }, [allChecked]);
  return (
    <div>
      {list.map((item, index) => (
        <div key={item.id}>
          <div style={{ display: "flex" }}>
            <Checkbox
              checked={item.checked}
              onChange={(checked) => {
                setList(() => {
                  let arr = [...list];
                  arr[index].checked = checked;
                  return arr;
                });
              }}
            />
            <div>
              <p>{item.name}</p>
            </div>
          </div>
        </div>
      ))}
      <div>
        <Checkbox
          checked={allChecked}
          onChange={setAllChecked}
          style={{ background: "white" }}
        />
      </div>
    </div>
  );
}

 有什么建议可以在评论区写出来,共同探讨,互相学习。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锅盖哒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值