日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
我開源了基于Vue的組織架構(gòu)樹組件

開門見山

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信平臺(tái)小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了漾濞免費(fèi)建站歡迎大家使用!

Demo 演示地址:http://www.longstudy.club/vue-okr-tree-doc/index.html

github 地址:https://github.com/qq449245884/vue-okr-tree

項(xiàng)目背景

因?yàn)樽罱拘枰鲆粋€(gè)OKR,OKR 里面有個(gè)對(duì)齊視圖,是一個(gè)數(shù)型結(jié)構(gòu),如下圖所示:

就拿我 小智 來(lái)說(shuō),如果有人對(duì)齊我的 KR 就放到我的右邊,如果是我對(duì)齊了誰(shuí)的 KR,就放到我的左邊,類似一個(gè)上下級(jí)的關(guān)系,所以這里我用兩棵樹來(lái)表示左邊與右邊的關(guān)系。

在GitHub上找了半天,這類組件不多,也沒有符合業(yè)務(wù)需求的組件,所以決定自己造輪子!

分析

  • 既然是樹,那么每個(gè)節(jié)點(diǎn)都應(yīng)該是相同的組件
  • 節(jié)點(diǎn)下面套節(jié)點(diǎn),所以節(jié)點(diǎn)組件應(yīng)該是一個(gè)遞歸組件
  • 整棵樹應(yīng)該有一個(gè)全局的狀態(tài),用來(lái)管理從外部傳入的值以及向外部提供的屬性和方法。
  • 每相樹節(jié)點(diǎn)應(yīng)該也要有一個(gè)對(duì)應(yīng)的節(jié)點(diǎn)狀態(tài),來(lái)管理節(jié)點(diǎn)自身屬性和方法。

實(shí)現(xiàn)思路

遞歸組件

對(duì)于遞歸組件,Vue 官方文檔是這樣說(shuō)的:

組件在它的模板內(nèi)可以遞歸地調(diào)用自己。不過(guò),只有當(dāng)它有 name 選項(xiàng)時(shí)才可以這么做。

