antd Tree 实现每个分组只能选一个效果

本文展示了如何在React中使用Ant Design库的Tree组件,实现可展开的多级节点,并包含选中状态管理和事件处理。通过实例代码,学习者可以快速掌握如何构建一个可交互的树形数据结构。

效果图

在这里插入图片描述

代码

import { Tree } from 'antd';
const { TreeNode } = Tree;

const treeData = [
    {
        title: '0-0',
        key: '0-0',
        children: [
            {
                title: '0-0-0',
                key: '0-0-0',
            },
            {
                title: '0-0-1',
                key: '0-0-1',
            },
            {
                title: '0-0-2',
                key: '0-0-2',
            },
        ],
    },
    {
        title: '1-1',
        key: '1-1',
        children: [
            { title: '1-1-0', key: '1-1-0' },
            { title: '1-1-1', key: '1-1-1' },
            { title: '1-1-2', key: '1-1-2' },
        ],
    },
];


class Demo extends React.Component {
    state = {
        expandedKeys: ['0-0', '1-1'],
        autoExpandParent: true,
        checkedKeys: [],
        selectedKeys: [],
    };

    onExpand = expandedKeys => {
        console.log('onExpand', expandedKeys);
        // if not set autoExpandParent to false, if children expanded, parent can not collapse.
        // or, you can remove all expanded children keys.
        this.setState({
            expandedKeys,
            autoExpandParent: false,
        });
    };

    onCheck = (checkedKeys, info) => {
        console.log('onCheck', checkedKeys);
        if (checkedKeys.length > 0) {
            let head = checkedKeys[checkedKeys.length - 1].slice(0, 3)
            let list = []
            checkedKeys.map((item, index) => {
                if (item.indexOf(head) != '-1') {
                    list = [...list, index]
                }
            })
            if (list.length == 2) {
                checkedKeys.splice(list[0], 1)
            }
        }
        this.setState({
            checkedKeys
        })
    };

    renderTreeNodes = data =>
        data.map(item => {
            if (item.children) {
                return (
                    <TreeNode checkable={false} title={item.title} key={item.key} dataRef={item}>
                        {this.renderTreeNodes(item.children)}
                    </TreeNode>
                );
            }
            return <TreeNode key={item.key} {...item} />;
        });

    render() {
        return (
            <Tree
                checkable
                onExpand={this.onExpand}
                expandedKeys={this.state.expandedKeys}
                autoExpandParent={this.state.autoExpandParent}
                onCheck={this.onCheck}
                checkedKeys={this.state.checkedKeys}
                selectedKeys={this.state.selectedKeys}
            >
                {this.renderTreeNodes(treeData)}
            </Tree>
        );
    }
}
export default Demo

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

知知洋洋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值