国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Naive UI 獲取樹tree完整選中樹結(jié)構(gòu)(通用方法,也適用于其他自定義組件)

這篇具有很好參考價值的文章主要介紹了Naive UI 獲取樹tree完整選中樹結(jié)構(gòu)(通用方法,也適用于其他自定義組件)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

截止文章記錄前,Naive UI 并未提供直接獲取,與選中葉子節(jié)點相關(guān)的完整樹結(jié)構(gòu)數(shù)據(jù)方法,記錄一下前端實現(xiàn)方法。

數(shù)據(jù)準備:

數(shù)據(jù)準備:樹結(jié)構(gòu)初始數(shù)據(jù),選中相關(guān)的數(shù)據(jù)

// 初始樹結(jié)構(gòu)數(shù)據(jù)
let dataSetData = [
	{
		id: '1',
		text: '節(jié)點1',
		nodeuuid: '1',
		pnodeId: null,
		children: []
	},
	{
		id: '2',
		text: '節(jié)點2',
		nodeuuid: '2',
		pnodeId: null,
		children: [
			{
				id: '2-1',
				text: '節(jié)點2-1',
				nodeuuid: '2-1',
				pnodeId: '2',
				children: []
			},
			{
				id: '2-2',
				text: '節(jié)點2-2',
				nodeuuid: '2-2',
				pnodeId: '2',
				children: [
					{
						id: '2-2-1',
						text: '節(jié)點2-2-1',
						nodeuuid: '2-2-1',
						pnodeId: '2-2',
						children: []
					}
				]
			},
			{
				id: '2-3',
				text: '節(jié)點2-3',
				nodeuuid: '2-3',
				pnodeId: '2',
				children: []
			}
		]
	},
	{
		id: '3',
		text: '節(jié)點3',
		nodeuuid: '3',
		pnodeId: null,
		children: []
	},
	{
		id: '4',
		text: '節(jié)點4',
		nodeuuid: '4',
		pnodeId: null,
		children: []
	},
	{
		id: '5',
		text: '節(jié)點5',
		nodeuuid: '5',
		pnodeId: null,
		children: [
			{
				id: '5-1',
				text: '節(jié)點5-1',
				nodeuuid: '5-1',
				pnodeId: '5',
				children: []
			},
			{
				id: '5-2',
				text: '節(jié)點5-2',
				nodeuuid: '5-2',
				pnodeId: '5',
				children: []
			}
		]
	}
]

// 選中相關(guān)的數(shù)據(jù)
let datasetCheckedNodes = [
	{
		id: '2',
		text: '節(jié)點2',
		nodeuuid: '2',
		pnodeId: null,
		children: [
			{
				id: '2-1',
				text: '節(jié)點2-1',
				nodeuuid: '2-1',
				pnodeId: '2',
				children: []
			},
			{
				id: '2-2',
				text: '節(jié)點2-2',
				nodeuuid: '2-2',
				pnodeId: '2',
				children: [
					{
						id: '2-2-1',
						text: '節(jié)點2-2-1',
						nodeuuid: '2-2-1',
						pnodeId: '2-2',
						children: []
					}
				]
			},
			{
				id: '2-3',
				text: '節(jié)點2-3',
				nodeuuid: '2-3',
				pnodeId: '2',
				children: []
			}
		]
	},
	{
		id: '2-3',
		text: '節(jié)點2-3',
		nodeuuid: '2-3',
		pnodeId: '2',
		children: []
	},
	{
		id: '2-2',
		text: '節(jié)點2-2',
		nodeuuid: '2-2',
		pnodeId: '2',
		children: [
			{
				id: '2-2-1',
				text: '節(jié)點2-2-1',
				nodeuuid: '2-2-1',
				pnodeId: '2-2',
				children: []
			}
		]
	},
	{
		id: '2-2-1',
		text: '節(jié)點2-2-1',
		nodeuuid: '2-2-1',
		pnodeId: '2-2',
		children: []
	},
	{
		id: '4',
		text: '節(jié)點4',
		nodeuuid: '4',
		pnodeId: null,
		children: []
	},
	{
		id: '5-2',
		text: '節(jié)點5-2',
		nodeuuid: '5-2',
		pnodeId: '5',
		children: []
	}
]