這里我用 OkrTreeNode.vue 來(lái)表示樹的節(jié)點(diǎn),里面是這樣用遞歸,下面是該組件簡(jiǎn)定:

 
 
 
 
  1.  
  2.  
  3. export default { 
  4.   name: 'OkrTreeNode' 

遞歸組件的使用需要注意的兩點(diǎn)是組件里面要有組件name 以及結(jié)束遞歸的條件。

樹的狀態(tài)

對(duì)于樹的狀態(tài),我用一個(gè) TreeStore 類來(lái)表示,該實(shí)現(xiàn)方式主要是參考 ElementUI 中的 tree 組件。TreeStore 中的屬性就表示我外部傳入的 pros 或者 attr 或者 事件和方法,都在這個(gè)對(duì)象里面管理,具體的代碼可以看這里:

https://github.com/qq449245884/vue-okr-tree/blob/main/src/lib/vue-okr-tree/model/tree-store.js

節(jié)點(diǎn)的狀態(tài)

對(duì)于節(jié)點(diǎn)的狀態(tài),我用一個(gè) Node 對(duì)象來(lái)表示,具體的代碼可以看下面這個(gè)地址,這里就不展開說(shuō)了:

https://github.com/qq449245884/vue-okr-tree/blob/main/src/lib/vue-okr-tree/model/node.js

Demo 演示

基礎(chǔ)用法

基礎(chǔ)的樹形結(jié)構(gòu)展示,默認(rèn)方式垂直方向。

水平方向

將 direction 屬性設(shè)置為 horizontal 就可以展示水平方向。

節(jié)點(diǎn)是否可被展開

節(jié)點(diǎn)可被展開,默認(rèn)是不展開,通過(guò)show-collapsable設(shè)置節(jié)點(diǎn)可被展開。

節(jié)點(diǎn)默認(rèn)全部展開

通過(guò)設(shè)置 default-expand-all 默認(rèn)展開所有節(jié)點(diǎn),該參數(shù)只有在 show-collapsable為true 時(shí)有效

可將 Tree 的某些節(jié)點(diǎn)設(shè)置為默認(rèn)展開

通過(guò) default-expanded-keys 設(shè)置默認(rèn)展開的節(jié)點(diǎn)。需要注意的是,此時(shí)必須設(shè)置 node-key ,其值為節(jié)點(diǎn)數(shù)據(jù)中的一個(gè)字段名,該字段在整棵樹中是唯一的。

節(jié)點(diǎn)的樣式可自行設(shè)置節(jié)點(diǎn)的默認(rèn)樣式和選中的樣式。

通過(guò) label-class-name 設(shè)置節(jié)點(diǎn)的樣式,支持字符和函數(shù)方式。通過(guò) current-lable-class-name 設(shè)置當(dāng)前節(jié)點(diǎn)選中的樣式,支持字符和函數(shù)方式。

節(jié)點(diǎn)自定義內(nèi)容

可自行設(shè)置節(jié)點(diǎn)內(nèi)容。通過(guò) render-content 渲染節(jié)點(diǎn)內(nèi)容。

OKR 展示模式

該模式的出現(xiàn),是為了實(shí)現(xiàn)跟飛書OKR 展示的視圖一樣效果,所以在 Tree 的模式下,擴(kuò)展成左右兩棵子樹。該模式必須設(shè)置 onlyBothTree ,以及通過(guò) leftData表示左子數(shù)的結(jié)構(gòu)。

OKR 展示模式之自定義節(jié)點(diǎn)內(nèi)容

與上常規(guī) Tree 一樣,我們也可以通過(guò)自定義渲染函數(shù)來(lái)制定節(jié)點(diǎn)的內(nèi)容。

通過(guò) render-content 渲染節(jié)點(diǎn)內(nèi)容,通過(guò)返回 node 中的 isLeftChild 判斷是否是左邊的樹。

節(jié)點(diǎn)過(guò)濾(不可展開)及支持的方法

通過(guò)關(guān)鍵字過(guò)濾樹節(jié)點(diǎn),在需要對(duì)節(jié)點(diǎn)進(jìn)行過(guò)濾時(shí),調(diào)用 Tree 實(shí)例的 filter 方法,參數(shù)為關(guān)鍵字。需要注意的是,此時(shí)需要設(shè)置 filter-node-method ,值為過(guò)濾函數(shù)。

節(jié)點(diǎn)過(guò)濾(可被展開)

通過(guò)關(guān)鍵字過(guò)濾樹節(jié)點(diǎn),在需要對(duì)節(jié)點(diǎn)進(jìn)行過(guò)濾時(shí),調(diào)用 Tree 實(shí)例的 filter 方法,參數(shù)為關(guān)鍵字。需要注意的是,此時(shí)需要設(shè)置 filter-node-method ,值為過(guò)濾函數(shù)。

支持的事件(不可展開)

不可展開時(shí)支持的事件有 節(jié)點(diǎn)點(diǎn)擊 和 鼠標(biāo)右鍵點(diǎn)擊。

支持的事件(可被展開)

可展開時(shí)支持的事件有 節(jié)點(diǎn)點(diǎn)擊、鼠標(biāo)右鍵點(diǎn)擊,節(jié)點(diǎn)的展開以及節(jié)點(diǎn)的關(guān)閉。

Attributes

參數(shù) 說(shuō)明 類型 可選值 默認(rèn)值
data 展示數(shù)據(jù) array
direction 樹的展開方向 String horizontal / vertical vertical
onlyBothTree 子樹在根節(jié)點(diǎn)左右兩邊展開,該模式只有在 direction 為 horizontal 有效,且必須提供 leftData 數(shù)據(jù) Boolean false
leftData 展示左子數(shù)的數(shù)據(jù),該屬性于在 onlyBothTree 模式啟用 array
label-width 節(jié)點(diǎn)的寬度,默認(rèn)為自動(dòng)寬度。如果 label-width 為 number 類型,單位 px;如果 label-width 為 string 類型,則這個(gè)寬度會(huì)設(shè)置為 節(jié)點(diǎn) 的 style.width 的值,節(jié)點(diǎn)的寬度會(huì)受控于外部樣式 string/number
label-height 節(jié)點(diǎn)的高度,默認(rèn)為自動(dòng)高度。如果 label-height 為 number 類型,單位 px;如果 label-height 為 string 類型,則這個(gè)高度會(huì)設(shè)置為 節(jié)點(diǎn) 的 style.height 的值,節(jié)點(diǎn)的高度會(huì)受控于外部樣式 string/number
label-class-name 節(jié)點(diǎn) className 的回調(diào)方法,也可以使用字符串為所有的節(jié)點(diǎn)設(shè)置一個(gè)固定的 className Function(node)/String
current-lable-class-name 當(dāng)前選中節(jié)點(diǎn)的樣式 Function(node)/String
show-collapsable 節(jié)點(diǎn)是否可被展開 Boolean false
default-expand-all 是否默認(rèn)展開所有節(jié)點(diǎn),該參數(shù)只有在 show-collapsable 為 true 時(shí)有效 Boolean false
render-content 樹節(jié)點(diǎn)的內(nèi)容區(qū)的渲染 Function Function(h, node)
props 配置選項(xiàng),具體看下表 object
node-key 每個(gè)樹節(jié)點(diǎn)用來(lái)作為唯一標(biāo)識(shí)的屬性,整棵樹應(yīng)該是唯一的 String
default-expanded-keys 默認(rèn)展開的節(jié)點(diǎn)的 key 的數(shù)組(需要注意的是,此時(shí)必須設(shè)置node-key,其值為節(jié)點(diǎn)數(shù)據(jù)中的一個(gè)字段名,該字段在整棵樹中是唯一的。) array
filter-node-method 對(duì)樹節(jié)點(diǎn)進(jìn)行篩選時(shí)執(zhí)行的方法,返回 true 表示這個(gè)節(jié)點(diǎn)可以顯示,返回 false 則表示這個(gè)節(jié)點(diǎn)會(huì)被隱藏 Function(value, data, node)

props

參數(shù) 說(shuō)明 類型 可選值 默認(rèn)值
label 指定節(jié)點(diǎn)標(biāo)簽為節(jié)點(diǎn)對(duì)象的某個(gè)屬性值 string, function(data, node)
children 指定節(jié)點(diǎn)標(biāo)簽為節(jié)點(diǎn)對(duì)象的某個(gè)屬性值 string

## Events

事件名稱 說(shuō)明 回調(diào)參數(shù)
node-click 節(jié)點(diǎn)被點(diǎn)擊時(shí)的回調(diào) 共三個(gè)參數(shù),依次為:傳遞給 data 屬性的數(shù)組中該節(jié)點(diǎn)所對(duì)應(yīng)的對(duì)象、節(jié)點(diǎn)對(duì)應(yīng)的 Node、節(jié)點(diǎn)組件本身。
node-expand 節(jié)點(diǎn)被展開時(shí)觸發(fā)的事件 共三個(gè)參數(shù),依次為:傳遞給 data 屬性的數(shù)組中該節(jié)點(diǎn)所對(duì)應(yīng)的對(duì)象、節(jié)點(diǎn)對(duì)應(yīng)的 Node、節(jié)點(diǎn)組件本身
node-collapse 節(jié)點(diǎn)被關(guān)閉時(shí)觸發(fā)的事件 共三個(gè)參數(shù),依次為:傳遞給 data 屬性的數(shù)組中該節(jié)點(diǎn)所對(duì)應(yīng)的對(duì)象、節(jié)點(diǎn)對(duì)應(yīng)的 Node、節(jié)點(diǎn)組件本身
node-contextmenu 當(dāng)某一節(jié)點(diǎn)被鼠標(biāo)右鍵點(diǎn)擊時(shí)會(huì)觸發(fā)該事件 共四個(gè)參數(shù),依次為:event、傳遞給 data 屬性的數(shù)組中該節(jié)點(diǎn)所對(duì)應(yīng)的對(duì)象、節(jié)點(diǎn)對(duì)應(yīng)的 Node、節(jié)點(diǎn)組件本身。

方法

方法名 說(shuō)明 回調(diào)參數(shù)
filter 對(duì)樹節(jié)點(diǎn)進(jìn)行篩選操作 接收一個(gè)任意類型的參數(shù),該參數(shù)會(huì)在 filter-node-method 中作為第一個(gè)參數(shù)
getNode 根據(jù) data 或者 key 拿到 Tree 組件中的 node,使用此方法必須設(shè)置 node-key 屬性 (data) 要獲得 node 的 key 或者 data
setCurrentNode 通過(guò) node 設(shè)置某個(gè)節(jié)點(diǎn)的當(dāng)前選中狀態(tài),使用此方法必須設(shè)置 node-key 屬性 (node) 待被選節(jié)點(diǎn)的 node
setCurrentKey 通過(guò) key 設(shè)置某個(gè)節(jié)點(diǎn)的當(dāng)前選中狀態(tài),使用此方法必須設(shè)置 node-key 屬性 (key) 待被選節(jié)點(diǎn)的 key,若為 null 則取消當(dāng)前高亮的節(jié)點(diǎn)
getCurrentKey 獲取當(dāng)前被選中節(jié)點(diǎn)的 key,使用此方法必須設(shè)置 node-key 屬性,若沒有節(jié)點(diǎn)被選中則返回 null
getCurrentNode 獲取當(dāng)前被選中節(jié)點(diǎn)的 data,若沒有節(jié)點(diǎn)被選中則返回 null
remove 刪除 Tree 中的一個(gè)節(jié)點(diǎn),使用此方法必須設(shè)置 node-key 屬性 (data) 要?jiǎng)h除的節(jié)點(diǎn)的 id 或者 data 或者 node
append 為 Tree 中的一個(gè)節(jié)點(diǎn)追加一個(gè)子節(jié)點(diǎn) (data, parentNode) 接收兩個(gè)參數(shù),1. 要追加的子節(jié)點(diǎn)的 data 2. 子節(jié)點(diǎn)的 parent 的 data、key 或者 node
insertBefore 為 Tree 的一個(gè)節(jié)點(diǎn)的前面增加一個(gè)節(jié)點(diǎn) (data, refNode) 接收兩個(gè)參數(shù),1. 要增加的節(jié)點(diǎn)的 data 2. 要增加的節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)的 data、key 或者 node
insertAfter 為 Tree 的一個(gè)節(jié)點(diǎn)的后面增加一個(gè)節(jié)點(diǎn) (data, refNode) 接收兩個(gè)參數(shù),1. 要增加的節(jié)點(diǎn)的 data 2. 要增加的節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)的 data、key 或者 node

瀏覽器支持情況

Modern browsers and Internet Explorer 10+.

如果你覺得還不錯(cuò)的話,還請(qǐng)幫忙在 github 上給個(gè) star,如果你覺得哪些需要優(yōu)化的可以到 github 上提個(gè) PR。

本文轉(zhuǎn)載自微信公眾號(hào)「大遷世界」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系大遷世界公眾號(hào)。


網(wǎng)頁(yè)標(biāo)題:我開源了基于Vue的組織架構(gòu)樹組件
當(dāng)前路徑:http://www.5511xx.com/article/codgdpj.html