el-tree 懒加载的实现以及局部刷新

整个树结构如下,使用懒加载实现,第一个按钮可以折叠收缩,第二个按钮刷新,第三个按钮新增第一级节点
在这里插入图片描述
新增第一级节点的弹窗
在这里插入图片描述
右侧悬浮显示操作按钮
在这里插入图片描述
在第一级右侧点击按钮新增第二级节点的弹窗
在这里插入图片描述

html代码

<el-aside style="width: 15%;border-right: 1px solid rgb(238, 238, 238);">
	<div style="display:flex">
			<div style="width:86%">
				<el-input class="tree-search-input" clearable prefix-icon="el-icon-search" placeholder="输入关键字进行过滤" size="mini" v-model="filterText" @input="filterChange($event)"></el-input>
			</div>
			<div style="display:flex;align-items:center;">
				<i style="margin-right:5px;font-size: 18px;font-weight: bold;" :title="expandNode?'收起':'展开'" :class="{'el-icon-full-screen':!expandNode,'el-icon-crop':expandNode}" @click="nodeExpand"></i>
				<i title="刷新" class="el-icon-refresh" style="margin-right:5px;font-size: 18px;font-weight: bold;" @click="getQmsProductTree"></i>
				<i title="新增" class="el-icon-plus" style="font-size: 18px;font-weight: bold;" @click="showDialog({NAME:'第一级目录',ID:0},'add')"></i>
			</div>
		</div>
		<el-tree class="my-el-tree" :data="treeData" highlight-current :expand-on-click-node="true" ref="elTree" :props="defaultProps" @node-click="handleNodeClick" :default-expand-all="expandNode" :filter-node-method="filterNode" lazy :load="loadNode" node-key="ID">
			<span class="custom-tree-node" slot-scope="{ node, data }">
				<span class="show-ellipsis" style="width: 90%" :title="node.NAME">{{ data.NAME }}</span>
				<el-dropdown size="mini" @command="menuHandleCommand">
					<span class="el-dropdown-link">
						<i title="更多操作" class="el-icon-more"></i>
					</span>
					<el-dropdown-menu slot="dropdown">
						<el-dropdown-item icon="el-icon-plus" :command="{ node: node, data, action: 'add' }">添加</el-dropdown-item>
						<el-dropdown-item icon="el-icon-edit" :command="{ node: node, data, action: 'edit' }">编辑</el-dropdown-item>
						<el-dropdown-item divided icon="el-icon-delete" :command="{ node: node, data, action: 'delete' }">删除</el-dropdown-item>
					</el-dropdown-menu>
				</el-dropdown>
			</span>
		</el-tree>
	</el-aside>

树节点新增编辑操作弹窗

<el-dialog class="custom-class" :title="modularTitle" :visible.sync="showMenuDialog" v-if="showMenuDialog" width="40%">
	<el-form label-width="130px" size="mini" ref="menuRuleForm" :model="menuRuleForm" :rules="menuRules">
		<el-form-item v-if="menuState===0" label="父节点:">
			<el-input style="width: 90%" v-model="menuRuleForm.PARENT_NAME" disabled></el-input>
		</el-form-item>
		<el-form-item label="目录名称:" prop="NAME">
			<el-input style="width: 90%" v-model="menuRuleForm.NAME" placeholder="请输入目录名"></el-input>
		</el-form-item>
	</el-form>
	<div align="center">
		<el-button size="mini" type="primary" @click="saveMenu">保 存</el-button>
		<el-button size="mini" @click="closeMenuDialog">取 消</el-button>
	</div>
</el-dialog>

js代码,refreshTreeNode方法如果是操作第一级节点就刷新整个树,如果操作的二级或三级节点则局部刷新, let node_ = this.$refs.elTree.getNode(id); node_.loaded = false; node_.expand();通过id获取父节点,通过收缩展开父节点实现父节点的刷新

//  懒加载树
  loadNode:function(node, resolve) {
      if (node.level === 0) {
        return resolve([]);
      }
      axios({
          url:`/magic/api/qms/tree/getChildrenData`,
          method:'post',
          data: {
              TYPE: 'PRC',
              ID: node.data.ID
          }
      }).then(res=>{
          if(res && res.data && res.data.data) {
              resolve(res.data.data);
          }
      })
  },
  //树根节点加载
  getQmsProductTree:function(){
      axios({
          url:`/tree/getChildrenData`,
          method:'post',
          data: {
              TYPE: 'PRC'
          }
      }).then(res=>{
          if(res && res.data && res.data.data) {
              if(res.data.data.length>0){
                  this.treeData=res.data.data
                  this.dic_id = res.data.data[0].ID
              }
          }
      })
   },
  //树节点点击加载列表
  handleNodeClick:function(data, node, obj) {
      this.dic_id=data.ID
      this.initData(1);
  },  
  //树形控件收起与展开功能
  nodeExpand:function(){
      this.expandNode = !this.expandNode
      let elTree = this.$refs.elTree;
      for (var i = 0; i < elTree.store._getAllNodes().length; i++) {
          elTree.store._getAllNodes()[i].expanded = this.expandNode;
      }
  },
  //树过滤
  filterNode:function(value, data, node) {
      if (!value) return true;
      return data.NAME.indexOf(value) !== -1;
  },
  //类型树形控件查询功能
  filterChange:function (val) {
      this.$refs.elTree.filter(val);
  },
  // 刷新树节点
  refreshTreeNode:function(PARENT_ID) {
      let id = PARENT_ID?PARENT_ID:this.menuRuleForm.PARENT_ID
      if(id && id !== '0'){
          let node_ = this.$refs.elTree.getNode(id)
          node_.loaded = false;
          node_.expand();
      }else{
          this.getQmsProductTree();
      }
  },
 //初始化调用一次接口
   init: function() {
       this.getQmsProductTree();
       this.initData(1);
   }, 
   //树的按钮增删改事件
   menuHandleCommand:function(command){
       let data = command.data;
	let action = command.action;
	switch (action) {
		case 'add':
			this.showDialog(data, action);
			break;
		case 'edit':
			this.showDialog(data, action);
			break;
		case 'delete':
			this.delSysType(data);
			break;
	}
   },
   //点击按钮打开弹框添加菜单
