深入vuex原理(上)

前言

vuex作為vue生態的重要組成部分,是對store進行管理的一柄利劍。簡而言之,vuex是vue的狀態管理器。使用vuex可用使數據流變得清晰、可追蹤、可預測,更可以簡單的實現 類似時光穿梭 等高級功能,對于復雜的大型應用來講,vuex將變得尤為重要,對于 store的切分、store的module化、store的變更、store的追蹤 等等 store的管理工作,使用vuex 管理store會大大提高項目的穩定性,擴展性!本篇將通過vuex的源碼對vuex 的設計以及實現原理 進行剖析!


注:本篇文章只展示關鍵核心代碼,一來由于篇幅原因,二來展示核心代碼更容易讓人理解!再者,本篇屬于 vuex 高級篇,對于本篇章中 涉及的 vue 相關的機制 以及 vuex的 高級使用 等 不進行過多贅述!請自行前往官網查看!


準備

淺析vuex的構成

vuex 引入 StateGetter 的概念對狀態進行定義;使用 MutationAction對狀態進行變更;引入Module對狀態進行模塊化分割;引入插件對狀態進行快照、記錄、以及追蹤等;提供了mapState、mapGetters、 mapActions、 mapMutations 輔助函數方便開發者在vm中處理store。具體構成關系如下:

淺析vuex的使用

vuex的使用方式很簡單,具體使用細節請參見 vuex官網,本文為了剖析源碼方便,只進行簡單介紹!我們只需要利用vue的use機制將 實例化后的store對象 注入vue實例即可!如下圖:

核心代碼如下:


Vue.use(Vuex); // 1. vue的插件機制,安裝vuex
let store = new Vuex.Store({ // 2.實例化store,調用install方法state,getters,modules,mutations,actions,plugins
});
new Vue({ // 3.注入store, 掛載vue實例store,render: h=>h(app)
}).$mount('#app');復制代碼

對vuex的疑問

我們在使用vuex對store進行管理的同時,不禁會問:

  • vuex的store是如何注入到組件中的?
  • vuex的state 和 getter 是如何映射到 各個組件實例中自動更新的?

本篇章旨在解決以上疑問,讓我們一起深入vuex的原理,揭開vuex的神秘面紗吧!

探秘原理

本部分將針對以上疑問,通過源碼分析,剖析核心代碼,對問題進行解答。

疑問:vuex的store是如何注入到組件中的?

要解答這個問題,我們先從vuex的使用表象上著手,從上面的介紹我們知道,使用vuex之前我們要對vuex進行安裝!核心代碼如下:

Vue.use(Vuex); // vue的插件機制,安裝vuex插件
復制代碼

源碼分析
上面的代碼得益于vue的插件機制,會在調用vuex的 install方法時,裝載vuex! 所以我們直接關注 install方法的實現,其核心代碼如下:

Vue.mixin({ beforeCreate: vuexInit });
復制代碼

可見,store注入 vue的實例組件的方式,是通過vue的 mixin機制,借助vue組件的生命周期 鉤子 beforeCreate 完成的。即 每個vue組件實例化過程中,會在 beforeCreate 鉤子前調用 vuexInit 方法。下面,我們將焦點聚焦在 vuexInit 函數。 下面為 vuexInit 的核心代碼!

this.$store = typeof options.store === 'function'? options.store(): options.store
復制代碼

該代碼的核心問題是this的指向,得益于mixin機制,this將指向 vue組件實例!最終,我們可以再 vue組件實例上獲得vuex 的store 對象的引用 $store!圖示如下:

分析至此,我們已經得出該問題的答案!

結論

vuex利用了vue的mixin機制,混合 beforeCreate 鉤子 將store注入至vue組件實例上,并注冊了 vuex store的引用屬性 $store!

對于其余問題的解答,請前往 深入vuex原理(下)

轉載于:https://juejin.im/post/5c779b7df265da2da771e052

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449308.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449308.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449308.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Maven入門(含實例教程)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Maven這個個項目管理和構建自動化工具,越來越多的開發人員使用它來管理項目中的jar包。接下來小寶鴿,將從下面幾個…

進階正則表達式

本文同步自我的博客園:http://www.cnblogs.com/hustskyking/ 關于正則表達式,網上可以搜到一大片文章,我之前也搜集了一些資料,并做了排版整理,可以看這篇文章http://www.cnblogs.com/hustskyking/archive/2013/06/04/…

tkinter攔截關閉事件

import tkinter as tk from tkinter import messageboxroot tk.Tk()def on_closing():if messagebox.askokcancel("Quit", "Do you want to quit?"):root.destroy()root.protocol("WM_DELETE_WINDOW", on_closing) root.mainloop() 轉載于:htt…

阿里云服務器一分價錢一分貨,切記!

阿里云為了滿足低端市場的需求,會推出一些價格非常便宜的機器,但是這些機器是為新手練手用或者做測試用的,性能不行。你不要指望花每月9.5元,買一臺學生機,就可以放置流量大的網站還不卡,那個不現實。阿里云…

請記住:你的付出都會以該有的方式歸來(圖)

人,這一生就像一個耕種的農民。你不是在付出,就是在收獲。當然,有人說,付出并不一定有回報。這是大多數人都認同的,也就是付出與得到不一定成正比,不是付出的越多就得到的越多。但我想告訴你的是&#xff0…

c++primer plus筆記

