Element-ui树形控件el-tree自定义增删改和局部刷新及懒加载

本文详述Vue-cli项目中树形控件的配置与交互,包括默认展开一级节点、增删改操作及局部刷新数据。通过示例代码解析自定义节点、懒加载、拖拽节点等功能,实现高效数据管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求: vue-cli项目树形控件:一级节点为本地节点,默认展开一级节点,增删改后局部刷新数据

	        <el-tree 
                class="treeitems"
                :data="data"
                node-key="id"
                :props="defaultProps" 
                :load="loadNode"
                lazy
                :default-expanded-keys="[0]"
                @node-click="handleNodeClick"
                draggable
                :allow-drop="allowDrop"
                :allow-drag="allowDrag"
                 @node-drop="handleDrop"
                ref="tree"
            >
            <span class="custom-tree-node" slot-scope="{ node, data }">
                <span>{{ node.label }}</span>
                <span>
                    <i @click="() => append(node,data)" class="el-icon-plus"></i><!--增加分组-->
                    <!-- 根节点不需要删除和重命名 -->
                    <i v-if="data.id !== 0" @click="() => deletes(node,data)" class="el-icon-delete"></i><!--删除分组-->
                    <i v-if="data.id !== 0" @click="() => rename(node,data)" class="el-icon-edit"></i><!--重命名分组-->
                </span>
            </span>
         </el-tree>
data() {
      return {
        filterText: '',
        data: [{
            id:0,
            label: '中国',
            
        }],
        children: [{
                id:1,
                label: '北京',
                children: [{
                    id:11,
                    label: '通州'
                }]
            },
            {   
                id:2,
                label: '上海',
                leaf: true,
            },
            {   
                id:3,
                label: '山西',
                children:[{
                    id: 13,
                    label: '太原'
                },{
                    id: 14,
                    label: '阳泉'
                }]
            },{
                id:4,
                label: '黑龙江',
                children: [{
                    id:12,
                    label: '哈尔滨'
                }]
            }],
        defaultProps: {
          children: 'children',
          label: 'label',
          isLeaf: 'leaf'
        }
      };

点击增加节点弹出弹窗
这里也用的是element的弹窗,直接在methods里写:

		//点重命名事件
		append(node,data) {
           console.log(node,data,'增加')
           this.$prompt('节点名字', '增加节点', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                inputPattern: /^[\u4e00-\u9fa5]{0,}$/,//匹配全中文
                inputErrorMessage: '请输入中文'//不符合正则匹配的提示语句
                }).then(({ value }) => {
                    //可以在这里发请求,http是我模拟的一个虚假的封装好的axios请求,()可写请求参数
                    http().then((data)=>{
                        this.$message({
                            type: 'success',
                            message: '修改成功'
                        });  
                        //请求成功需局部刷新该节点,调用方法,把节点信息node传入
                        this.partialRefresh(node)
                    })
                    //请求失败
                    .catch(()=>{
                        this.$message({
                            type: 'info',
                            message: '修改失败'
                        });  
                    })
                }).catch(() => {
                    this.$message({
                        type: 'info',
                        message: '取消修改'
                    });       
            });
        },
        //实现局部刷新,在点击弹窗处调用的
        partialRefreshpartialRefresh(node){
            //设置loaded为false;模拟一次节点展开事件,加载重命名后的新数据;
            node.loaded = false;
            node.expand(); 
            //新建子节点是刷新一次本节点的展开请求,而重命名和删除则需要刷新父级节点的的展开事件,
            //可以设置node.parent.loaded = false;node.parent.expand();
        },

懒加载

		//懒加载
        loadNode(node, resolve){
            if (node.level === 0) {
                //本地的数据,一个承载中国字样的数组;
                return resolve(this.data);
            }
            else if(node.level === 1){
                //现在为模拟数据;
                //有真实数据,在resolve中放置请求回来的数据即可。
                //else同样也是。我这里是区分了两种请求方式。
                return resolve(this.children)
            }
            else{
                return resolve([])
            }
        },

拖拽节点

		 //拖拽==>拖拽时判定目标节点能否被放置
        allowDrop(draggingNode, dropNode, type){
            //参数:被拖拽节点,要拖拽到的位置
            //因为根目录是我本地写死的,不能有同级,所以我设置凡是拖拽到的level===1都存放到根节点的下面;
            if(dropNode.level===1){
                return type == 'inner';
            }
            else {
                return true;
            }
        },
        //拖拽==>判断节点能否被拖拽
        allowDrag(draggingNode){
	        //第一级节点不允许拖拽
            return draggingNode.level !== 1;
        },

需求改了,同级节点拖拽,拖拽完成后将排序结果返回后端:

//拖拽==>拖拽时判定目标节点能否被放置
        //后更改为只能同级拖拽
        allowDrop(draggingNode, dropNode, type) {
            if (draggingNode.level === dropNode.level) {
                if (draggingNode.data.parentId === dropNode.data.parentId) {
                    return type === 'prev' || type === 'next'
                }
            } else {
                // 不同级不允许拖拽
                return false
            }
        },
        //拖拽==>判断节点能否被拖拽
        allowDrag(draggingNode) {
            return draggingNode.level !== 1;
        },
        //拖拽成功完成时触发的事件,在这里可以将节点拖拽后的顺序返给后端
        handleDrop(node,data,type,event){
            let arr=[];
            //data为拖拽后节点信息,找到它的父级,在从父级找子集
            let child = data.parent.childNodes;
            for(var key in child){
                arr.push({id:child[key].data.id})
            }
            //转为JSON字符串发请求带走信息
            idSort(JSON.stringify(arr))

        }

 

在Vue中使用el-tree实现el-tree局部刷新的方法是通过更新节点的数据来实现。具体步骤如下: 1. 首先在Vue组件中定义el-tree的data属性,包括节点的id、label、children等属性。 2. 在组件的methods中定义一个方法,用于更新某个节点的数据。 3. 在el-tree节点点击事件(node-click)中调用该方法,传入要更新的节点的id。 4. 在更新方法中,使用Vue.set()方法来更新节点的数据。例如,如果要更新某个节点的label,可以使用Vue.set(data, index, newValue)来更新。 这样,在更新节点数据后,el-tree会自动重新渲染并展示最新的数据,实现局部刷新的效果。 请注意,如果需要通过懒加载方式获取节点的子节点信息,可以使用load方法,根据选中的节点id来获取子节点数据,并更新到对应节点的children属性中。这样 el-tree会自动展示新加载的子节点数据。 示例代码如下: ```vue <template> <el-tree :data="treeData" :props="defaultProps" @node-click="handleNodeClick"></el-tree> </template> <script> export default { data() { return { treeData: [ // 初始化的节点数据 ], defaultProps: { // 节点属性配置 } } }, methods: { handleNodeClick(node) { // 处理节点点击事件 // 获取点击的节点id,根据id更新节点数据 this.updateNodeData(node.id); }, updateNodeData(nodeId) { // 更新节点数据的方法 // 使用Vue.set()方法更新节点数据 Vue.set(this.treeData, index, newValue); } } } </script> ``` 请注意,根据提供的引用内容,具体的更新逻辑可能会有所不同。请根据你的具体业务需求来调整代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值