?實現(xiàn)步驟,一共四步,如下:?

// 0.設(shè)置每個節(jié)點唯一標識nodeuuid,相關(guān)父節(jié)點標識pnodeId(若初始樹結(jié)構(gòu)數(shù)據(jù)每個節(jié)點已有唯一標識,相關(guān)父節(jié)點標識,可跳過該步驟)
// dataSetData = addParentData(res, null)
// 1.設(shè)置相關(guān)樹節(jié)點映射
const treeMap = setMap()
// 2.獲取所有選中的葉子節(jié)點(目的是為了獲取所有選中的葉子節(jié)點,可使用其他方法獲得)
const leafNodes = datasetCheckedNodes.filter(v => v && (!v.children || v.children.length == 0))
// 3.獲取所有和子節(jié)點相關(guān),被勾選的根父節(jié)點集合(包含已勾選和未勾選數(shù)據(jù),通過是否勾選標識區(qū)分)
const rootNodes = getAllCheckedRootNodes(leafNodes, treeMap)
// 4.刪除未選中標識數(shù)據(jù),獲取重組后的完整樹結(jié)構(gòu)數(shù)據(jù)
const treeData = getCheckedTree(rootNodes, leafNodes)

console.log('重組后的完整樹結(jié)構(gòu)數(shù)據(jù)', treeData)

實現(xiàn)函數(shù)方法如下:?文章來源地址http://www.zghlxwxcb.cn/news/detail-849638.html

/**
 * 遞歸遍歷賦值當前節(jié)點的父節(jié)點,設(shè)置每個節(jié)點唯一標識nodeuuid,相關(guān)父節(jié)點標識pnodeId
 * @param treeData 初始樹結(jié)構(gòu)數(shù)據(jù)
 * @param pnodeId 父節(jié)點Id
 * @returns treeData 處理后的樹結(jié)構(gòu)數(shù)據(jù)
 */
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
}

/**
 * 設(shè)置相關(guān)樹節(jié)點映射
 * 兩種方式:
 * 其一,樹組件有提供快捷獲取選中和半選數(shù)據(jù)的方法,可直接調(diào)用方法,組裝treeMap(推薦)
 * 其二,樹組件沒有提供快捷獲取選中和半選數(shù)據(jù)的方法,則遞歸所有初始樹結(jié)構(gòu)數(shù)據(jù),組裝treeMap(較消耗內(nèi)存,慎用)
 * @returns treeMap  樹節(jié)點映射
 */
function setMap() {
	let treeMap = {} // 樹節(jié)點映射
	// ----------------方法一(推薦)-------------------
	// 獲取選中的數(shù)據(jù)
	// const checkedNodes = TreeRef.value.getCheckedData()
	// // 獲取半選的數(shù)據(jù)
	// 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
	// 	}
	// })

	// ------------------方法二(較消耗內(nèi)存,慎用)-------------------
	treeMap = setMap2(dataSetData, treeMap)

	return treeMap
}

/**
 * 遞歸所有初始樹結(jié)構(gòu)數(shù)據(jù),組裝treeMap
 * @param {*} tree 初始樹結(jié)構(gòu)數(shù)據(jù)
 * @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
}

/**
 * 獲取所有和子節(jié)點相關(guān),被勾選的根父節(jié)點集合(包含已勾選和未勾選數(shù)據(jù),通過是否勾選標識區(qū)分)
 * @param leafCheckedNodes 所有選中的葉子節(jié)點
 * @param treeMap 相關(guān)樹節(jié)點映射(勾選與半勾選)
 * @returns rootNodes  和子節(jié)點相關(guān),被勾選的根父節(jié)點集合
 */
function getAllCheckedRootNodes(leafCheckedNodes, treeMap) {
	let rootNodes = []
	leafCheckedNodes.forEach(node => {
		// 找到葉子結(jié)點的父節(jié)點
		let pNode = treeMap[node.pnodeId]
		// 迭代
		while (pNode) {
			// 添加已勾選的標志
			pNode.isChecked = true
			node = pNode
			pNode = treeMap[node.pnodeId]
		}
		// 如果pNode不存在,說明node是根節(jié)點
		if (!rootNodes.some(i => i.nodeuuid == node.nodeuuid)) {
			rootNodes.push(node)
		}
	})
	return rootNodes
}
  
