el-tree实现懒加载,同时获取节点对应的数据并展示

本文介绍了如何在Vue.js项目中使用el-tree组件实现懒加载功能,当点击树节点时动态加载下级目录并展示相关数据。文章详细展示了界面样式和方法实现,包括treeData、defaultProps、loadNode、node-click等关键属性和方法的使用,以及与后台接口的交互逻辑。
摘要由CSDN通过智能技术生成


前言

记录一个简单的功能:el-tree懒加载。
点击树节点,加载下一级目录,同时调用接口展示该节点中的数据。
做完的效果大概是这样:
在这里插入图片描述

这里记录一下处理方法。


提示:以下是本篇文章正文内容,下面案例可供参考

一、界面样式

<el-row>
	// 左侧树形结构
	<el-col :span="5">
        <el-tree :data="treeData" :props="defaultProps"
          :load="loadNode" lazy class="left-menu"
          @check-change="handleCheckChange" @node-click="handleGetTableList" >
        </el-tree>
	</el-col>
	// 右侧表格数据
	<el-col :span="19">
          <div slot="head" class="head-form">
            <el-form :inline="true">
              <el-form-item label="名称:" class="no-margin-bottom">
                <el-input v-model="form.name" placeholder="请输入" clearable @clear="handleGetSearchList()"/>
              </el-form-item>
              <el-form-item class="no-margin-bottom">
                <el-button size="mini" type="primary" @click="handleGetSearchList()"
                  >搜索</el-button
                >
              </el-form-item>
              <el-form-item label="范围:" class="no-margin-bottom">
                <el-radio-group v-model="catalogType" @input="getCatalogType">
                  <el-radio :label="1">当前目录</el-radio>
                  <el-radio :label="2">所有目录</el-radio>
                </el-radio-group>
              </el-form-item>
              <el-form-item style="position:absolute; right: 10px">
                <el-button icon="el-icon-close" @click="beforeClose"></el-button>
              </el-form-item>
            </el-form>
          </div>
          <div slot="content">
            <el-table ref="multipleTable" v-scrollBar="'ScrollBarFlage'"
              :data="tableData" class="table-warp"
              highlight-current-row height="calc(100% - 30px)"
              v-loading.fullscreen.lock="loading"
              :element-loading-background="constType.RGBA"
              :element-loading-text="constType.LOADINGTEXT"
              @selection-change="handleSelectionChange">
            >
              <el-table-column type="selection" width="55"></el-table-column>
              <el-table-column label="类型" width="50px">
                <template slot-scope="scope">
                  <img v-if="scope.row.leaf"
src="https://opxr.oppeinsoft.com/Content/images/folder.png"
                  />
                </template>
              </el-table-column>
              <el-table-column label="方案" prop="name"> </el-table-column>
              <el-table-column label="图片">
                <template slot-scope="scope">
                  <el-image style="width: 100px; height: 100px" 
                    :src="scope.row.url"
                    :preview-src-list="[scope.row.url]">
                  </el-image>
                </template>
              </el-table-column>
              <el-table-column label="文件目录" prop="catalogname" :show-overflow-tooltip="true"> </el-table-column>
              <el-table-column label="操作">
                <template slot-scope="scope">
                  <img src="http://opxr.oppeinsoft.com/Content/images/02_60.png" alt=""
                    @click="handleFunc(scope.row)"
                  />
                </template>
              </el-table-column>
            </el-table>
            <div>
              <el-pagination
                @current-change="handleCurrentChange"
                :current-page.sync="pageNum"
                layout="total, prev, pager, next, jumper"
                :total="total"
                :page-size="pageSize"
              >
              </el-pagination>
            </div>
          </div>
	</el-col>
</el-row>

在上面代码中,画面被标签分成了左右两部分。
左侧是本篇文章的主角:树状结构的懒加载功能。

<el-tree :data="treeData" :props="defaultProps"
          :load="loadNode" lazy class="left-menu"
          @node-click="handleGetTableList" >
</el-tree>
  • treeData定义了树状结构绑定的数据;
  • defaultProps用来配置树状结构的ID,Name等属性;
  • load和lazy是成对出现的,这两个属性代表对树结构应用懒加载;
  • node-click用来监听树状结构的点击动作,加载右侧节点对应的表格数据。

二、方法实现

