成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[源碼學(xué)習(xí)] Vuex

FreeZinG / 2164人閱讀

摘要:為了更清楚的理解它的原理和實(shí)現(xiàn),還是從源碼開始讀起吧。結(jié)構(gòu)梳理先拋開,的主要源碼一共有三個(gè)文件,,初始化相關(guān)用到了和我們使用創(chuàng)建的實(shí)例并傳遞給的根組件。這個(gè)方法的第一個(gè)參數(shù)是構(gòu)造器。的中,在保證單次調(diào)用的情況下,調(diào)用對(duì)構(gòu)造器進(jìn)入了注入。

原文鏈接

Vuex 作為 Vue 官方的狀態(tài)管理架構(gòu),借鑒了 Flux 的設(shè)計(jì)思想,在大型應(yīng)用中可以理清應(yīng)用狀態(tài)管理的邏輯。為了更清楚的理解它的原理和實(shí)現(xiàn),還是從源碼開始讀起吧??偣?1000 多行的代碼,讀起來也相對(duì)輕松。

cloc src/

------------------------------------------------------------------
Language   files          blank        comment         code
------------------------------------------------------------------
JavaScript   5             53            141            389
------------------------------------------------------------------
SUM:         5             53            141            389
------------------------------------------------------------------

cloc test/

------------------------------------------------------------------
Language   files          blank        comment         code
------------------------------------------------------------------
JavaScript   5             62             30            793
------------------------------------------------------------------
SUM:         5             62             30            793
------------------------------------------------------------------
結(jié)構(gòu)梳理

先拋開 middlewares,Vuex 的主要源碼一共有三個(gè)文件:

file intro
index.js Class Store, install,...
override.js 初始化 Vuex
util.js 相關(guān) util(用到了 getWatcher 和 getDeep)
Store

我們使用 Store 創(chuàng)建 Vuex 的實(shí)例并傳遞給 Vue 的根組件。主要包含了 statemutation。Store 創(chuàng)建了一個(gè) datastate 的 Vue 實(shí)例,使用了 ES6 Class 的 getset 對(duì) state 做了映射,對(duì) state 的重新 set 當(dāng)然是不允許的,get 則映射到了 this._vm._data。

Store 提供了 dispatch 方法來完成對(duì) state 的修改,和想象中的差不多,在 _mutations 里找到對(duì)應(yīng) type 的 mutation,參數(shù)并入 this.state 傳參調(diào)用。

override

作為一個(gè) Vue 的插件,Vuex 需要被這樣引入:

import Vue from "vue"
import Vuex from "vuex"

Vue.use(Vuex)

Vue 的插件應(yīng)當(dāng)有一個(gè)公開方法 install。這個(gè)方法的第一個(gè)參數(shù)是 Vue 構(gòu)造器。 Vuex 的 install 中,在保證單次調(diào)用的情況下,調(diào)用 override 對(duì) Vue 構(gòu)造器進(jìn)入了注入。

override 中對(duì) Vue.prototype._init 注入了 vuexInit,vuexInit 會(huì)在每個(gè) instance 的 init hook 中調(diào)用。

第一步是綁定 store, Vuex 會(huì)尋找 options 中的 store 作為實(shí)例的 $store,在不存在時(shí)則以遞歸的方式尋找父組件中的 $store,因此在 Vuex 的項(xiàng)目中,store 只需要在根組件中注入即可。

第二步是處理 vuex, 分別處理其中的 gettersactions, 以 example/counter/Counter.vue 為例:

getters

Vuex 用 Object.defineProperty 為每個(gè) getter 在 vm 上綁定了 data,特別的是 getter 作為單向僅 get 數(shù)據(jù)流,并不能被 set,所以對(duì)應(yīng)的 setter 為報(bào)錯(cuò)用的空函數(shù)。而 getter 的原理類似于 computed getter,特別的是使用了 store 的 uniqueId 為標(biāo)識(shí)做了緩存,這樣同一個(gè) getter 在所有組件中都會(huì)使用相同的 watcher。

setter

Action 相對(duì)要簡單一些,以 $store 作為 action 第一個(gè)參數(shù),并將 action 綁定在 instance 上。形成了一個(gè)閉環(huán),讓 action 訪問到 store。

總結(jié)

Vuex 源碼上粗略的分析基本就到這里了,其實(shí)很多地方的代碼都很值得細(xì)細(xì)研究,比如 Store 中的 middlewares 可以完成一些神奇的事情,這里就不一一分析了,畫了一張圖,按源碼的思路大概表達(dá)下數(shù)據(jù)流的意思。O(∩_∩)O

      +-----------+
      |           |
      |   Store   +>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+
      |           |                                   v
      |-----------|                                   v
      |   state   <<<<<<+                             v
      |-----------|     ^                             v
