實現簡易版Vuex

從實現一個簡單的 Vuex 類來了解 Vuex 的工作原理。

實現思路

Vuex 下擁有 install 方法和 Store 類。即創建一個 Vuex 的模塊,這個模塊導出 install 方法和 Store 類。

install 方法

Vuex 是 Vue 的一個插件,所以需要實現 Vue 插件約定的 install 方 法。

Vue.use 內部會調用 Vuex 對象的 install 方法。

install作用:在 install 中把創建 Vue 根實例時傳入的store對象注入到 Vue 實例的$store中。目的是,在所有組件中可以通過this.$store獲取到 Vuex 中的倉庫。

然而在 install 方法中無法拿到 Vue 的實例對象(vm)。

怎么解決呢?

Vuex 中通過混入 beforeCreate 來獲取 Vue 實例。

部分代碼如下所示:

function install(Vue) {// 將Vue實例傳遞給一個局部變量,以便在函數范圍內使用_Vue = Vue;// 通過混入beforeCreate來獲取Vue實例,從而拿到選項中的store對象_Vue.mixin({beforeCreate() {if (this.$options.store) {this.$store = this.$options.store;} else if (this.$options.parent && this.$options.parent.$store) {this.$store = this.$options.parent.$store}},});
}

每個組件實例在創建之前,都會檢查是否有store選項,如果有,則將其注入到組件實例的$store屬性中。如果沒有,它會在組件的父級鏈中查找$store屬性。

Store

首先 store 是一個類,它的構造函數接受一個對象作為參數,這個對象中的屬性就是我們熟悉的 stategettersmutationsactions

  • 實現構造函數,接收 options
  • state 的響應式處理。
  • getterrs 的實現。
  • commitdispatch 方法。

注意:

下面代碼對 getters 處理中:
其中this.getters = Object.create(null),此處不直接寫this.getters = getters,是因為下面的代碼中要方法 getters 中的 key 如果這么寫的話,會導致 this.gettersgetters 指向同一個對象,當訪問 getterskey 的時候,實際上就是訪問 this.getterskey 會觸發 key 屬性的 get,會產生死遞歸。

