Naive UI 获取树tree完整选中树结构(通用方法,也适用于其他自定义组件)

这篇具有很好参考价值的文章主要介绍了Naive UI 获取树tree完整选中树结构(通用方法,也适用于其他自定义组件)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

截止文章记录前,Naive UI 并未提供直接获取,与选中叶子节点相关的完整树结构数据方法,记录一下前端实现方法。

数据准备:

数据准备:树结构初始数据,选中相关的数据

// 初始树结构数据
let dataSetData = [
	{
		id: '1',
		text: '节点1',
		nodeuuid: '1',
		pnodeId: null,
		children: []
	},
	{
		id: '2',
		text: '节点2',
		nodeuuid: '2',
		pnodeId: null,
		children: [
			{
				id: '2-1',
				text: '节点2-1',
				nodeuuid: '2-1',
				pnodeId: '2',
				children: []
			},
			{
				id: '2-2',
				text: '节点2-2',
				nodeuuid: '2-2',
				pnodeId: '2',
				children: [
					{
						id: '2-2-1',
						text: '节点2-2-1',
						nodeuuid: '2-2-1',
						pnodeId: '2-2',
						children: []
					}
				]
			},
			{
				id: '2-3',
				text: '节点2-3',
				nodeuuid: '2-3',
				pnodeId: '2',
				children: []
			}
		]
	},
	{
		id: '3',
		text: '节点3',
		nodeuuid: '3',
		pnodeId: null,
		children: []
	},
	{
		id: '4',
		text: '节点4',
		nodeuuid: '4',
		pnodeId: null,
		children: []
	},
	{
		id: '5',
		text: '节点5',
		nodeuuid: '5',
		pnodeId: null,
		children: [
			{
				id: '5-1',
				text: '节点5-1',
				nodeuuid: '5-1',
				pnodeId: '5',
				children: []
			},
			{
				id: '5-2',
				text: '节点5-2',
				nodeuuid: '5-2',
				pnodeId: '5',
				children: []
			}
		]
	}
]

// 选中相关的数据
let datasetCheckedNodes = [
	{
		id: '2',
		text: '节点2',
		nodeuuid: '2',
		pnodeId: null,
		children: [
			{
				id: '2-1',
				text: '节点2-1',
				nodeuuid: '2-1',
				pnodeId: '2',
				children: []
			},
			{
				id: '2-2',
				text: '节点2-2',
				nodeuuid: '2-2',
				pnodeId: '2',
				children: [
					{
						id: '2-2-1',
						text: '节点2-2-1',
						nodeuuid: '2-2-1',
						pnodeId: '2-2',
						children: []
					}
				]
			},
			{
				id: '2-3',
				text: '节点2-3',
				nodeuuid: '2-3',
				pnodeId: '2',
				children: []
			}
		]
	},
	{
		id: '2-3',
		text: '节点2-3',
		nodeuuid: '2-3',
		pnodeId: '2',
		children: []
	},
	{
		id: '2-2',
		text: '节点2-2',
		nodeuuid: '2-2',
		pnodeId: '2',
		children: [
			{
				id: '2-2-1',
				text: '节点2-2-1',
				nodeuuid: '2-2-1',
				pnodeId: '2-2',
				children: []
			}
		]
	},
	{
		id: '2-2-1',
		text: '节点2-2-1',
		nodeuuid: '2-2-1',
		pnodeId: '2-2',
		children: []
	},
	{
		id: '4',
		text: '节点4',
		nodeuuid: '4',
		pnodeId: null,
		children: []
	},
	{
		id: '5-2',
		text: '节点5-2',
		nodeuuid: '5-2',
		pnodeId: '5',
		children: []
	}
]

 实现步骤,一共四步,如下: 

// 0.设置每个节点唯一标识nodeuuid,相关父节点标识pnodeId(若初始树结构数据每个节点已有唯一标识,相关父节点标识,可跳过该步骤)
// dataSetData = addParentData(res, null)
// 1.设置相关树节点映射
const treeMap = setMap()
// 2.获取所有选中的叶子节点(目的是为了获取所有选中的叶子节点,可使用其他方法获得)
const leafNodes = datasetCheckedNodes.filter(v => v && (!v.children || v.children.length == 0))
// 3.获取所有和子节点相关,被勾选的根父节点集合(包含已勾选和未勾选数据,通过是否勾选标识区分)
const rootNodes = getAllCheckedRootNodes(leafNodes, treeMap)
// 4.删除未选中标识数据,获取重组后的完整树结构数据
const treeData = getCheckedTree(rootNodes, leafNodes)