export default {
  name: 'editPromotion',
  props: {
    editPromotionShow: { type: Boolean, default: false }
  },
  data() {
    return {
      title: "",
	  form: {},
	  uid: "",
	  pageNum: 1,
	  pageSize: 10,
	  total: 0,
	  tableData: [],
	  keyWord: "",
	  loading: false,
	  resourcesEditShow: false,
	  rowData: {},
	  treeList: {},
	  bindLabel: [],
	  editNormsShow: false,
	  treeData: [
	    {
	      name: "厨电厨配",
	      id: "c6bb2334-55f1-4059-a8d6-92f3df273613"
	    }
	  ],
	  defaultProps: {
	    children: "children",
	    label: "name"
	  },
	  checkedNode: "",
	  catalogType: 2,
	  dialogVisible: false,
	  curSelectTable: []
    }
  },
  watch: {},
  mounted() {
  	// 初始状态获取右侧表格数据
    this.getSearchList();
  },
  methods: {
  	// 此方法对应树结构的懒加载功能,点击节点时,会判断是否是根节点
    loadNode(node, resolve) {
    	// 如果是根节点,不用调用接口,直接赋值
	    if (node.level === 0) {
	      return resolve(this.treeData);
	    }
	    // 如果不是根节点,调用接口,获取该节点下的子节点
	    this.handleClickNode(node.data, resolve)
	  },
	  // 根据传入的父节点ID,获取子节点数据,使用resolve加到当前节点下
	  handleClickNode(data, resolve) {
	    this.checkedNode = data;
	    // 设置选中【当前目录】
	    this.catalogType = 1
	    this.getResourceMenuList(data.id, resolve);
	  },
	  // 点击节点,获取表格数据
	  handleGetTableList(data) {
	    this.checkedNode = data;
	    this.catalogType = 1
	    // 判断是否是末端节点,如果是,则调用接口获取节点对应的数据
	    if (data.leaf) {
	      this.getSearchList(data.id);
	    }
	  },
	  // 分页点击事件
	  handleCurrentChange(val) {
	    this.pageNum = val;
	    if (this.catalogType == 1) {
	      this.getSearchList(this.checkedNode.id);
	    } else {
	      this.getSearchList();
	    }
	  },
	  // 获取左侧列表的下级目录
	  async getResourceMenuList(id, resolve) {
	    this.loading = true;
	    let params = {
	      parentCode: id,
	      current: this.pageNum,
	      size: this.pageSize
	    };
	    await request("getResourceMenuList", params)
	      .then(res => {
	        if (res && res.code === 0) {
	          if (res.data.records.length > 0) {
	            resolve(res.data.records)
	          } else {
	            resolve([])
	          }
	        } else {
	          resolve([])
	        }
	      })
	      .finally(err => {
	        this.loading = false;
	      });
	  },
	  // 调用搜索接口
	  getSearchList(id) {
	    this.loading = true;
	    let params = {
	      zyType: id ? id : "",
	      keyword: this.form.name ? this.form.name.trim() : null,
	      current: this.pageNum,
	      size: this.pageSize
	    };
	    request("getResourceManageList", params)
	      .then(res => {
	        if (res && res.code === 0) {
	          let { data } = res;
	          this.tableData = data.records;
	          this.total = data.total;
	        }
	      })
	      .finally(err => {
	        this.loading = false;
	      });
	  },
	  // 根据搜索输入框中的内容,查询对应节点的数据
	  handleGetSearchList() {
	    this.pageNum = 1;
	    this.pageSize = 10;
	    if (this.catalogType == 2) {
	      this.getSearchList()
	    } else {
	      this.getSearchList(this.checkedNode.id);
	    }
	  },
	  // 记录右侧表格中选中的行数据
	  handleSelectionChange(value) {
	    this.curSelectTable = value.map(item => {
	      return {
	        productDirId: this.$parent.curEditRowId,
	        zyname: item.name,
	        zyid: item.id,
	        image: item.url,
	        catalogName: item.catalogname,
	        zytypeid: item.zytypeid
	      }
	    })
	  },
	  // 监听【当前目录】和【所有目录】的切换
	  getCatalogType(value) {
	    this.pageNum = 1;
	    // 如果选中【所有目录】,则不传过滤参数,直接获取全部数据
	    if (value === 2) {
	      this.getSearchList()
	      // 如果选中【当前目录】,则传入当前节点的ID,获取指定数据
	    } else {
	      this.getSearchList(this.checkedNode.id);
	    }
	  }
  }
}
</script>

总结

记录一下,方便以后使用。

el-tree懒加载模式下,想要实现数据回显,需要注意几个方面。首先,需要在组件刚渲染的时候,就构造想要的树节点,可以通过设置default-expanded-keys属性来表示默认展开节点的key数组。这样el-tree-select会按照这个keys数组自动调用loadNode方法,获取数据并渲染树节点。 其次,需要在代码中处理数据回显的逻辑。可以通过在change事件中获取已勾选的节点,并将其对应的key保存到一个数组中,最后将这个数组传给后端。例如,在hChangeTree方法中,可以通过this.$refs.tree.getCheckedNodes()获取已勾选的节点,然后循环遍历这些节点,将它们的entityId保存到一个数组中,最后使用vuex的commit方法将这个数组保存起来。这样就实现数据的回显功能。 总之,要实现el-tree懒加载数据的回显,需要在组件渲染时构建想要的树节点,并在代码中处理数据回显的逻辑。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Element Plus的el-tree-select组件,懒加载 + 数据回显](https://blog.csdn.net/qq_38118138/article/details/126659253)[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: 33.333333333333336%"] - *2* [详解如何实现Element树形控件Tree懒加载模式下的动态更新](https://download.csdn.net/download/weixin_38609571/12943439)[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: 33.333333333333336%"] - *3* [el-tree懒加载回显数据](https://blog.csdn.net/qq_30351747/article/details/123640964)[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: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值