class Store {constructor(options) {const { state = {}, getters = {}, mutations = {}, actions = {} } = options;this.state = _Vue.observable(state);// 此處不直接 this.getters = getters,會產生死遞歸this.getters = Object.create(null);Object.keys(getters).forEach((key) => {Object.defineProperty(this.getters, key, {// 箭頭函數 返回通過key在getters中獲取到的方法的執行 結果get: () => getters[key](this.state), // 這里是state如何傳到getters中的});});// mutations actions都是內部屬性,不希望外部直接訪問到this._mutations = mutations;this._actions = actions;}commit(type, payload) {this._mutations[type](this.state, payload);}dispatch(type, payload) {this._actions[type](this, payload);}
}

完整結構

Vue 中使用 Vuex 示例如下:
store–index.js

import Vue from 'vue' 
import Vuex from 'vuex' 
Vue.use(Vuex)
export default new Vuex.Store({state: { count: 0, msg: "Hello World" },getters: {reverseMsg(state) {return state.msg.split("").reverse().join("");},},mutations: {increate(state, payload) {state.count += payload.num;},},actions: {increate(context, payload) {setTimeout(() => {context.commit("increate", { num: 5 });}, 2000);},},
});

myvuex–index.js

let _Vue = null;class Store {constructor(options) {const { state = {}, getters = {}, mutations = {}, actions = {} } = options;this.state = _Vue.observable(state);// 此處不直接 this.getters = getters,會產生死遞歸this.getters = Object.create(null);Object.keys(getters).forEach((key) => {Object.defineProperty(this.getters, key, {// 箭頭函數 返回通過key在getters中獲取到的方法的執行 結果get: () => getters[key](this.state), // 這里是state如何傳到getters中的});});// mutations actions都是內部屬性,不希望外部直接訪問到this._mutations = mutations;this._actions = actions;}commit(type, payload) {this._mutations[type](this.state, payload);}dispatch(type, payload) {this._actions[type](this, payload);}
}function install(Vue) {// 將Vue實例傳遞給一個局部變量,以便在函數范圍內使用_Vue = Vue;// 通過混入beforeCreate來獲取Vue實例,從而拿到選項中的store對象_Vue.mixin({beforeCreate() {if (this.$options.store) {this.$store = this.$options.store;} else if (this.$options.parent && this.$options.parent.$store) {this.$store = this.$options.parent.$store}},});
}// 導出模塊
export default {Store,install,
};

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

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

相關文章

Linux:ftp文件傳輸實驗

Linux:ftp文件傳輸實驗 實驗實現 # 安裝對應軟件 [rootserver120 ~]# dnf install vsftpd -y [rootserver120 ~]# dnf install lftp -y# 關閉防火墻以及開啟服務 [rootserver120 ~]# systemctl disable --now firewalld [rootserver120 ~]# systemctl enable --no…

ambari-server高可用配置方案

制品 https://kdocs.cn/l/cie4hSgvUunX 前置條件 環境需要支持VRRP協議 環境需要配置好yum源 變更影響面 變更不會影響其他組件 配置lb(需要客戶側配置并提供LB地址) 轉發方式選擇 主備 監聽端口為8080、8440、8441 協議為tcp 后端監聽選擇kde-offline1為主

【RAG 論文】UPR:使用 LLM 來做檢索后的 re-rank

論文:Improving Passage Retrieval with Zero-Shot Question Generation ???? EMNLP 2022, arXiv:2204.07496 Code: github.com/DevSinghSachan/unsupervised-passage-reranking 論文:Open-source Large Language Models are Strong Zero-shot Query…

【HR】阿里三板斧--20240514

參考https://blog.csdn.net/haydenwang8287/article/details/113541512 頭部三板斧 戰略能不能落地、文化能不能得到傳承、人才能不能得到保障。 頭部三板斧適用的核心場景有三個:一是戰略不靠譜;二是組織效率低、不聚心;三是人才跟不上。對…

c++ 各版本特性介紹

c C是一種高級編程語言,以其強大的功能、靈活性和高效性而聞名。它是由Bjarne Stroustrup在20世紀80年代初期在貝爾實驗室開發的,作為C語言的一個擴展。C不僅包含了C語言的所有特性,還引入了面向對象編程(OOP)的概念&…

基于Vue3+ElementPlus項目,復制文字到剪貼板功能實踐指南,揭秘使用js-tool-big-box工具庫的核心優勢

在前端開發項目中,很多時候有那么一個場景,就是要求將一段文案復制下來,這段文案可能是一串很長的id,可能是一條命令語句,可能是一小段文案,復制到剪貼板上。這樣有利于用戶復制到其他地方去,使…

自然資源-城鄉規劃行業未來二十年將何去何從?

自然資源-城鄉規劃行業未來二十年將何去何從? 城鄉規劃行業未來風口在以下幾個方向,看好啦!緊跟國家發展戰略和政策背景。 1.大數據的城市規劃應用。 包含:公共數據平臺的搭建CIM,數據賦能治理,城市規劃中大數據應用的研究 等…

微軟必應bing國內官方代理商,廣告賬戶如何開戶?

微軟必應Bing作為全球知名的搜索引擎之一,其廣告平臺為眾多企業提供了廣闊的市場空間和精準的推廣機會。對于中國內地的企業而言,通過必應Bing開展國內廣告推廣不僅能夠觸及更廣泛的潛在客戶群體,還能有效提升品牌影響力。通過微軟必應Bing國…

【算法作業】均分卡牌,購買股票

問題描述 John 有兩個孩子,在 John病逝后,留下了一組價值不一定相同的魔卡, 現在要求你設計一種策略,幫John的經管人將John的這些遺產分給他的兩個孩子,使得他們獲得的遺產差異最小(每張魔卡不能分拆&#…

搜索引擎的設計與實現(三)

目錄 5 系統詳細實現 5.1實現環境配置 5.2功能實現 5.2.1 建立索引 5.2.2 文件搜索實現 5.2.3 數據庫的連接配置 5.2.4 數據庫搜索實現 5.2.5 后臺數據編輯實現 前面內容請移步 搜索引擎的設計與實現(二) 免費源代碼&畢業設計論文 搜索…

git-刪除workspace.xml的跟蹤

問題描述 .gitignore 文件內容如下: .pyc *.pyc user_files/ .vscode/ __pycache__//.idea/misc.xml /.idea/modules.xml /.idea/inspectionProfiles/profiles_settings.xml /.idea/inspectionProfiles/Project_Default.xml /.idea/batrp_webbackend-server-dev.i…

NARUTO 復現記錄

1 環境配置 下載項目,一定要 git 下載全項目,下載完后要檢查third_parities 里面的coslam和neural_slam_eval 文件全不全。 git clone --recursive https://github.com/oppo-us-research/NARUTO.git 環境配置 注意 bash scripts/installation/conda…

番外篇 | 利用PyQt5+YOLOv5來搭建目標檢測系統(附可視化界面+功能介紹+源代碼)

前言:Hello大家好,我是小哥談。PyQt5是一個Python綁定的Qt庫,是用于創建圖形用戶界面(GUI)和其他應用程序組件的工具包。PyQt5提供了許多GUI元素,如按鈕、文本框、標簽等,也提供了許多Qt的功能,如網絡、數據庫、XML等。通過PyQt5可以在Python中使用Qt的豐富功能和強大的工…

克服虧損的負面影響 學學現貨白銀止損的方法

一個多月以前,現貨黃金的上漲還十分強勁,一度還逼近歷史的高位30大關。但是我們看近半個月以來,現貨白銀價格出現了調整。很多在高位買入的投資者都承受了較大的虧損,這時候就凸顯出了現貨白銀止損的作用。如果投資者能夠通過近期…

Git 基礎使用(2) 分支管理

文章目錄 分支概念分支使用查看分支分支創建分支切換分支合并合并沖突分支刪除 分支管理快進模式分支策略內容保存錯誤處理 分支概念 (1)分支概念 Git分支是指在版本控制系統Git中,用來表示項目的不同工作流程或開發路徑的一個重要概念。通過…

【cmake】Windows 環境下編譯第三方依賴源碼(以編譯Xerces庫為例)

第三方依賴源碼的編譯分為兩種,一種是使用 Configure 腳本編譯,另一種是使用 CMakeLists.txt 編譯。Xerces 3.2.3 的編譯方式是 CMakeLists.txt 腳本編譯。 必要軟件: CMake (CMake | Download)Visual Studio 2019&a…

前端AJAX講解

目錄 1.AJAX是什么? 2.異步交互和同步交互 3.AJAX常見應用情景和優缺點 4.AJAX的優缺點 5.AJAX發送異步請求(四步操作) 6.經典案例 1.AJAX是什么? AJAX即“Asynchronous JavaScript and XML”(異步的JavaScript與…

指針基礎實踐

文章目錄 1.聲明指針2.初始化指針3.指針地址和大小,值4.指針解引用,修改值5.指針指向堆內存,修改值6.申請堆內存并釋放7.數組釋放8.指針運算9.指針遞增10.指針遞減11.指針常量12.常量指針13.常量指針指向常量 1.聲明指針 2.初始化指針 3.指針地址和大小…

【數據結構】二叉樹(Binary Tree)

文章目錄 一、樹的概念及結構二、二叉樹的概念及結構1.二叉樹的概念2.特殊的二叉樹3.二叉樹的性質 三、二叉樹的存儲順序存儲鏈式存儲 四、二叉樹的實現1.創建二叉樹2.二叉樹的遍歷前序遍歷中序遍歷后序遍歷層序遍歷根據遍歷順序創建二叉樹 3.二叉樹的基本操作1.總結點個數2.二…

ctfshow之_萌新web9至web10

一、訪問在線靶場ctfshow 1、web9 如下圖所示,進入_萌新賽的web9問題,題目提醒flag在config.php中: 如上圖所示,可以get傳參,且傳入的參數需要正則匹配system、exec、highlight,且不區分大小寫&#xff0…