Skip to content

RNTreePanel 树形面板组件

组件介绍

RNTreePanel 是一个树形结构展示组件,基于 Naive UI 的 NTree 封装,支持异步加载、搜索过滤、拖拽等功能。

基础用法

使用ajax

数据多选

关联加载

Props

属性名类型默认值说明
dataArray[]树形数据源
ajaxFunctionnull异步加载数据的函数
checkablebooleanfalse是否显示复选框
selectablebooleantrue节点是否可选择
draggablebooleanfalse是否允许拖拽
expandOnClickbooleanfalse是否点击节点时展开
filterByLabelbooleantrue是否根据标签过滤
showLinebooleanfalse是否显示连接线
immediatebooleantrue是否在组件加载时立即请求数据

数据项格式

每个树节点对象应包含以下字段:

  • key (string | number): 节点的唯一标识
  • label (string): 节点显示的文本
  • children (Array, 可选): 子节点数组
  • disabled (boolean, 可选): 是否禁用该节点

事件说明

事件名说明回调参数
select节点被选中时触发(keys: Array, nodes: Array)
check节点被勾选时触发(keys: Array, nodes: Array)
expand节点展开/收起时触发(keys: Array, nodes: Array)
dragend拖拽结束时触发(info: Object)
load异步加载完成时触发(node: Object)

插槽

插槽名说明
default自定义节点内容
empty无数据时的内容
prefix节点前缀内容
suffix节点后缀内容

使用示例

基础用法

vue
<template>
  <rn-tree-panel :data="treeData" checkable selectable @select="handleSelect" />
</template>

<script setup>
import { ref } from 'vue';

const treeData = ref([
  {
    key: '1',
    label: '节点1',
    children: [
      { key: '1-1', label: '子节点1' },
      { key: '1-2', label: '子节点2' },
    ],
  },
  {
    key: '2',
    label: '节点2',
  },
]);

const handleSelect = (keys, nodes) => {
  console.log('Selected:', keys, nodes);
};
</script>

异步加载

vue
<template>
  <rn-tree-panel
    :ajax="loadTreeData"
    :expand-on-click="true"
    :immediate="true"
  />
</template>

<script setup>
const loadTreeData = async (node) => {
  // 模拟异步请求
  const response = await fetch(
    `/api/tree-nodes?parentId=${node?.key || 'root'}`,
  );
  return await response.json();
};
</script>

自定义节点内容

vue
<template>
  <rn-tree-panel :data="treeData">
    <template #default="{ node }">
      <div class="custom-node">
        <span>{{ node.label }}</span>
        <n-button size="small" @click="handleAction(node)"> 操作 </n-button>
      </div>
    </template>
  </rn-tree-panel>
</template>

注意事项

  1. 数据源中的节点必须包含唯一的key和label属性
  2. 使用异步加载时,需要正确处理loading状态
  3. 拖拽功能需要注意数据结构的完整性
  4. 大数据量时建议使用虚拟滚动优化性能
  5. ajax函数必须返回符合节点格式的数据数组

基于 MIT 许可发布.