/**
 * 刪除未選中標識數(shù)據(jù),遞歸獲取重組后的完整樹結(jié)構(gòu)數(shù)據(jù)
 * @param rootNodes 跟勾選相關(guān)的根節(jié)點集合
 * @param checkedLeafNodes 所有選中的葉子節(jié)點
 * @returns 
 */
function getCheckedTree(rootNodes, checkedLeafNodes) {
	// 倒序,避免for循環(huán)中使用splice后導(dǎo)致index錯亂
	for (let i = rootNodes.length - 1; i >= 0; i--) {
		const node = rootNodes[i]
		// 不是葉子節(jié)點
		if (node.children && node.children.length > 0) {
			// 檢查勾選標志位,true,那么遞歸,false,那么刪除
			if (node.isChecked) {
				getCheckedTree(node.children, checkedLeafNodes)
			} else {
				rootNodes.splice(i, 1)
			}
		} else {
			// 如果是葉子節(jié)點,那么檢查其是否是勾選節(jié)點,是,保留,不是刪除
			const flag = checkedLeafNodes.some(n => n.nodeuuid == node.nodeuuid)
			if (!flag) {
				rootNodes.splice(i, 1)
			}
		}
	}
	return rootNodes
}

到了這里,關(guān)于Naive UI 獲取樹tree完整選中樹結(jié)構(gòu)(通用方法,也適用于其他自定義組件)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • ElementUI中el-tree獲取每個節(jié)點點擊的選中狀態(tài)

    有時候需要獲取el-tree每個節(jié)點的點擊狀態(tài),可以通過以下方式,其中isCheck類型為布爾值 1.綁定@check事件,我這里是getCurrentNode,函數(shù)名自己隨便寫 2.綁定ref

    2024年02月11日
    瀏覽(49)
  • el-tree獲取當前選中節(jié)點及其所有父節(jié)點的id(包含半選中父節(jié)點的id)

    el-tree獲取當前選中節(jié)點及其所有父節(jié)點的id(包含半選中父節(jié)點的id)

    如下圖,我們現(xiàn)在全勾中的有表格管理及其下的子級,而半勾中的有工作臺和任務(wù)管理及其子級 現(xiàn)在點擊保存按鈕后,需要將勾中的節(jié)點id及該節(jié)點對應(yīng)的父節(jié)點,祖先節(jié)點的id(包含半選中父節(jié)點的id)也都一并傳給后端,那這個例子里就應(yīng)該共傳入9個id,我們可以直接將

    2024年01月22日
    瀏覽(22)
  • element-tree樹結(jié)構(gòu)-默認選中第一個節(jié)點高亮-根據(jù)id選中節(jié)點高亮

    前言 tree樹結(jié)構(gòu)是在開發(fā)中經(jīng)常使用的組件,比如區(qū)域樹,樓層樹,組織架構(gòu)樹,等等包含節(jié)點關(guān)系 實際開發(fā)可能需要我們一進到頁面選中樹形結(jié)構(gòu)第一個節(jié)點,并且調(diào)用數(shù)據(jù),來達到用戶體驗 在用戶選擇之后,通過本地存儲的方式把樓層id存起來,刷新之后獲取樓層id,調(diào)

    2024年02月09日
    瀏覽(25)
  • el-tree使用獲取當前選中節(jié)點的父節(jié)點數(shù)據(jù)(開發(fā)記錄)

    el-tree使用獲取當前選中節(jié)點的父節(jié)點數(shù)據(jù)(開發(fā)記錄)

    官網(wǎng)上有兩種辦法: 根據(jù) data 或者 key 拿到 Tree 組件中的 node (data) 要獲得 node 的 key 或者 data。 我這key設(shè)置后沒有生效,采用的node獲取的方法 1、html部分 2、data舉例 el-tree提供的回調(diào)事件:@node-click=“handleNodeClick”。(方法名自取,這里用的原來的“handleNodeClick”) 其他:①

    2024年02月11日
    瀏覽(39)
  • Naive UI:一個 Vue 3 組件庫,比較完整,主題可調(diào),使用 TypeScript,快有點意思。

    Naive UI:一個 Vue 3 組件庫,比較完整,主題可調(diào),使用 TypeScript,快有點意思。

    在當今的前端開發(fā)領(lǐng)域,Vue 3已成為中后臺應(yīng)用的首選框架。為了滿足開發(fā)者的需求,各種組件庫如雨后春筍般涌現(xiàn)。其中,Naive UI以其獨特的優(yōu)勢,成為了Vue 3開發(fā)者的得力助手。本文將深入探討Naive UI的特性、優(yōu)勢以及如何使用它來提高開發(fā)效率。 一、Naive UI的特性 組件豐

    2024年04月22日
    瀏覽(25)
  • element UI中實現(xiàn)tree樹形控件部分選中時父級節(jié)點也被選中

    element UI中實現(xiàn)tree樹形控件部分選中時父級節(jié)點也被選中

    最近有一個很奇葩的需求,在使用element UI中的tree樹形控件選中功能時,子節(jié)點部分選中時父級節(jié)點也要被選中,并且回顯也要保留部分子節(jié)點選中父節(jié)點半選中狀態(tài)。 按照平時正常邏輯來處理,提交時只需要獲取選中項的父級節(jié)點一并提交即可,這樣正常提交是沒有任何問

    2024年02月08日
    瀏覽(99)
  • uniapp - 實現(xiàn)卡片式膠囊單選后右上角出現(xiàn) “√“ 對勾對號選中效果功能,適用于小程序h5網(wǎng)頁app全平臺通用(一鍵復(fù)制組件源碼,開箱即用?。? decoding=

    uniapp - 實現(xiàn)卡片式膠囊單選后右上角出現(xiàn) “√“ 對勾對號選中效果功能,適用于小程序h5網(wǎng)頁app全平臺通用(一鍵復(fù)制組件源碼,開箱即用!)

    uniapp全平臺兼容(小程序/h5網(wǎng)頁/app)實現(xiàn)點擊選擇后,右上角出現(xiàn) √ 對號效果(角標形式展現(xiàn)),功能組件, 改個樣式,直接復(fù)制使用該組件。 在 components 組件文件夾下,隨便建立一個 .vue 文件,一鍵復(fù)制下方源碼。

    2024年02月11日
    瀏覽(151)
  • naive-ui在setup引用message的方法

    naive-ui在setup引用message的方法

    序: ? ? ? ? 先說好,能用,而且不用新建啥目錄,但是官方不推薦?。。?!,但是快?。?!? ? ? 上圖的的api文檔地址點右邊===》Naive UI 原文是=》如果你想在? setup ?外使用 ? useDialog 、 useMessage 、 useNotification 、 useLoadingBar ,可以通過? createDiscreteApi ?來構(gòu)建對應(yīng)的 API。

    2024年02月03日
    瀏覽(22)
  • naive ui和tailwind-css沖突解決方法

    tailwindcss側(cè)的解決方法(推薦) 修改tailwind.config.js文件,禁用預(yù)加載 tailwind預(yù)加載,是為了保持一個新項目的風格統(tǒng)一,會把原本html自帶的一些標簽,如h1-h5, img,ul,padding等樣式的默認風格和作用給移除掉,當然這對已有的項目集成tailwindcss是不友好的,所以可以禁用掉,詳

    2024年02月09日
    瀏覽(26)
  • 前端Vue uni-app App/小程序/H5 通用tree樹形結(jié)構(gòu)圖

    前端Vue uni-app App/小程序/H5 通用tree樹形結(jié)構(gòu)圖

    隨著技術(shù)的發(fā)展,開發(fā)的復(fù)雜度也越來越高,傳統(tǒng)開發(fā)方式將一個系統(tǒng)做成了整塊應(yīng)用,經(jīng)常出現(xiàn)的情況就是一個小小的改動或者一個小功能的增加可能會引起整體邏輯的修改,造成牽一發(fā)而動全身。 通過組件化開發(fā),可以有效實現(xiàn)單獨開發(fā),單獨維護,而且他們之間可以隨

    2024年02月16日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包