Vue遞歸組件+Vuex開發(fā)樹形組件Tree--數(shù)據(jù)模塊

? ? ? 其實最開始并沒有采用Vuex茬末,因為Vuex相對于$emit這類事件監(jiān)聽需要多寫很多代碼厂榛,而且步驟也是比較繁瑣,如果你想保持一個狀態(tài)管理庫,那么你就按照Vue指定的套路出牌击奶,需要提交mutations來統(tǒng)一改變狀態(tài)辈双。最開始采用$emit事件監(jiān)聽的方式,因為會有增刪改的操作柜砾,就由父組件監(jiān)聽湃望,然后將data數(shù)據(jù)源逐級傳遞,但當層級變大的時候局义,數(shù)據(jù)變得難以維護喜爷,大量的監(jiān)聽操作,相對于不可控性萄唇,還是選擇了Vuex穩(wěn)妥的作為統(tǒng)一倉庫管理檩帐。

Vuex設(shè)計

? ? ? ?Vuex不做詳細介紹了,可以搜索文章自己去理解另萤,總之你如果使用Vuex就要遵循一個原則湃密,你如果需要修改store中的某個狀態(tài),一定要通過commit-mutations的形式或者異步提交dispatch的形式四敞,這樣你可以跟蹤一些狀態(tài)的變化泛源,這是一個行為上的約束,你也可以直接修改state忿危,那么當數(shù)據(jù)狀態(tài)出錯的時候并不能定位到原因所在达箍。

store下新建index.js

我的項目中目前維護了兩種狀態(tài)一種是Tree數(shù)據(jù),一種是公共的loading的狀態(tài)铺厨,為了可拓展性缎玫,將index.js分離成modules的形式,每新增一個狀態(tài)庫只需要增加一條解滓,而不需要頻繁修改index.js的代碼赃磨。

data_store.js是本文主要講的數(shù)據(jù)的倉庫如下:

很簡單,修改data與提交的操作洼裤。

倉庫寫好了邻辉,那么現(xiàn)在就開始交互的部分。

需求是腮鞍,每點擊一層值骇,那么就去請求后臺獲取他下一層的數(shù)據(jù),有數(shù)據(jù)則展開下拉缕减。并且每一個node節(jié)點都有增刪改的功能雷客。好一樣樣來寫

開發(fā)前先寫一個公共類庫,集中一些axios請求和工具函數(shù)桥狡。首先搅裙,想一下交互的思路皱卓,已知后臺會返回每一節(jié)點的唯一id,點擊這個節(jié)點的時候根據(jù)id向后臺發(fā)送請求獲取當前id下一層數(shù)據(jù)部逮,當?shù)玫揭粋€節(jié)點的數(shù)組的時候如何插入store中的data倉庫娜汁?換句話說插入到data中的哪一層?刪除也是一樣兄朋,得到點擊id了掐禁,那么刪除data的哪一層節(jié)點?因為是數(shù)據(jù)驅(qū)動視圖颅和,所以我們只增刪改data倉庫傅事,那么Dom就會觸發(fā)相應的更新。因此需要一些遞歸函數(shù)來輔助操作峡扩。

新建api.js

1.封裝后臺Post請求

2.封裝接口:

3.遞歸添加與刪除公共方法

遞歸:傳入id和對比的對象數(shù)組蹭越,首先對比根層級,如果id匹配執(zhí)行相應的增刪教届,如果不匹配則向下nodes[]中去查找响鹃,還不存在則遞歸查找。上面兩個函數(shù)封裝了后臺獲取數(shù)據(jù)增加與刪除的函數(shù)案训,還需要封裝自定義添加的函數(shù)买置,可以自定義添加數(shù)據(jù),而不是后臺獲取的數(shù)據(jù)强霎,原理相同忿项,只是增加一個數(shù)據(jù)模板。

函數(shù)比較簡單就是一個遞歸函數(shù)城舞,封裝好那么就在TreeMenu.vue進行調(diào)用了 倦卖,引入(后邊還會添加一些公共函數(shù),這里就先引入了椿争,就不逐步截圖了)

添加loadTreeNode后臺獲取節(jié)點的函數(shù):

? ? ? ?首先會傳遞一個id,根據(jù)id向后臺發(fā)送請求熟嫩,然后獲取到數(shù)據(jù)按照定義好的格式push進一個臨時的對象dataCache秦踪。這里要說明一下為什么沒有直接push進store中的data倉庫,而是先全部push進一個臨時對象呢掸茅?我對Vuex的理解是椅邓,他是一個倉庫,你去取東西或者存東西昧狮,你是一樣樣的去放景馁,還是等這次的數(shù)據(jù)都準備好了再去一次性的去放?為了便于跟蹤狀態(tài)變化(store的debugger模式或者VueTools)逗鸣,我選擇將這次請求的數(shù)據(jù)作為一次狀態(tài)變化去改變合住。下面的遞歸插入也是一樣绰精,都是臨時設(shè)置一個數(shù)組,只操作這個臨時的數(shù)組而不去頻繁去修改store中的數(shù)據(jù)透葛,最后一次修改笨使,這樣的結(jié)果會更準確定位狀態(tài)變化,也不會頻繁修改倉庫造成不可控的后果僚害,唯一的影響可能會有幾十ms的循環(huán)延遲硫椰,相比較于安全性,這幾十ms的性能不考慮萨蚕。

