Vuex源碼閱讀(二) store內的getters實現邏輯

来源:https://www.cnblogs.com/polk6/archive/2020/06/15/13079949.html
-Advertisement-
Play Games

Vuex源碼閱讀(二) store內的getters實現邏輯,介紹Vuex對getter進行了哪些處理。 ...


1. 準備工作

1) 創建一個store,state只包含一個count成員:

new Vuex.Store({
	state: {
		count: 0
	},
	mutations: {
		increment(state) {
			state.count++;
		}
	},
	actions: {
		incrementOfActive: ({ commit }) => {
			commit('increment');
		}
	},
	getters: {
		countOfGetter: (state) => {
			return state.count;
		}
	}
});

  

2) 創建一個Vue對象,並設置store

window.DEMO_VM = new Vue({
	el: '#app',
	store
});

 

2. Vuex對getter做了哪些處理

通過閱讀Vuex的源碼,發現對getter做了下麵處理

2.1 進行局部化

說明:當創建Vuex.Store時,如果內部嵌套了多個stroe(Module),將進行局部化,目的是為了Module各自的getters都保持對各自state的訪問。

代碼

function registerGetter(store, type, rawGetter, local) {
	if (store._wrappedGetters[type]) {
		if (__DEV__) {
			console.error(`[vuex] duplicate getter key: ${type}`);
		}
		return;
	}
	store._wrappedGetters[type] = function wrappedGetter(store) {
		return rawGetter(
			local.state, // local state
			local.getters, // local getters
			store.state, // root state
			store.getters // root getters
		);
	};
}

 

2.2 註冊為計算屬性

說明:初始化內部變數_vm,將getter註冊為_vm的計算屬性。

// 獲取getters內的每個getter封裝到_vm
const wrappedGetters = store._wrappedGetters;
const computed = {};
forEachValue(wrappedGetters, (fn, key) => {
    computed[key] = partial(fn, store);
	Object.defineProperty(store.getters, key, {
		get: () => {
			return store._vm[key];
		},
		enumerable: true // for local getters
	});
});

store._vm = new Vue({
	data: {
		$$state: state
	},
	computed
});

 

3. 解析邏輯

3.1 $store.getters.countOfGetter值從哪裡來

說明:雖然我們創建的countOfGetter的內部為"return state.count;",難道我們每次調用countOfGetter都是執行了對應的函數嗎?

從2.2節的源碼上看,Vuex對countOfGetter設置了get特性,每次調用都是從_vm.countOfGetter獲取。

所以當調用 window.DEMO_VM.$store.getters.countOfGetter 時 → 實際上從返回為 window.DEMO_VM.$store._vm.countOfGetter

這裡要註意一點store.getters都被註冊為了_vm的計算屬性。

官方對計算屬性好處介紹:“計算屬性是基於它們的響應式依賴進行緩存的。只在相關響應式依賴發生改變時它們才會重新求值。

總結:這樣子也進一步說明store.getters保留了緩存特性。

 

3.2 修改了state,getters為什麼會變更

說明:跟上面的說的getters註冊為計算屬性一樣,_vm綁定了state與getters對應的關係,當變更state時,對應的getter也會發生改變。

 

4. 問題

4.1 為何不直接在組件外修改state?

既然可以通過"window.DEMO_VM.$store.state.count = 4" 這樣操作來修改state,為什麼還需要mutations、actions?

有下麵幾個原因:

1) 統一規範。如果都像這樣在外部直接修改state,那麼整個Vuex體系就會亂掉,直接當成了全局變數(緩存)來使用了。

2) hooks:mutations、actions內部的調用了都附加了Subscribe的處理。

 

End Web開發之路系列文章 菜單載入中...
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 在MySQL中只有使用了InnoDB資料庫存儲引擎的資料庫或表才支持事務。 事務處理可以用來維護資料庫的完整性,保證成批的SQL語句要麼全部成功,要麼全部失敗。 事務用來管理DDL、DML、DCL操作,比如:insert、update、delete語句,預設是自動提交的。 一般來講,事務是必須 ...
  • 1.連接redis # 匿名訪問 redis-cli -h ip_address -p port # 密碼訪問 redis-cli -h ip_address -p port -a password 2.利用keys模糊查詢,查詢 key 的完整名稱 # 以 aaa 結尾的 key keys *aa ...
  • redis 的散列可以讓用戶將多個鍵值對存儲到一個 redis 鍵裡面。這裡介紹一些常用命令,以及在 Yii 中的使用。 HMGET HMGET:HMGET key-name key [key …]從散列裡面獲取一個或多個鍵的值。 HMSET HMSET:HMSET key-name key nam ...
  • 一.源碼下載: Windows中的Redis源碼下載:https://github.com/microsoftarchive/redis/tree/3.2 根據官網說明可知,用VS2013編譯,但是必須更新到update5, 否則會出現各種編譯錯誤,確實如此,之前用vs2013的其它版本,出現各種錯 ...
  • Kakfa在大數據消息引擎領域,絕對是沒有爭議的國民老公。 這是kafka系列的第一篇文章。預計共出20篇系列文章,全部原創,從0到1,跟你一起死磕kafka。 本文盤點了 Kafka 的各種術語並且進行解讀,術語可能比較枯燥,但真的是精髓中的精髓! 瞭解Kafka之前我們必須先掌握它的相關概念和術 ...
  • redis 的集合是無序的,集合成員是唯一的,不能重覆。用戶可以快速地對集合執行添加元素操作、移除元素操作以及檢查一個元素是否存在於集合中。這裡介紹一些常用的集合處理命令,併在 Yii 中的使用。 SADD SADD:SADD key-name item [item …]將一個或多個元素添加到集合里 ...
  • Dart語言一些語法特點和編程規範. 本文適合: 日常使用Kotlin, 突然想寫個Flutter程式的Android程式員. ...
  • 目錄:andorid jar/庫源碼解析 HotXposed: 作用: 免重啟手機,實現Xposed hook更新。(當然app是要重啟的) 慄子: 入口: // Hook 入口 public void handleLoadPackage(XC_LoadPackage.LoadPackagePara ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...