更新记录

1.0.0(2025-07-23) 下载此版本

版本号1.0.0


平台兼容性

uni-app

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
- - - - - - -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 快应用-华为 快应用-联盟
- - - - - - - - × ×

其他

多语言 暗黑模式 宽屏模式
× ×

🎄 shanTree 树形组件文档

shanTree 是一个高性能的 uni-app 树形组件,采用扁平数组和循环方式实现无限级树形结构,支持懒加载等特性。

🔨 基本用法

<template>
    <view class="content">
            <shanTree :showCheckbox="true" :showLevel="1" :data="treeData" :lazy="true" :load="handleLoadFun"
                @clickNode="handleClickNode" @checkboxChange="handleCheckboxChange" @extendNode="handleExtendNode">
            </shanTree>
    </view>
</template>

<script>
let that;
import shanTree from 'uni_modules/hashan-shanTree/wxcomponents/index'
export default {
    components: { shanTree },
    data() {
        return {
            treeData: []
        }
    },
    onLoad() {
        that = this;
        this.generateSampleData()
    },
    methods: {
        // 生成示例数据
        generateSampleData() {
            const data = [];
            let id = 1;
            // 生成根节点
            for (let i = 1; i <= 5; i++) {
                const rootNode = {
                    id: id++,
                    label: `根节点 ${i}`,
                    children: [],
                    level: 0,
                    ***: true
                };

                // 添加二级节点
                for (let j = 1; j <= 4; j++) {
                    const childNode = {
                        id: id++,
                        label: `子节点 ${i}-${j}`,
                        children: [],
                        level: 1,
                        ***: j % 2 === 0
                    };

                    // 添加三级节点
                    if (j % 2 === 0) {
                        for (let k = 1; k <= 3; k++) {
                            const grandChild = {
                                id: id++,
                                label: `孙节点 ${i}-${j}-${k}`,
                                level: 2,
                                ***: true,
                                count: Math.floor(Math.random() * 10) + 1
                            };
                            childNode.children.push(grandChild);
                        }
                    }

                    rootNode.children.push(childNode);
                }

                data.push(rootNode);
            }
            console.log('data', data);
            this.treeData = data;
        },

        //模拟加载
        loadChildren(node) {
            return new Promise((resolve) => {
                // 模拟异步加载
                setTimeout(() => {
                    const children = [];
                    for (let i = 1; i <= 5; i++) {
                        children.push({
                            id: node.id * 10 + i,
                            label: `子节点 ${node.label}-${i}`,
                            level: node.level + 1,
                            ***: true,
                            children: []
                        });
                    }
                    resolve(children);
                }, 1000);
            })
        },
        // 懒加载方法
        handleLoadFun(node, resolve) {
            that.loadChildren(node).then((children) => {
                resolve(children);
            });
        },
        // 点击节点方法
        handleClickNode(node) {
            console.log('handleClickNode', node);
        },
        // 选择框状态变化方法
        handleCheckboxChange(node) {
            console.log('handleCheckboxChange', node);
        },
        // 展开/折叠方法
        handleExtendNode(node) {
            console.log('handleExtendNode', node);
        }

    }
}
</script>

📚 属性

参数 说明 类型 默认值
data 树数据 Array []
nodeKey 节点标识字段名 String 'id'
props 配置选项 Object { children: 'children', label: 'label', isLeaf: '***' }
lazy 是否懒加载子节点 Boolean false
load 加载子树数据的方法 Function -
showCheckbox 节点是否可被选择 Boolean false
showLevel 显示选择框的层级 Number 0

🛠 方法

方法名 说明 参数
loadFun 懒加载方法 node

🎨 事件

事件名 说明 回调参数
extendNode 节点展开/折叠时触发 当前节点
checkboxChange 复选框状态变化时触发 当前选中节点
clickNode 点击节点时触发 当前点击节点

🌟 特性

🚀 高性能

  • 采用扁平数组结构,避免递归带来的性能问题
  • 大数据量流畅渲染

🌳 功能丰富

  • 支持无限级树形结构
  • 支持懒加载
  • 支持节点选择
  • 支持自定义节点内容
  • 支持展开/折叠状态控制

💡 实现原理

  1. 数据结构优化

    • 使用 flattenedTree 扁平数组存储所有可见节点
    • 通过 level 控制缩进层级
    • 通过 expanded 控制展开状态
  2. 性能优化点

    // 示例代码片段
    flattenTree() {
     const stack = [...this.treeData].reverse();
     while (stack.length) {
       const node = stack.pop();
       // ...处理节点
       if (node.expanded && node.children?.length) {
         stack.push(...[...node.children].reverse());
       }
     }
    }

    📝 使用建议

  3. 对于大数据量,建议开启懒加载

  4. 节点数据建议包含以下字段:

    {
     id: 1,
     label: '节点名称',
     ***: true, // 是否可能有子节点
     children: [], // 子节点数组
     level: 0, // 层级
     expanded: false // 是否展开
    }

🐛 常见问题

: 懒加载的节点无法展开?
A: 确保返回的子节点数据包含必要的属性:level, `
` 等

***: 节点状态不更新?
A: 使用 this.$set 确保响应式更新,如:

this.$set(node, 'expanded', true);

***: 懒加载方法无法使用 A: 确保 this 指向正确的上下文,如:let that = this;

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问