taro-react小程序单选框/多选框

在这里插入图片描述

import { useEffect, useState } from 'react';
import { Checkbox, ScrollView } from '@tarojs/components';
export default function Balance() {
  const [loading, setLoading] = useState(false);
  const [allcheck, setAllcheck] = useState(false); // 全选按钮
  const [isClickAllCheck, setIsClickAllCheck] = useState(false); // 点击全选/单选 按钮
  const [checkLists, setCheckLists] = useState<number[]>([]); // 存储的数据列表
  const [balanceList, setBalanceList] = useState([
    { value: 1, text: '1', check: false },
    { value: 2, text: '2', check: false },
    { value: 3, text: '3', check: false },
    { value: 4, text: '4', check: false },
    { value: 5, text: '5', check: false },
    { value: 6, text: '6', check: false },
  ])

  const check = (item) => {
    const updatedItem = { ...item, check: !item.check };
    setBalanceList(prevArr =>
      prevArr.map(prevItem =>
        prevItem === item ? updatedItem : prevItem
      )
    );

    if (updatedItem.check) {
      setCheckLists(prev => [...prev, updatedItem.value]);
    } else {
      setCheckLists(prev => prev.filter(value => value !== updatedItem.value));
    }
  };

  useEffect(() => {
    const handleAllcheckChange = () => {
      if (allcheck && isClickAllCheck) {
        setBalanceList(prevArr => {
          const newCheckLists = prevArr.map(item => item.value);
          setCheckLists(newCheckLists);
          return prevArr.map(item => ({ ...item, check: true }));
        });
      } else if (!allcheck && isClickAllCheck) {
        setBalanceList(prevArr => prevArr.map(item => ({ ...item, check: false })));
        setCheckLists([]);
      }
    };

    handleAllcheckChange();
  }, [allcheck, isClickAllCheck]);


  useEffect(() => {
    const allChecked = balanceList.every(item => item.check);
    setAllcheck(allChecked);
  }, [balanceList]);


  const handleScrollToLower = () => {
    // setLoading(true);
    // // 模拟请求新数据
    // setTimeout(() => {
    //   const newData = Array.from({ length: 10 }, () => ({
    //     value: Math.floor(Math.random() * 10),
    //     text: '文本',
    //     check: false
    //   }))

    //   setBalanceList(prevArr => [...prevArr, ...newData]);
    //   setLoading(false);
    // }, 1000);
  };

  return (
    <view>
      <view className='h-[60vh] pt-[300px]  bg-orange-200 overflow-y-auto'>
        <ScrollView scrollY style={{ height: '60vh' }} onScrollToLower={handleScrollToLower} >
          <view onClick={() => { console.log('checkLists', checkLists) }}>打印选中的数据</view>
          <Checkbox id='remember' value='记住密码' checked={allcheck} onClick={() => setAllcheck(prevState => { setIsClickAllCheck(true); return !prevState; })}>全选</Checkbox>
          {
            balanceList?.map(item => {
              return (
                <view> <Checkbox id={String(item.value)} value={String(item.value)} checked={item.check} onClick={() => { check(item); setIsClickAllCheck(false); }}  >
                  {item.value}
                </Checkbox></view>
              )
            })
          }
          {loading && <view>加载中...</view>}
        </ScrollView>
      </view>
    </view>
  );
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值