【标签选择】

全部标签和其他标签联动

import React, { useState } from 'react';

const TagSelector = () => {
    const [tagList, setTagList] = useState([
        {
            label: '颜色',
            code: 'color',
            key: 'isColor',
            check: false,
            child: [
                { label: '红色', key: 'isRed', check: false },
                { label: '蓝色', key: 'isBlue', check: false }
            ]
        },
        {
            label: '尺寸',
            code: 'size',
            key: 'isSize',
            check: false,
            child: [
                { label: '大', key: 'isBig', check: false },
                { label: '小', key: 'isSmall', check: false }
            ]
        },
        {
            label: '价格',
            code: 'price',
            key: 'isPrice',
            check: false,
            child: [
                { label: '100', key: 'low', check: false },
                { label: '500', key: 'high', check: false }
            ]
        }
    ]);

    const [selectedKeys, setSelectedKeys] = useState([]);

    const handleToggle = (key, isParent = false) => {
        const newTagList = [...tagList];
        const newSelectedKeys = [...selectedKeys];

        if (isParent) {
            // Toggle parent and all children  
            const tagItem = newTagList.find(item => item.key === key);
            tagItem.check = !tagItem.check;
            tagItem.child.forEach(child => {
                child.check = tagItem.check;
                if (tagItem.check) {
                    newSelectedKeys.push(child.key);
                } else {
                    newSelectedKeys.splice(newSelectedKeys.indexOf(child.key), 1);
                }
            });
        } else {
            // Toggle child and check parent  
            const parentItem = newTagList.find(item => item.child.some(child => child.key === key));
            const childItem = parentItem.child.find(child => child.key === key);
            childItem.check = !childItem.check;

            // Update selectedKeys  
            if (childItem.check) {
                newSelectedKeys.push(childItem.key);
            } else {
                newSelectedKeys.splice(newSelectedKeys.indexOf(childItem.key), 1);
            }

            // Check if all children are checked to update parent and selectedKeys  
            parentItem.check = parentItem.child.every(child => child.check);
        }

        console.log(newSelectedKeys, 'newSelectedKeys')

        setTagList(newTagList);
        setSelectedKeys(newSelectedKeys);
    };

    const getSelectedKeys = () => {
        let params = {};
        selectedKeys.forEach(key => {
            params[key] = true;
        });
        console.log(params,'params')
        return params;
    }

    return (
        <div>
            {tagList.map(item => (
                <div key={item.key}>
                    <label>
                        <input
                            type="checkbox"
                            checked={item.check}
                            onChange={() => handleToggle(item.key, true)}
                        />
                        {item.label} (全部)
                    </label>
                    {item.child.map(child => (
                        <label key={child.key}>
                            <input
                                type="checkbox"
                                checked={child.check}
                                onChange={() => handleToggle(child.key)}
                            />
                            {child.label}
                        </label>
                    ))}
                </div>
            ))}
            <button onClick={() => console.log(getSelectedKeys())}>获取选中值</button>
        </div>
    );
};

export default TagSelector;

``

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值