console.log('重组后的完整树结构数据', treeData)

实现函数方法如下: 文章来源地址https://www.toymoban.com/news/detail-849638.html

/**
 * 递归遍历赋值当前节点的父节点,设置每个节点唯一标识nodeuuid,相关父节点标识pnodeId
 * @param treeData 初始树结构数据
 * @param pnodeId 父节点Id
 * @returns treeData 处理后的树结构数据
 */
function addParentData(treeData, pnodeId) {
	for (var i in treeData) {
		treeData[i].scopedSlots = {
			title: 'custom'
		}
		treeData[i].nodeuuid = uuidv4()
		treeData[i].text = treeData[i].text ? treeData[i].text : treeData[i].name
		treeData[i].pnodeId = pnodeId

		if (treeData[i].children && treeData[i].children.length) {
			addParentData(treeData[i].children, treeData[i].nodeuuid)
		}
	}
	return treeData
}

/**
 * 设置相关树节点映射
 * 两种方式:
 * 其一,树组件有提供快捷获取选中和半选数据的方法,可直接调用方法,组装treeMap(推荐)
 * 其二,树组件没有提供快捷获取选中和半选数据的方法,则递归所有初始树结构数据,组装treeMap(较消耗内存,慎用)
 * @returns treeMap  树节点映射
 */
function setMap() {
	let treeMap = {} // 树节点映射
	// ----------------方法一(推荐)-------------------
	// 获取选中的数据
	// const checkedNodes = TreeRef.value.getCheckedData()
	// // 获取半选的数据
	// const indeterminateNodes = TreeRef.value.getIndeterminateData()

	// checkedNodes.options.forEach(node => {
	// 	if (node) {
	// 		treeMap[node.nodeuuid] = node
	// 	}
	// })
	// indeterminateNodes.options.forEach(node => {
	// 	if (node) {
	// 		treeMap[node.nodeuuid] = node
	// 	}
	// })

	// ------------------方法二(较消耗内存,慎用)-------------------
	treeMap = setMap2(dataSetData, treeMap)

	return treeMap
}

/**
 * 递归所有初始树结构数据,组装treeMap
 * @param {*} tree 初始树结构数据
 * @param {*} map 
 * @returns 
 */
function setMap2(tree, map) {
	tree.forEach(node => {
		map[node.nodeuuid] = node
		if (node.children && node.children.length > 0) {
			setMap2(node.children, map)
		}
	})

	return map
}

/**
 * 获取所有和子节点相关,被勾选的根父节点集合(包含已勾选和未勾选数据,通过是否勾选标识区分)
 * @param leafCheckedNodes 所有选中的叶子节点
 * @param treeMap 相关树节点映射(勾选与半勾选)
 * @returns rootNodes  和子节点相关,被勾选的根父节点集合
 */
function getAllCheckedRootNodes(leafCheckedNodes, treeMap) {
	let rootNodes = []
	leafCheckedNodes.forEach(node => {
		// 找到叶子结点的父节点
		let pNode = treeMap[node.pnodeId]
		// 迭代
		while (pNode) {
			// 添加已勾选的标志
			pNode.isChecked = true
			node = pNode
			pNode = treeMap[node.pnodeId]
		}
		// 如果pNode不存在,说明node是根节点
		if (!rootNodes.some(i => i.nodeuuid == node.nodeuuid)) {
			rootNodes.push(node)
		}
	})
	return rootNodes
}
  
/**
 * 删除未选中标识数据,递归获取重组后的完整树结构数据
 * @param rootNodes 跟勾选相关的根节点集合
 * @param checkedLeafNodes 所有选中的叶子节点
 * @returns 
 */
function getCheckedTree(rootNodes, checkedLeafNodes) {
	// 倒序,避免for循环中使用splice后导致index错乱
	for (let i = rootNodes.length - 1; i >= 0; i--) {
		const node = rootNodes[i]
		// 不是叶子节点
		if (node.children && node.children.length > 0) {
			// 检查勾选标志位,true,那么递归,false,那么删除
			if (node.isChecked) {
				getCheckedTree(node.children, checkedLeafNodes)
			} else {
				rootNodes.splice(i, 1)
			}
		} else {
			// 如果是叶子节点,那么检查其是否是勾选节点,是,保留,不是删除
			const flag = checkedLeafNodes.some(n => n.nodeuuid == node.nodeuuid)
			if (!flag) {
				rootNodes.splice(i, 1)
			}
		}
	}
	return rootNodes
}