上篇文章預先寫好的toggleChildren方法插入如下代碼:

這樣就為每一層node節(jié)點綁定了點擊事件靶草,點擊獲取數(shù)據(jù)顯示。但是這只是點擊事件岳遥,那么第一次加載頁面的時候是沒有根數(shù)據(jù)的啊奕翔,所以要在Tree.vue中寫一個初始化的函數(shù),初始加載根節(jié)點:

在Created中調(diào)用(已經(jīng)跟后臺確認根節(jié)點id寒随,調(diào)用時id直接賦值即可)

這樣一個樹狀菜單點擊加載就做好了

自定義添加與刪除

TreeMenu.vue新建兩個按鈕:

圖中高亮顯示

綁定方法:

dataTemplate是一個添加的數(shù)據(jù)模板糠悯,可自定義添加,this.count是定義的一個變量妻往,保證每次id都不同互艾。實際上添加和刪除是要走后臺的,上面寫的這種是前端頁面的添加與刪除讯泣,因為需求變了纫普,所以沒有繼續(xù)往下寫,但是思路和上面后臺獲取添加是一樣的好渠,點擊傳遞id給后臺昨稼,如果后臺返回成功那么就執(zhí)行自定義添加或者刪除的代碼就是了。現(xiàn)在是這樣的效果:

添加刪除會動態(tài)增加與刪除

一個基本的樹狀菜單就開發(fā)完成了拳锚,改這個操作也很簡單假栓,說一下就不寫了,點擊修改將當前標題標簽切換成input標簽霍掺,輸入完成再賦值給當前元素即可匾荆,也是要向后臺傳遞的。還有一些可以優(yōu)化的地方杆烁,現(xiàn)在每次點擊都會發(fā)送axios請求牙丽,需要優(yōu)化一下:

在loadTreeNode這個方法中,給data新增一條屬性兔魂,來標記是否加載:

在api.js添加公共函數(shù)

然后在每次點擊的時候判斷當前id的isLoad是否為true烤芦,為真則return

現(xiàn)在樹形插件已經(jīng)開發(fā)完成了,需要根據(jù)上一篇來一起實現(xiàn)析校,鏈接:Vue遞歸組件+Vuex開發(fā)樹形組件Tree?构罗。

因為當時使用element-ui組件樹铜涉,各種bug,無奈自己手寫一個組件樹插件绰播,時間比較倉促骄噪,有些優(yōu)化和封裝的地方?jīng)]有去考慮,找個時間封裝個組件蠢箩。

謝謝链蕊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谬泌,隨后出現(xiàn)的幾起案子滔韵,更是在濱河造成了極大的恐慌,老刑警劉巖掌实,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陪蜻,死亡現(xiàn)場離奇詭異,居然都是意外死亡贱鼻,警方通過查閱死者的電腦和手機宴卖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邻悬,“玉大人症昏,你說我怎么就攤上這事「阜幔” “怎么了肝谭?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛾扇。 經(jīng)常有香客問我攘烛,道長,這世上最難降的妖魔是什么镀首? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任坟漱,我火速辦了婚禮,結(jié)果婚禮上更哄,老公的妹妹穿的比我還像新娘靖秩。我一直安慰自己,他們只是感情好竖瘾,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著花颗,像睡著了一般捕传。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扩劝,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天庸论,我揣著相機與錄音职辅,去河邊找鬼。 笑死聂示,一個胖子當著我的面吹牛域携,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鱼喉,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼秀鞭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了扛禽?” 一聲冷哼從身側(cè)響起锋边,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎编曼,沒想到半個月后豆巨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡掐场,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年往扔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片熊户。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡萍膛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敏弃,到底是詐尸還是另有隱情卦羡,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布麦到,位于F島的核電站绿饵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏瓶颠。R本人自食惡果不足惜拟赊,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粹淋。 院中可真熱鬧吸祟,春花似錦、人聲如沸桃移。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽借杰。三九已至过吻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纤虽。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工乳绕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逼纸。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓洋措,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杰刽。 傳聞我的和親對象是個殘疾皇子菠发,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 寫在前面 首先,本篇文章所開發(fā)的組件并非一個已經(jīng)開源的上線組件专缠,所以如果你急于需要一個插件來只做你的項目雷酪,那么并不...
    馮陽陽的博客閱讀 5,769評論 1 30
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,898評論 2 89
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)涝婉,斷路器哥力,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 第一集,探險召喚 原則:*你必須自己思考真相是什么 在這個世界上墩弯,每個人都會面臨著很多位置吩跋,重要的不是知道多少,而...
    楊寧victor閱讀 1,457評論 0 3
  • 樹渔工,西瓜锌钮,椅子~ 喜歡這種夏天的感覺,而且特別復古引矩,像小時候的夏天梁丘。 樹葉的形狀讓我想到了小時候看的動畫,于是就畫...
    打油超人閱讀 195評論 0 1