Vue 爬坑之路(九)—— 用正確的姿式封裝組件

https://www.cnblogs.com/wisewrong/p/6834270.htmlhtml

 

 

Talk is cheap. Show me your code

Vue 爬坑之路(九)—— 用正確的姿式封裝組件

 

迄今爲止作的最大的 Vue 項目終於提交測試,每天加班的日子終於告一段落。。。前端

在開發過程當中,結合 Vue 組件化的特性,開發通用組件是很基礎且重要的工做vue

通用組件必須具有高性能、低耦合的特性ios

爲了知足這些特性,開發的時候有不少須要注意的地方,這裏我和你們分享一下個人心得git

 

 

1、數據從父組件傳入github

爲了解耦,子組件自己就不能生成數據。即便生成了,也只能在組件內部運做,不能傳遞出去。面試

父對子傳參,就須要用到 props,一般的 props 是這樣的:ajax

 

可是通用組件的的應用場景比較複雜,對 props 傳遞的參數應該添加一些驗證規則vue-router

 

對於經過 props 傳入的參數,不建議對其進行操做,由於會同時修改父組件裏面的數據vuex

// vue2.5已經針對 props 作出優化,這個問題已經不存在了

若是必定須要有這樣的操做,能夠這麼寫:

爲何不直接寫 let myData = this.data 呢?

由於直接賦值,並不能解除雙向綁定。改變 myData 的時候,會改變 this.data,父組件的 data 也會變

而經過 JSON 轉換以後,就能任性的操做了

 

 

2、在父組件處理事件

在通用組件中,一般會須要有各類事件,

好比複選框的 change 事件,或者組件中某個按鈕的 click 事件

這些事件的處理方法應當儘可能放到父組件中,通用組件自己只做爲一箇中轉

這樣既下降了耦合性,也保證了通用組件中的數據不被污染

關於 $emit 的具體寫法,能夠參考《 Vue 爬坑之路(二)—— 組件之間的數據傳遞》

不過,並非全部的事件都放到父組件處理

好比組件內部的一些交互行爲,或者處理的數據只在組件內部傳遞,這時候就不須要用 $emit 了

 

 

3、記得留一個 slot

一個通用組件,每每不可以完美的適應全部應用場景

因此在封裝組件的時候,只須要完成組件 80% 的功能,剩下的 20% 讓父組件經過 solt 解決

關於 slot 的具體用法,能夠參考個人博客 《 Vue 爬坑之路(五)—— 組件進階 》

 

上面是一個通用組件,在某些場景中,右側的按鈕是 「處理」 和 「委託」。在另外的場景中,按鈕須要換成 「查看」 或者 「刪除」

在封裝組件的時候,就不用寫按鈕,只須要在合適的位置留一個 slot,將按鈕的位置留出來,而後在父組件寫入按鈕

 

開發通用組件的時候,只要不是獨立性很高的組件,建議都留一個 slot,即便還沒想好用來幹什麼

 

 

4、不要依賴 Vuex

《 Vue 爬坑之路(四)—— 與 Vuex 的第一次接觸》

父子組件之間是經過 props 和 自定義事件 來傳參,非父子組件一般會採用 Vuex 傳參

可是 Vuex 的設計初衷是用來管理組件狀態,雖然能夠用來傳參,但並不推薦

由於 Vuex 相似於一個全局變量,會一直佔用內存

在寫入數據龐大的 state 的時候,就會產生內存泄露

 

當頁面刷新的時候,Vuex 會初始化,同時也會丟失編輯過的數據

若是刷新頁面時須要保留數據,能夠經過 url 或者 sessionstorage 保存 id,而後 ajax 請求數據

 

 

5、合理運用 scoped 編寫 CSS

在編寫組件的時候,能夠在 <style> 標籤中添加 scoped,讓標籤中的樣式只對當前組件生效

可是一味的使用 scoped,確定會產生大量的重複代碼

因此在開發的時候,應該避免在組件中寫樣式

當全局樣式寫好以後,再針對每一個組件,經過 scoped 屬性添加組件樣式

 

 
分類:  Vue
標籤:  vue組件vuexprops
好文要頂  關注我  收藏該文   
5
0
 
 
 
« 上一篇: 針對單個 js 文件禁用 ESLint 語法校驗
» 下一篇: Node.js 蠶食計劃(一)—— 模塊化編程
posted @  2017-07-25 19:12 Wise.Wrong 閱讀(12044) 評論(5) 編輯 收藏
 

 
#1樓   2017-07-27 14:47 chrwwmm  
你好,請問Vue爬坑之路系列文章源碼的github地址是什麼?
#2樓 [ 樓主] 2017-07-27 14:57 Wise.Wrong  
@ chrwwmm
沒有源碼。。。都是即時寫的。。。
不過我正在整理一個 vue 的開源項目,作好以後能夠發出來作個參考~
#3樓   2017-11-13 13:34 abcwt112  
那麼...被多層封裝的組件,要在最外層處理事件的話只能內層組件一層一層emit出來? 一層層@事件 ?
#4樓 [ 樓主] 2017-11-13 13:46 Wise.Wrong  
@ abcwt112
通用組件爲了下降耦合性,必須由父組件處理事件。而多件嵌套的時候確定不會是一堆通用組件吧,這時就要根據實際狀況處理事件了。
#5樓   2017-11-13 19:33 abcwt112  
@ WiseWrong
大佬給個QQ好嗎...後面有問題好請教 ^_^
 
 
 
相關文章
相關標籤/搜索