+>>>>>- distapatch ->>>>+                             v
^     +-----------+                                   v
^                                                     v
^                          +--------------------+     v
^                          |                    |     v
^                          |     Component      |     v
^                          |                    |     v
^                          |--------------------|     v
^                    +<<<<<-----  $store  <------<<<<<+
^                    v     |--------------------|
^                    v     |  vuex: {           |
^                    v     |                    |
^                    +>>>>>----- getters: {},   |
^                          |                    |
+<<<<<<<<<<<<<<<<<<<<<<<<<<----- actions: {}    |
                           |                    |
                           |  }                 |
                           +--------------------+

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79444.html

相關(guān)文章

  • Vuex源碼學(xué)習(xí)(一)功能梳理

    摘要:我們通常稱之為狀態(tài)管理模式,用于解決組件間通信的以及多組件共享狀態(tài)等問題。創(chuàng)建指定命名空間的輔助函數(shù),總結(jié)的功能首先分為兩大類自己的實(shí)例使用為組件中使用便利而提供的輔助函數(shù)自己內(nèi)部對(duì)數(shù)據(jù)狀態(tài)有兩種功能修改數(shù)據(jù)狀態(tài)異步同步。 what is Vuex ? 這句話我想每個(gè)搜索過Vuex官網(wǎng)文檔的人都看到過, 在學(xué)習(xí)源碼前,當(dāng)然要有一些前提條件了。 了解Vuex的作用,以及他的使用場景。 ...

    livem 評(píng)論0 收藏0
  • Vuex源碼學(xué)習(xí)(二)脈絡(luò)梳理

    摘要:各位看官?zèng)]看過功能梳理的可以先閱讀下源碼學(xué)習(xí)一功能梳理前車之鑒有了源碼學(xué)習(xí)的經(jīng)驗(yàn),每次看認(rèn)真鉆研源代碼的時(shí)候都會(huì)抽出一小段時(shí)間來大體瀏覽一遍源代碼。大體了解這個(gè)源代碼的脈絡(luò),每個(gè)階段做了什么,文件目錄的劃分。 各位看官 沒看過功能梳理的可以先閱讀下Vuex源碼學(xué)習(xí)(一)功能梳理. 前車之鑒 有了vue-router源碼學(xué)習(xí)的經(jīng)驗(yàn),每次看認(rèn)真鉆研源代碼的時(shí)候都會(huì)抽出一小段時(shí)間來大體瀏覽一...

    chenjiang3 評(píng)論0 收藏0
  • 一張思維導(dǎo)圖輔助你深入了解 Vue | Vue-Router | Vuex 源碼架構(gòu)

    摘要:前言本文內(nèi)容講解的內(nèi)容一張思維導(dǎo)圖輔助你深入了解源碼架構(gòu)??偨Y(jié)以上內(nèi)容是筆者最近學(xué)習(xí)源碼時(shí)的收獲與所做的筆記,本文內(nèi)容大多是開源項(xiàng)目技術(shù)揭秘的內(nèi)容,只不過是以思維導(dǎo)圖的形式來展現(xiàn),內(nèi)容有省略,還加入了筆者的一點(diǎn)理解。1.前言 本文內(nèi)容講解的內(nèi)容:一張思維導(dǎo)圖輔助你深入了解 Vue | Vue-Router | Vuex 源碼架構(gòu)。 項(xiàng)目地址:github.com/biaochenxuy… 文...

    weij 評(píng)論0 收藏0
  • Vuex源碼學(xué)習(xí)(五)加工后的module

    摘要:先看一下創(chuàng)建一個(gè)容器存放該模塊所有的子模塊存放自己未被加工的模塊內(nèi)容。是封裝的工具方法,用于遍歷對(duì)象的。這些方便高效的方法為之后的注冊(cè)。 沒有看過moduleCollection那可不行!Vuex源碼學(xué)習(xí)(四)module與moduleCollection 代碼塊和截圖的區(qū)別 代碼塊部分希望大家按照我的引導(dǎo)一行行認(rèn)真的讀 代碼的截圖是希望大家能記住圖中的結(jié)構(gòu)與方法,下面會(huì)對(duì)整體進(jìn)行一...

    2bdenny 評(píng)論0 收藏0
  • 自定義自己的vue-cli模板

    摘要:自定義自己的模板在使用的過程中,常用的模板只為我們提供最基礎(chǔ)的內(nèi)容,但每次需要新建一個(gè)項(xiàng)目的時(shí)候就需要把之前項(xiàng)目的一些配置都搬過來,這樣就造成挺大的不方便,如果是作為一個(gè)團(tuán)隊(duì),那么維護(hù)一個(gè)通用的模板,我認(rèn)為是挺有必要的。 自定義自己的vue-cli模板 在使用vue-cli的過程中,常用的webpack模板只為我們提供最基礎(chǔ)的內(nèi)容,但每次需要新建一個(gè)項(xiàng)目的時(shí)候就需要把之前項(xiàng)目的一些配置...

    付永剛 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<