showDialog:function(data, action) {
	this.showMenuDialog = true;
	if (data) {
		if (action == 'add') {
			this.modularTitle = '新增';
			this.menuRuleForm = {
                   NAME:'',
                   PARENT_ID: data.ID,
                   PARENT_NAME: data.NAME
               };
               this.menuState = 0;

		} else if (action == 'edit') {
			this.modularTitle = '编辑';
           	this.menuRuleForm = {
                   NAME: data.NAME,
                   ID: data.ID,
                   PARENT_ID:data.PARENT_ID
               };
               this.menuState = 1;
		}
	}
},
//保存菜单
   saveMenu:function(){
       this.$refs.menuRuleForm.validate((valid)=>{
           if(valid) {
               let param = {
                   NAME: this.menuRuleForm.NAME
               }
               if(this.menuState === 0) {
                   param.PARENT_ID = this.menuRuleForm.PARENT_ID
                   param.TYPE = 'PRC'
               }
               if(this.menuState === 1) {
                   param.ID = this.menuRuleForm.ID
               }
               axios({
                   url:'/tree/save',
                   method:'post',
                   data: param
               }).then(res=>{
                   if(res.data.state){
                       this.$message({type: 'success',message: res.data.message});
                       this.showMenuDialog = false;
                       this.refreshTreeNode()
                   }else{
                       this.$message({type: 'error',message: res.data.message});
                   }
               })   
           }
       })
   },
//删除树数据
delSysType:function(data) {
	this.$confirm('是否确定删除?', '提示', {
		confirmButtonText: '确定',
		cancelButtonText: '取消',
		type: 'warning',
	}).then(() => {
		axios({
               url:'/tree/delete',
               method:'post',
               data: data
           }).then(res=>{
               if(res.data.state){
                   this.$message({type: 'success',message: res.data.message});
                   this.showMenuDialog = false;
                   this.refreshTreeNode(data.PARENT_ID)
               }else{
                   this.$message({type: 'error',message: res.data.message});
               }
           })
	});
},
//关闭菜单添加编辑按钮
closeMenuDialog:function(){
    this.showMenuDialog=false;
},
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
el-tree懒加载实现可以通过使用lazy属性和load方法结合来实现。首先,在el-tree组件中设置lazy属性为true,如lazy,表示开启懒加载功能。然后,通过设置load属性为一个方法,用于加载子树数据。load方法会在展开某个节点时被调用,然后根据节点的信息来获取子节点的数据,并将子节点的数据设置到其父节点的数据下,从而形成懒加载的效果。 具体实现的步骤如下: 1. 在el-tree组件中设置lazy属性为true,示例代码如下: <el-tree lazy :load="loadNode" ... ></el-tree> 2. 编写loadNode方法,该方法用于加载子树数据。根据节点的level属性来判断是父节点还是子节点。对于父节点,直接将父级数据放入resolve中,示例代码如下: async loadNode(node, resolve) { if (node.level === 0) { resolve(this.knowledgeDatas); } ... } 3. 对于子节点,根据节点信息发送请求获取子节点的数据,并将数据设置给其父节点。具体步骤如下: - 构建请求参数,根据需要传递的参数进行配置。 - 发送请求获取子节点的数据,可以使用异步请求的方式获取数据。 - 将子节点的数据进行处理,将数据格式转换为符合el-tree要求的格式。 - 使用updateKeyChildren方法将子节点的数据设置给其父节点,将子节点数据设置到父节点的children属性中。 - 将数据传递给resolve方法,使得el-tree组件能够渲染出子节点数据。 综上所述,el-tree懒加载实现主要包括设置lazy属性为true,编写loadNode方法来加载子树数据,并在loadNode方法中根据节点信息进行获取子节点数据的处理和设置。通过这种方式可以实现el-tree组件的懒加载效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Element-ui树形控件el-tree自定义增删改和局部刷新懒加载操作](https://download.csdn.net/download/weixin_38542223/13125838)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [el-tree懒加载](https://blog.csdn.net/m0_57311133/article/details/123844869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值