| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 | import React, { useMemo, useState, useCallback } from 'react';import { get, union, pullAll } from 'lodash';import { Table } from '@douyinfe/semi-ui';const childrenRecordName = 'children';const rowKey = 'key';const getKey = record => get(record, rowKey, 'key');const ChildrenDataSelectedDemo = () => {    const [selectedRowKeys, setSelectedRowKeys] = useState([]);    const columns = useMemo(        () => [            {                title: 'Key',                dataIndex: 'dataKey',                key: 'dataKey',            },            {                title: '名称',                dataIndex: 'name',                key: 'name',                width: 200,            },            {                title: '数据类型',                dataIndex: 'type',                key: 'type',                width: 400,            },            {                title: '描述',                dataIndex: 'description',                key: 'description',            },            {                title: '默认值',                dataIndex: 'default',                key: 'default',                width: 100,            },        ],        []    );    const data = useMemo(        () => [            {                key: 1,                dataKey: 'videos_info',                name: '视频信息',                type: 'Object 对象',                description: '视频的元信息',                default: '无',                children: [                    {                        key: 11,                        dataKey: 'status',                        name: '视频状态',                        type: 'Enum <Integer> 枚举',                        description: '视频的可见、推荐状态',                        default: '1',                    },                    {                        key: 12,                        dataKey: 'vid',                        name: '视频 ID',                        type: 'String 字符串',                        description: '标识视频的唯一 ID',                        default: '无',                        children: [                            {                                key: 121,                                dataKey: 'video_url',                                name: '视频地址',                                type: 'String 字符串',                                description: '视频的唯一链接',                                default: '无',                            },                        ],                    }                ],            },            {                key: 2,                dataKey: 'text_info',                name: '文本信息',                type: 'Object 对象',                description: '视频的元信息',                default: '无',                children: [                    {                        key: 21,                        dataKey: 'title',                        name: '视频标题',                        type: 'String 字符串',                        description: '视频的标题',                        default: '无',                    },                    {                        key: 22,                        dataKey: 'video_description',                        name: '视频描述',                        type: 'String 字符串',                        description: '视频的描述',                        default: '无',                    }                ],            },        ],        []    );    // 自定义禁用逻辑    const isRecordDisabled = (record) => {        return false;    };    const traverse = (data, res) => {        for (let record of data) {            const children = get(record, 'children');            const disabled = isRecordDisabled(record);            if (!disabled) {                const key = getKey(record);                res.push(key);            }            if (Array.isArray(children)) {                traverse(children, res);            }        }    };    const getAllRowKeys = data => {        const allRowKeys = [];        traverse(data, allRowKeys);        console.log('allRowKeys', allRowKeys);        return allRowKeys;    };    const findShouldSelectRowKeys = (record, selected) => {        let shouldSelectRowKeys;        const children = get(record, 'children');        let childrenRowKeys = [];        if (Array.isArray(children)) {            traverse(children, childrenRowKeys);        }        const key = getKey(record);        if (!selected) {            shouldSelectRowKeys = [...selectedRowKeys];            pullAll(shouldSelectRowKeys, [key, ...childrenRowKeys]);        } else {            shouldSelectRowKeys = union(selectedRowKeys, [key, ...childrenRowKeys]);        }        return shouldSelectRowKeys;    };    // 选中一行时需要选中自己可选行    const doSelect = useCallback((record, selected) => {        const rowKeys = findShouldSelectRowKeys(record, selected);        setSelectedRowKeys(rowKeys);        console.log('select', record, rowKeys);    }, [selectedRowKeys, rowKey, childrenRecordName]);    // 找出所有可选的行    const doSelectAll = useCallback((selected, selectedRows) => {        console.log(selected);        let rowKeys = [];        if (selected) {            rowKeys = getAllRowKeys(data);        }        setSelectedRowKeys(rowKeys);    }, []);    const rowSelection = useMemo(        () => ({            selectedRowKeys,            onSelect: doSelect,            onSelectAll: doSelectAll,        }),        [selectedRowKeys, doSelect, doSelectAll]    );    return (        <Table            columns={columns}            rowKey={rowKey}            childrenRecordName={childrenRecordName}            rowSelection={rowSelection}            dataSource={data}            pagination={false}        />    );};render(ChildrenDataSelectedDemo);
 |