antd table 树形数据展示 搜索子数据 展开父节点并高亮搜索出来的数据

import React, { Key, useState } from 'react';
import { Table, Input } from 'antd';

const { Search } = Input;

const dataSource = [
  {
    key: '1',
    name: 'Parent 1',
    children: [
      {
        key: '1-1',
        name: 'Child 1-1',
      },
      {
        key: '1-2',
        name: 'Child 1-2',
      },
    ],
  },
  {
    key: '2',
    name: 'Parent 2',
    children: [
      {
        key: '2-1',
        name: 'Child 2-1',
      },
    ],
  },
];

const TreeTable = () => {
  const [searchText, setSearchText] = useState('');
  const [expandedKeys, setExpandedKeys] = useState<Key[]>([]);

  const handleSearch = (value: string) => {
    setSearchText(value);
    const keys: Key[] = [];
    dataSource.forEach((item) => {
      if (item.name.toLowerCase().includes(value.toLowerCase())) {
        keys.push(item.key); // 如果父节点匹配,将父节点key添加到展开的keys中
      } else if (item.children) {
        item.children.forEach((child) => {
          if (child.name.toLowerCase().includes(value.toLowerCase())) {
            keys.push(item.key); // 如果子节点匹配,将父节点key添加到展开的keys中
          }
        });
      }
    });
    setExpandedKeys(keys);
  };

  const columns = [
    {
      title: 'Name',
      dataIndex: 'name',
      key: 'name',
      render: (text: string) => {
        const index = text.toLowerCase().indexOf(searchText.toLowerCase());
        const beforeStr = text.substring(0, index);
        const afterStr = text.substring(index + searchText.length);
        const highlightedText =
          index > -1 ? (
            <>
              {beforeStr}
              <span style={{ backgroundColor: '#ffc069' }}>{searchText}</span>
              {afterStr}
            </>
          ) : (
            text
          );
        return <span>{highlightedText}</span>;
      },
    },
  ];

  return (
    <div>
      <Search placeholder="Search" onSearch={(e) => handleSearch(e)} />
      <Table
        dataSource={dataSource}
        columns={columns}
        expandable={{
          expandedRowKeys: expandedKeys,
          onExpandedRowsChange: (keys) => setExpandedKeys(keys as Key[]),
        }}
      />
    </div>
  );
};

export default TreeTable;

要实现antd中的Table组件树形结构数据搜索,你可以按照以下步骤进行: 1. **数据准备**:确保你的数据中每个节点都有一个唯一的`key`属性,这对于树形结构是必须的。 2. **搜索输入**:在页面上添加一个搜索输入框,用于输入搜索关键词。 3. **搜索方法**:编写一个搜索函数,该函数会对每个节点进行递归搜索根据节点的内容与搜索关键词匹配。 4. **过滤树数据**:在搜索函数中,对树形数据进行遍历,对每个节点的`title`或其他相关属性进行匹配。如果匹配成功,保留该节点,否则隐藏该节点。 5. **更新表格**:将搜索后的数据重新设置到Table组件的`data`属性中,从而更新表格显示。 6. **展开状态保持**:在搜索过程中,可以存储节点的展开状态,数据更新后重新展开之前展开的节点。 这里是一个简化的搜索函数示例(使用JavaScript): ```javascript function searchTreeData(treeData, keyword, expandedKeys = []) { let searchResult = []; const search = (data) => { data.forEach((node) => { let newNode = { ...node }; // 如果节点内容匹配搜索关键词,则保留该节点 if (node.title.includes(keyword)) { newNode.children = node.children ? search(node.children) : []; // 如果节点之前是展开的,现在也保留展开状态 if (expandedKeys.includes(newNode.key)) { expandedKeys.push(newNode.key); } } // 如果有节点,继续递归搜索 if (newNode.children && newNode.children.length > 0) { newNode.children = search(newNode.children); } // 如果节点有节点,或者它自身匹配关键词,则保留该节点 if (newNode.children && newNode.children.length > 0 || newNode.title.includes(keyword)) { searchResult.push(newNode); } }); return searchResult; }; return search(treeData); } ``` 你可以将这个函数绑定到搜索输入框的`onChange`事件,然后将返回的`searchResult`设置为表格数据
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值