到了这里,关于Naive UI 获取树tree完整选中树结构(通用方法,也适用于其他自定义组件)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElementUI中el-tree获取每个节点点击的选中状态

    有时候需要获取el-tree每个节点的点击状态,可以通过以下方式,其中isCheck类型为布尔值 1.绑定@check事件,我这里是getCurrentNode,函数名自己随便写 2.绑定ref

    2024年02月11日
    浏览(69)
  • el-tree获取当前选中节点及其所有父节点的id(包含半选中父节点的id)

    如下图,我们现在全勾中的有表格管理及其下的子级,而半勾中的有工作台和任务管理及其子级 现在点击保存按钮后,需要将勾中的节点id及该节点对应的父节点,祖先节点的id(包含半选中父节点的id)也都一并传给后端,那这个例子里就应该共传入9个id,我们可以直接将

    2024年01月22日
    浏览(53)
  • element-tree树结构-默认选中第一个节点高亮-根据id选中节点高亮

    前言 tree树结构是在开发中经常使用的组件,比如区域树,楼层树,组织架构树,等等包含节点关系 实际开发可能需要我们一进到页面选中树形结构第一个节点,并且调用数据,来达到用户体验 在用户选择之后,通过本地存储的方式把楼层id存起来,刷新之后获取楼层id,调

    2024年02月09日
    浏览(75)
  • el-tree使用获取当前选中节点的父节点数据(开发记录)

    官网上有两种办法: 根据 data 或者 key 拿到 Tree 组件中的 node (data) 要获得 node 的 key 或者 data。 我这key设置后没有生效,采用的node获取的方法 1、html部分 2、data举例 el-tree提供的回调事件:@node-click=“handleNodeClick”。(方法名自取,这里用的原来的“handleNodeClick”) 其他:①

    2024年02月11日
    浏览(51)
  • Naive UI:一个 Vue 3 组件库,比较完整,主题可调,使用 TypeScript,快有点意思。

    在当今的前端开发领域,Vue 3已成为中后台应用的首选框架。为了满足开发者的需求,各种组件库如雨后春笋般涌现。其中,Naive UI以其独特的优势,成为了Vue 3开发者的得力助手。本文将深入探讨Naive UI的特性、优势以及如何使用它来提高开发效率。 一、Naive UI的特性 组件丰

    2024年04月22日
    浏览(45)
  • element UI中实现tree树形控件部分选中时父级节点也被选中

    最近有一个很奇葩的需求,在使用element UI中的tree树形控件选中功能时,子节点部分选中时父级节点也要被选中,并且回显也要保留部分子节点选中父节点半选中状态。 按照平时正常逻辑来处理,提交时只需要获取选中项的父级节点一并提交即可,这样正常提交是没有任何问

    2024年02月08日
    浏览(57)
  • uniapp - 实现卡片式胶囊单选后右上角出现 “√“ 对勾对号选中效果功能,适用于小程序h5网页app全平台通用(一键复制组件源码,开箱即用!)

    uniapp全平台兼容(小程序/h5网页/app)实现点击选择后,右上角出现 √ 对号效果(角标形式展现),功能组件, 改个样式,直接复制使用该组件。 在 components 组件文件夹下,随便建立一个 .vue 文件,一键复制下方源码。

    2024年02月11日
    浏览(95)
  • naive ui和tailwind-css冲突解决方法

    tailwindcss侧的解决方法(推荐) 修改tailwind.config.js文件,禁用预加载 tailwind预加载,是为了保持一个新项目的风格统一,会把原本html自带的一些标签,如h1-h5, img,ul,padding等样式的默认风格和作用给移除掉,当然这对已有的项目集成tailwindcss是不友好的,所以可以禁用掉,详

    2024年02月09日
    浏览(38)
  • naive-ui在setup引用message的方法

    序:         先说好,能用,而且不用新建啥目录,但是官方不推荐!!!!,但是快!!!      上图的的api文档地址点右边===》Naive UI 原文是=》如果你想在  setup  外使用   useDialog 、 useMessage 、 useNotification 、 useLoadingBar ,可以通过  createDiscreteApi  来构建对应的 API。

    2024年02月03日
    浏览(36)
  • 前端Vue uni-app App/小程序/H5 通用tree树形结构图

    随着技术的发展,开发的复杂度也越来越高,传统开发方式将一个系统做成了整块应用,经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改,造成牵一发而动全身。 通过组件化开发,可以有效实现单独开发,单独维护,而且他们之间可以随

    2024年02月16日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包