> 第六版 操作符重載 #include<iostream> using namespace std;class Time { public:Time(){hm0;}Time(int _h,int _m){h _h;m _m;}void show(){printf("%02d:%02d \n",h,m);}Time operator(const Time &t){Time result;result.m t.m m;result.h t…

Luogu P3975 [TJOI2015]弦論

題目鏈接 \(Click\) \(Here\) 題目大意&#xff1a; 重復子串不算的第\(k\)大子串重復子串計入的第\(k\)大子串寫法&#xff1a;后綴自動機。 和\(OI\) \(Wiki\)上介紹的寫法不太一樣&#xff0c;因為要同時解決兩個問題。 把字符串每個前綴所在等價類的\(siz\)記為\(1\)&#…

《 圖解 HTTP 》讀書筆記

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. TCP/IP 協議族按層次分為&#xff1a;應用層、傳輸層、網絡層、數據鏈路層。 2. IP 協議的作用是把各種數據包傳送給對方。 3. IP …

身體出現危險時會發出信號 這太重要了 一定收藏 !(組圖)

太重要了&#xff01;真的太重要了&#xff01; 心臟有問題時———左邊手臂會酸、麻、痛。 肝臟有問題時———小腿晚上睡覺時容易抽筋。 腎臟出現問題時———聲音就會出不來&#xff0c;就會沙啞。 脾胃出現問題時———偏頭痛。 任何試圖更改生物鐘的行為&#xff0c;都將給…

數據結構與算法-概念

計算機從解決數值計算問題到解決生活中的問題 現實生活中的問題涉及不同個體間的復雜聯系 需要在計算機程序中描述生活中個體間的聯系數據結構主要研究非數值計算程序問題中的操作對象以及它們之間的關系而不是研究復雜的算法 數據結構 基本概念 數據&#xff1a;程序的操作對象…

騰訊聯手聯通推出車聯網“網卡”,打“內容”+“流量”的組合拳

車載生態已經成為了一個兵家必爭之地了&#xff0c;于商業前景而言&#xff0c;這是一個BAT都無法忽視的掘金勝地。 從市場數據來看&#xff0c;全球車聯網市場年復合增長率達到25%&#xff0c;根據汽車之家大數據顯示&#xff1a;自2014年以來&#xff0c;車聯網上市新車型滲…

編程面試中的十個常見錯誤

本文由 伯樂在線 - darkinlight 翻譯自 thegeekstuff。歡迎加入技術翻譯小組。轉載請參見文章末尾處的要求。 身為程序員&#xff0c;你肯定知道和其他技術工作面試比起來&#xff0c;編程工作的面試流程略有不同。 這篇文章會就你在編程面試中應當避免的10個問題展開討…

費曼技巧與博客

費曼技巧與博客 什么是費曼技巧&#xff1f; 費曼技巧是一種學習方法&#xff0c;核心是以教促學。 具體實踐 以學習費曼技巧為例&#xff1a; 確定學習目標為學習費曼技巧。尋找資料&#xff08;網絡、書籍、報刊等&#xff09;學習費曼技巧&#xff0c;直到自己認為已經理解了…

阿里云服務器 CentOS 7上-- Docker 安裝 網關(API-Getway)--KONG

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 全程操作按官方文檔來就可以了。 1.將 Kong 連接到 Cassandra 或 PostgreSQL 容器 Kong支持 2 種數據庫&#xff1a;Cassandra 或 Post…

每個程序員都應該了解的內存知識

英文原文&#xff1a;lwn.net&#xff0c;翻譯&#xff1a;開源中國 [編輯的話: Ulrich Drepper最近問我們&#xff0c;是不是有興趣發表一篇他寫的內存方面的長文。我們不用看太多就已經知道&#xff0c;LWN的讀者們會喜歡這篇文章的。內存的使用常常是軟件性能的決定性因子&…

山區建小學

題目描述 政府在某山區修建了一條道路&#xff0c;恰好穿越總共nn個村莊的每個村莊一次&#xff0c;沒有回路或交叉&#xff0c;任意兩個村莊只能通過這條路來往。已知任意兩個相鄰的村莊之間的距離為d_idi?&#xff08;為正整數&#xff09;&#xff0c;其中&#xff0c;0<…

idea debugger console 不見了--還原 console 圖標

1 找了好久&#xff0c;也找不到&#xff0c;調試的時候挺麻煩的。 2 最后發現 有個一個重置&#xff0c;視圖的按鈕。點擊一下就恢復 。 如下圖。轉自&#xff1a;https://blog.csdn.net/changdejie/article/details/64127026

實驗五:任意輸入10個int類型數據,排序輸出,再找出素數

import java.util.Scanner; public class Pxsushu {public static void main(String[] args) {// TODO Auto-generated method stubScanner s new Scanner(System.in);int temp;//對數組事先聲明并創建10個空間int[] a new int[10];//把輸入的數存儲為數組for (int i 0; i &…

Vue筆記(六)——Vue組件通信Vuex

組件通信 vue本身的組件通信 父>子&#xff1a;父組件向子組件傳參或者調用子組件的方法子>父&#xff1a;子組件向父組件傳參或者調用父組件的方法兄弟之間&#xff1a;兄弟組件之間傳參或者調用方法父子通信 傳參 - props思路&#xff1a;定義子組件的屬性&#xff08;…

灼灼夏日 - 遙思故鄉 - 赤子無相忘

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 偶然翻看舊照片&#xff0c; 想起沒有帶過來的一本本詩集、散文集、手抄本、畫冊 ... 想起母親的寄掛 ... 想起父親的沉默 ... 想起少…