React将数据转化成树形结构

1、React将数据转化成树形结构


// 初始数据
let result = [
  { parentId: null, id: 1, name: "书籍", count: 100 },
  { parentId: 1, id: 2, name: "西游记", count: 50 },
  { parentId: 1, id: 3, name: "红楼梦", count: 10 },
  { parentId: 1, id: 4, name: "水浒传", count: 20 },
  { parentId: 1, id: 5, name: "三国演义", count: 20 },
  { parentId: null, id: 6, name: "文具", count: 10 },
  { parentId: 6, id: 7, name: "铅笔", count: 5 },
  { parentId: 6, id: 8, name: "橡皮", count: 5 },
];

const getTreeData = (treeData, parentId) => {
  // 把数据转化为树型结构
  let tree = [];
  let currentParentId = parentId || null;
  for (let i = 0; i < treeData.length; i += 1) {
    if (treeData[i]) {
      if (treeData[i].parentId === currentParentId) {
        tree.push(treeData[i]);
      }
    }
  }
  for (let j = 0; j < tree.length; j += 1) {
    if (tree[j]) {
      let children = getTreeData(treeData, tree[j].id);
      if (children && children.length) {
        tree[j].children = children;
      }
    }
  }
  return tree;
};

// 树形数据
let data = getTreeData(result);
console.log(data);
/*[
    {
        parentId: null,
        id:1,
        name:'书籍',
        count:100,
        children:[
            {parentId:1,id:2,name:'西游记',count: 50},
            {parentId:1,id:3,name:'红楼梦',count: 10},
            {parentId:1,id:4,name:'水浒传',count: 20},
            {parentId:1,id:5,name:'三国演义',count: 20},
        ]
    },
    {
        parentId: null,
        id:6,
        name:'文具',
        count:10,
        children:[
            {parentId:6,id:7,name:'铅笔',count:5},
            {parentId:6,id:8,name:'橡皮',count:5},
        ]
    }
]*/

2、实例(react antd table树形数据)

线上地址:react antd table 树形结构数据


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

const Test = () => {
  const [expandedRowKeys, setExpandedRowKeys] = useState([]);
  const [dataSource, setDataSource] = useState([]);
  const columns = [
    {
      title: '名称',
      key: 'name',
      dataIndex: 'name',
    },
    {
      title: '描述',
      key: 'desc',
      dataIndex: 'desc',
    },
  ];
  const onExpandTable = (expanded, record) => {
    let arr = expandedRowKeys;
    if (expanded) {
      arr.push(record.id);
    } else {
      arr.splice(
        arr.findIndex((i) => i === record.id),
        1
      );
    }
    setExpandedRowKeys(arr);
  };

  const getTreeData = (treeData, parentId) => {
    // 把数据转化为树型结构
    let tree = [];
    let currentParentId = parentId || null;
    for (let i = 0; i < treeData.length; i += 1) {
      if (treeData[i]) {
        if (treeData[i].parentId === currentParentId) {
          tree.push(treeData[i]);
        }
      }
    }
    for (let j = 0; j < tree.length; j += 1) {
      if (tree[j]) {
        let children = getTreeData(treeData, tree[j].id);
        if (children && children.length) {
          tree[j].children = children;
        }
      }
    }
    return tree;
  };

  useEffect(() => {
    const res = [
      {
        parentId: null,
        id: '0e02f058-65fc-4e47-82d5-3aaf95f816cd',
        name: '中国',
        desc: '中国陆地面积约9600000平方千米',
      },
      {
        parentId: '0e02f058-65fc-4e47-82d5-3aaf95f816cd',
        id: '03014a12-3948-4f8a-b182-ed8b6d58a7ea',
        name: '四川',
        desc: '四川地域面积约486000平方公里',
      },
      {
        parentId: '0e02f058-65fc-4e47-82d5-3aaf95f816cd',
        id: '201f9c09-f2e8-4bea-917e-b5fdc56d9e24',
        name: '山东',
        desc: '陆域面积约155800平方公里',
      },
      {
        parentId: '03014a12-3948-4f8a-b182-ed8b6d58a7ea',
        id: '305d7648-9e3e-4b25-a246-3be08344434e',
        name: '成都',
        desc: '成都地域面积约14335平方公里',
      },
      {
        parentId: '201f9c09-f2e8-4bea-917e-b5fdc56d9e24',
        id: '3898961f-7487-46d6-8595-f2dfac59b116',
        name: '济南',
        desc: '济南地域面积约10244.45平方公里',
      },
    ];
    let data = getTreeData(res);
    console.log('data: ', data);
    setDataSource(data);
  }, []);
  return (
    <>
      <Table
        columns={columns}
        dataSource={dataSource}
        rowKey={(record) => record.id}
        expandedRowKeys={expandedRowKeys}
        onExpand={onExpandTable}
        pagination={false}
      />
    </>
  );
};

export default Test;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于 React 树形结构穿梭框,你可以使用第三方库来实现。一个常用的库是 `rc-tree-transfer`,它提供了一个可定制的树形结构穿梭框组件。 首先,你需要安装该库: ```bash npm install rc-tree-transfer ``` 然后,你可以在你的组件引入并使用它: ```jsx import React from 'react'; import TreeTransfer from 'rc-tree-transfer'; import 'rc-tree-transfer/assets/index.css'; const DemoComponent = () => { // 定义树形结构穿梭框的数据 const treeData = [ { key: '1', title: 'Node 1' }, { key: '2', title: 'Node 2', children: [ { key: '2-1', title: 'Child Node 1' }, { key: '2-2', title: 'Child Node 2' }, ]}, { key: '3', title: 'Node 3' }, ]; // 处理选节点变化的回调函数 const handleChange = (targetKeys, direction, moveKeys) => { console.log(targetKeys, direction, moveKeys); // 在这里处理选节点变化的逻辑 }; return ( <TreeTransfer dataSource={treeData} targetKeys={[]} // 初始选的节点 onChange={handleChange} render={(item) => item.title} // 自定义节点渲染 /> ); }; export default DemoComponent; ``` 在上面的示例,`treeData` 是树形结构数据,`targetKeys` 是初始选的节点,`handleChange` 是处理选节点变化的回调函数。你还可以通过 `render` 属性来自定义节点的渲染。 需要注意的是,你还需要引入 `rc-tree-transfer` 的样式文件,以便正确渲染组件。以上就是一个简单的使用示例,你可以根据自己的需求进行进一步的定制和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

likepoems

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

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

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

打赏作者

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

抵扣说明:

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

余额充值