使用el-table做成树形结构并解决数据驱动视图问题

 更新时间:2024年07月25日 10:21:13   作者:爱跳舞的程序员  
这篇文章主要介绍了使用el-table做成树形结构并解决数据驱动视图问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

el-table做成树形结构并解决数据驱动视图问题

我们在完成一个树形表格后,需要对数据进行增删改查动作,同时让我们保存数据渲染到表格上。

这时我们就会发现一个大大滴问题!!!

我们在对第一层树状结构表格进行增删改后,再调取刷新列表方法是正常渲染的。但是我们给第一层增加子级时候,或者删除第二层内数据,亦或者修改第二层以内数据就会发现,调取的刷新列表方法是没有效果,我们再手动刷新页面后数据才会渲染上去?!! 

这个问题让我心里一咯噔,不会吧不会吧!!!又让我碰上这该s的难题o(╥﹏╥)o

我在网友博客上找到一种方法:lazyTreeNodeMap 是 el-table 组件中的一个属性,用于存储懒加载树节点的映射关系。

话不多说,开整!

整体架构流程

第一步:首先我们先把el-table的树形结构搭出来,如果还没有做好树形table表,可以看一下我之前文章有一遍如何搭建的

<el-table
		ref="tableRef"
		lazy
		border
		highlight-current-row
		height="300"
		row-key="listId"
		style="width: 100%; margin-bottom: 10px"
		:load="load"
		:data="list"
		:default-expand-all="isExpandAll"
		:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
>

第二步:我们在data里面声明一个map来存储我们load回调数据

maps: new Map(),

第三步:加载子节点数据的函数,lazy 为 true 时生效,函数第二个参数包含了节点的层级信息。

这里获取子节点数据,同时把加载子节点数据存进maps

load(tree, treeNode, resolve) {
	this.maps.set(tree.listId, { tree, treeNode, resolve });
	getUdmBppjDataList({ listId: tree.listId }).then((res) => {
		const childList = res.rows;
		// 必要设置,不然没有下级图标
		childList.forEach((item) => {
			(item.hasChildren = true), (item.children = null);
		});
		setTimeout(() => {
			resolve(childList);
		}, 200);
	});
},

第四步:这个是刷新的方法 ,主要是刷新子级列表数据的方法,我们在增加、修改、删除子级时候调用这个方法。如果为你对最外层进行增删改查不需要调用该方法。

整编文章精髓主要在这段代码上: this.$refs.tableRef.store.states.lazyTreeNodeMap

refresh(parentId) {
	// 根据父级id取出对应节点数据
	const { row, treeNode, resolve } = this.maps.get(parentId);
	// 通过接口获取想要刷新的 父节点里面所有子节点数据的数组
	getUdmBppjDataList({ listId: parentId }).then((res) => {
		res.rows.forEach((item) => {
			// 必要设置,不然没有下级图标
			item.hasChildren = true;
			item.children = null;
		});
		// 这个是刷新的方法 最后一个参数是最新的子节点数据的数组--相当于吧新数组替换旧数组
		this.$set(this.$refs.tableRef.store.states.lazyTreeNodeMap, parentId, res.rows);
	});
 
	if (row) {
		this.load(row, treeNode, resolve);
	}
},

第五步:这是我调用上面的我们写的刷新的方法。

tip:一定要注意执行顺序,负责会出现线程问题,有时候能增加成功有时候又不行!!!

if (this.titleDialog === '增加同级部件信息') {
	postUdmBppjDataList(obj).then((res) => {
		this.$message({
			message: '增加同级部件信息成功!',
			type: 'success',
			duration: 1000,
		});
		this.getList();
		// 当table 里面没有数据时候不调用 refresh 和 当点击第一层时候也不调用
		if (this.list.length > 0 && this.list[0].parentListId !== this.rowData.parentListId) {
			this.refresh(this.rowData.parentListId);
		}
	});
} 

第六步:去尝试我们写的方法吧!

技术名词解释

load(tree, treeNode, resolve):

  • tree:表示当前的树形数据结构,通常是整棵树的数据。在调用 load 方法时,会传入当前的树形数据结构,您可以通过该参数获取整棵树的数据。
  • treeNode:表示当前需要加载子节点数据的树节点对象。在调用 load 方法时,会传入需要加载子节点数据的树节点对象,您可以通过该参数获取该节点的相关信息,如节点数据、父节点等。
  • resolve:是一个回调函数,用于在获取子节点数据后进行回调处理。您需要在 load 方法中获取子节点数据,并在获取数据后调用 resolve 函数并传入子节点数据,以告知 el-table 组件加载成功并渲染子节点数据。

总结

这里的难点就是不知道有 lazyTreeNodeMap 这个属性,和使用他的方法!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用vue + less 实现简单换肤功能的示例

    使用vue + less 实现简单换肤功能的示例

    下面小编就为大家分享一篇使用vue + less 实现简单换肤功能的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 深入理解Vue父子组件生命周期执行顺序及钩子函数

    深入理解Vue父子组件生命周期执行顺序及钩子函数

    本文通过实例代码给大家介绍了Vue父子组件生命周期执行顺序及钩子函数的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-08-08
  • 如何解决vuex在页面刷新后数据被清除的问题

    如何解决vuex在页面刷新后数据被清除的问题

    这篇文章主要介绍了如何解决vuex在页面刷新后数据被清除的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • vue3.0 子组件如何修改父组件传递过来的值

    vue3.0 子组件如何修改父组件传递过来的值

    这篇文章主要介绍了vue3.0 子组件如何修改父组件传递过来的值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue仿淘宝滑动验证码功能(样式模仿)

    vue仿淘宝滑动验证码功能(样式模仿)

    淘宝大家都使用过,淘宝滑动验证码的目的是为了验证到底是人还是机器,今天小编给大家分享的是模仿淘宝滑动验证码的样式,感兴趣的朋友跟随小编一起看看吧
    2019-12-12
  • 使用vue3+vite导入图片路径错乱问题排查及解决

    使用vue3+vite导入图片路径错乱问题排查及解决

    使用vue3+vite开发的时候,导入svg图片时,同一个文件夹下的文件,其中一个路径正常解析,另一个不行,更改文件名之后,该图片文件就可以正常解析了,本文给大家介绍了使用vue3+vite导入图片路径错乱问题排查及解决,需要的朋友可以参考下
    2024-03-03
  • vue实现日历备忘录功能

    vue实现日历备忘录功能

    这篇文章主要为大家详细介绍了vue实现日历备忘录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • vue.js调用python脚本并给脚本传数据

    vue.js调用python脚本并给脚本传数据

    在有些情况下需要使用不同的语言来完成一个项目,因此就有可能出现不同语言的程序之间的相互调用,下面这篇文章主要给大家介绍了关于vue.js调用python脚本并给脚本传数据的相关资料,需要的朋友可以参考下
    2024-03-03
  • vue中实现高德定位功能

    vue中实现高德定位功能

    这篇文章主要介绍了vue中实现高德定位功能,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • vue中的axios配置及接口请求路径api配置

    vue中的axios配置及接口请求路径api配置

    这篇文章主要介绍了vue中的axios配置及接口请求路径api配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09

最新评论