Vuex的正確打開方式

有太多人不知道為什么要使用vuex,而使用它的目的還停留在“這是一個(gè)新技術(shù),大家都在用,所以我也要用”

vuex并不難編寫,但用好卻不容易,“過度封裝”“過早優(yōu)化”十分常見。

如果你不知道為什么要使用它,那一定做不到用好它。所以這篇文章將解析vuex的優(yōu)缺點(diǎn),讓你知道在什么情況下應(yīng)該使用它,否則不該使用。

先提出觀點(diǎn): 能放在組件中的狀態(tài)就不要放在state里,state只保存全局?jǐn)?shù)據(jù)

任何東西有好也有壞,當(dāng)好處大于壞處的場(chǎng)景下我們才應(yīng)該使用它,vuex也是如此。

所以在使用它之前 必須明了它潛在的缺點(diǎn)

缺點(diǎn)

  • 代碼會(huì)更加復(fù)雜,原本只需要寫在一個(gè)組件里的代碼,現(xiàn)在需要寫在多個(gè)地方(store中申明并定義好action等,組件中引入store去使用),這也拋棄了單文件組件的優(yōu)勢(shì)。
  • 當(dāng)組件使用了store中的數(shù)據(jù),就意味著這個(gè)組件將不再是一個(gè)“無副作用”的組件,那么這個(gè)組件的可重用性將大打折扣。
  • Store只不過是一種全局變量,從一開始學(xué)習(xí)代碼的時(shí)候有人就告訴我們: 不要去聲明和操作全局變量,這將導(dǎo)致狀態(tài)錯(cuò)綜復(fù)雜讓人頭疼。
  • Vue組件的父子組件通訊機(jī)制(emit和props)很好, 能夠完美的解耦各個(gè)組件, 請(qǐng)一定要優(yōu)先使用這種通訊方式.

為了避免諸多缺點(diǎn) 在使用Vuex之前有必要思考一下幾點(diǎn):

1. 使用vuex是否會(huì)引入垃圾變量

Store不會(huì)像組件一樣有生命周期, 那么放在Store的狀態(tài)(State)如果管理不好就會(huì)變成垃圾變量, 這也是能不能將變量放在Store中的重要判斷條件.

所以記得不再使用的State記得銷毀.

雖然JS也有GC, 但是和其他語言一樣的, GC是有代價(jià)的, 如果能一個(gè)變量能簡(jiǎn)單的被銷毀就應(yīng)該及時(shí)銷毀它, 正如Vue組件Destory機(jī)制存在的意義.

但其實(shí), Store中沒有生命周期機(jī)制 也沒有提供給用戶簡(jiǎn)單的銷毀狀態(tài)的機(jī)制, 所以只能通過 a = null 這樣的寫法, 這樣的寫法是低效的, 所以如果當(dāng)一個(gè)變量應(yīng)該頻繁的被創(chuàng)建/銷毀時(shí), 它就不應(yīng)該放在Store里.

2. 使用vuex會(huì)不會(huì)造成數(shù)據(jù)流錯(cuò)亂

單向數(shù)據(jù)流這個(gè)理念在引入Vuex之后可能會(huì)被開發(fā)者打亂. 但單向數(shù)據(jù)流無疑是應(yīng)該遵守的.

Store既然是全局的, 那總會(huì)有人為了方便 在本來應(yīng)該在子組件emit事件讓父組件去請(qǐng)求api的場(chǎng)景下, 子組件直接使用vuex的action去操作了api.

這樣的壞處不然而喻:

  • 子組件無法解耦.
  • 數(shù)據(jù)流錯(cuò)亂, 違背了單向數(shù)據(jù)庫原則
  • 多個(gè)地方都使用了vuex中的全局方法或狀態(tài),不易重構(gòu).

我舉的例子只是其一, 以"悲觀"的心態(tài)來猜測(cè)開發(fā)者寫出的代碼, 最后的錯(cuò)亂程度可能是無法想象的.

Store本身沒有錯(cuò), 但如果開發(fā)者用不好, 那就不要使用.

如何正確的使用Vuex

說了怎么多, vuex到底應(yīng)該如何正確的打開?

筆者有幾個(gè)準(zhǔn)則

少用vuex

最好的避免壞處的方式就是不用.

人無完人, 誰也不能確定自己寫出的代碼是完美的, 說不定自以為完美的代碼對(duì)于其他人來說就是樂色, 為了凈化開發(fā)環(huán)境, 寫越簡(jiǎn)單的代碼被人吐槽的概率越小. 當(dāng)然也是因?yàn)樯系巯矚g簡(jiǎn)單 - 奧卡姆剃刀定律

在項(xiàng)目中,vue提供的props, on和emit已經(jīng)能滿足90%的數(shù)據(jù)傳遞需求,這種傳遞方式是“無副作用”的, 應(yīng)當(dāng)優(yōu)先使用.

以"全局狀態(tài)"的概念來小心看待vuex

牢記全局狀態(tài)的副作用, 只有在對(duì)比了各種實(shí)現(xiàn)方式后, 發(fā)現(xiàn)vuex還是最優(yōu)解時(shí)才使用它.

最后

我的觀點(diǎn)可能會(huì)有些許偏激或者是不正確, 希望能在下方評(píng)論區(qū)得到你的建議.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Vue問得最多的面試題 什么是 mvvm? MVVM 是 Model-View-ViewModel 的縮寫。mvv...
    崽崽不哭閱讀 724評(píng)論 0 8
  • 前言 您將在本文當(dāng)中了解到,往網(wǎng)頁中添加數(shù)據(jù),從傳統(tǒng)的dom操作過渡到數(shù)據(jù)層操作,實(shí)現(xiàn)同一個(gè)目標(biāo),兩種不同的方式....
    itclanCoder閱讀 26,238評(píng)論 1 12
  • 1、active-class是哪個(gè)組件的屬性?嵌套路由怎么定義?答:vue-router模塊的router-lin...
    jane819閱讀 1,825評(píng)論 0 15
  • 一、 組件component 1. 什么是組件? 組件(Component)是 Vue.js 最強(qiáng)大的功能之一。組...
    饑人谷_Leonardo閱讀 2,150評(píng)論 0 18
  • Vuex是什么? Vuex 是一個(gè)專為 Vue.js應(yīng)用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲(chǔ)管理應(yīng)用的所有組件...
    蕭玄辭閱讀 3,230評(píng)論 0 6

友情鏈接更多精彩內(nèi)容