vuex相關筆記

来源:https://www.cnblogs.com/MissingGZ/archive/2023/02/10/17109977.html
-Advertisement-
Play Games

vuex是什麼? vuex是管理應用程式狀態,實現組件間通信的。 為什麼使用vuex? 在開發大型應用的項目時,會出現多個視圖組件依賴一個同一個狀態,來自不同視圖的行為需要變更同一個狀態。 在遇到以上問題,就要用到vuex,他能把組件的共用狀態抽取出來,當做一個全局單例模式進行管理,不管在何處改變狀 ...


vuex是什麼?

vuex是管理應用程式狀態,實現組件間通信的。

為什麼使用vuex?

在開發大型應用的項目時,會出現多個視圖組件依賴一個同一個狀態,來自不同視圖的行為需要變更同一個狀態。

在遇到以上問題,就要用到vuex,他能把組件的共用狀態抽取出來,當做一個全局單例模式進行管理,不管在何處改變狀態,都會通知使用該狀態的組件作出相應的修改。

最簡單的vuex實例

 1 import Vue from 'vue';
 2 import Vuex form 'vuex';
 3 
 4 Vue.use(Vuex);
 5 
 6 const store = new Vuex.Store({
 7     state: {
 8         count: 0
 9     },
10     mutations: {
11         increment (state) {
12             state.count++
13         }
14     }
15 })

以上就是一個簡單的vuex實例,每一個vuex應用就是一個store,在store中包含組件中的共用狀態state和改變狀態的方法mutations

需要註意的是只能通過mutations改變storestate的狀態,不能通過store.state.count = 5;直接更改,state相當於對外的只讀屬性。

使用store.commit方法觸發mutations改變state:

 1 store.commit('increment'); 2 3 console.log(store.state.count) //  

在Vue組件中使用vuex

如果希望Vuex狀態更新,相應的Vue組件也得到更新,最簡單的方法就是在Vue的computed(計算屬性)獲取state

// Counter 組件
const Counter = {
    template: `<div>{{ count }}</div>`,
    computed: {
        count () {
            return store.state.count;
        }
    }
}

上面的例子是直接操作全局狀態store.state.count,那麼每個使用該Vuex的組件都要引入。為瞭解決這個,Vuex通過store選項,提供了一種機制將狀態從根組件註入到每一個子組件中。

 1 // 根組件
 2 import Vue from 'vue';
 3 import Vuex form 'vuex';
 4 
 5 Vue.use(Vuex);
 6 const app = new Vue({
 7     el: '#app',
 8     store,
 9     components: {
10         Counter
11     },
12     template: `
13         <div class="app">
14             <counter></counter>
15         </div>
16     `
17 })

通過這種註入機制,就能在子組件Counter通過this.$store訪問:

1 // Counter 組件
2 const Counter = {
3     template: `<div>{{ count }}</div>`,
4     computed: {
5         count () {
6             return this.$store.state.count
7         }
8     }
9 }

mapState函數

1 computed: {
2     count () {
3         return this.$store.state.count
4     }
5 }

這樣通過count計算屬性獲取同名state.count屬性,是不是顯得太重覆了,我們可以使用mapState函數簡化這個過程。

1 import { mapState } from 'vuex';
2 
3 export default {
4     computed: mapState ({
5         count: state => state.count,
6         countAlias: 'count',    // 別名 `count` 等價於 state => state.count
7     })
8 }

簡便方法為:

computed: mapState([

  // 映射 this.count 為 store.state.count

  'count'
])

Getters對象:

如果我們需要對state對象進行做處理計算,如下:

1 computed: {
2 
3     doneTodosCount () {
4 
5         return this.$store.state.todos.filter(todo => todo.done).length
6     
7     }
8 
9 }

如果多個組件都要進行這樣的處理,那麼就要在多個組件中複製該函數。這樣是很沒有效率的事情,當這個處理過程更改了,還有在多個組件中進行同樣的更改,這就更加不易於維護。

Vuex中getters對象,可以方便我們在store中做集中的處理。Getters接受state作為第一個參數:

 1 const store = new Vuex.Store({
 2   state: {
 3     todos: [
 4       { id: 1, text: '...', done: true },
 5       { id: 2, text: '...', done: false }
 6     ]
 7   },
 8   getters: {
 9     doneTodos: state => {
10       return state.todos.filter(todo => todo.done)
11     }
12   }
13 })

在Vue中通過store.getters對象調用。

1 computed: {
2   doneTodos () {
3     return this.$store.getters.doneTodos
4   }
5 }

Getter也可以接受其他getters作為第二個參數:

1 getters: {
2   doneTodos: state => {
3       return state.todos.filter(todo => todo.done)
4   },
5   doneTodosCount: (state, getters) => {
6     return getters.doneTodos.length
7   }
8 }

mapGetters輔助函數

mapState類似,都能達到簡化代碼的效果。mapGetters輔助函數僅僅是將store中的getters映射到局部計算屬性:

 1 import { mapGetters } from 'vuex'
 2 
 3 export default {
 4   // ...
 5   computed: {
 6     // 使用對象展開運算符將 getters 混入 computed 對象中
 7     ...mapGetters([
 8       'doneTodosCount',
 9       'anotherGetter',
10       // ...
11     ])
12   }
13 }

上面也可寫成:

1 computed: mapGetters([
2       'doneTodosCount',
3       'anotherGetter',
4       // ...
5     ])

所以在Vue的computed計算屬性中會存在兩種輔助函數:

1 import { mapState, mapGetters } form 'vuex';
2 
3 export default {
4     // ...
5     computed: {
6         mapState({ ... }),
7         mapGetter({ ... })
8     }
9 }

Mutations

之前也說過了,更改Vuex的store中的狀態的唯一方法就是mutations

每一個mutation都有一個事件類型type和一個回調函數handler

 1 const store = new Vuex.Store({
 2   state: {
 3     count: 1
 4   },
 5   mutations: {
 6     increment (state) {
 7       // 變更狀態
 8       state.count++
 9     }
10   }
11 })

調用mutation,需要通過store.commit方法調用:

store.commit('increment')

Payload 提交載荷

也可以向store.commit傳入第二參數,也就是mutation的payload:

1 mutaion: {
2     increment (state, n) {
3         state.count += n;
4     }
5 }
6 
7 store.commit('increment', 10);

單單傳入一個n,可能並不能滿足我們的業務需要,這時候我們可以選擇傳入一個payload對象:

 1 mutation: {
 2     increment (state, payload) {
 3         state.totalPrice += payload.price + payload.count;
 4     }
 5 }
 6 
 7 store.commit({
 8     type: 'increment',
 9     price: 10,
10     count: 8
11 })

mapMutations函數

mutations也有映射函數mapMutations,幫助我們簡化代碼,使用mapMutations輔助函數將組件中的methods映射為store.commit調用。

 1 import { mapMutations } from 'vuex'
 2 
 3 export default {
 4   // ...
 5   methods: {
 6     ...mapMutations([
 7       'increment' // 映射 this.increment() 為 this.$store.commit('increment')
 8     ]),
 9     ...mapMutations({
10       add: 'increment' // 映射 this.add() 為 this.$store.commit('increment')
11     })
12   }
13 }

Mutations必須是同步函數。

如果需要非同步操作,Mutations就不能滿足我們需求了,這時候我們就需要Actions了。

作者:小郭

版權:本作品採用「署名-非商業性使用-相同方式共用 4.0 國際」許可協議進行許可。

本博文版權歸本博主所有,未經授權不得轉載


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用docker swarm搭建docker輕量集群服務 當前流行的k8s集群搭建無疑是很好的docker集群管理服務,但是對於像我這種僅自己學習的玩家有些過於重量,所以今天使用docker自帶的docker swarm搭建一個docker集權環境,本次實驗環境為一個管理節點和4個工作節點。 1、安 ...
  • 摘要:本文主要講解DWS函數出參帶出方式。 本文分享自華為雲社區《GaussDB(DWS)功能 -- 函數出參 #【玩轉PB級數倉GaussDB(DWS)】》,作者:譡里個檔 。 DWS的PL/pgSQL函數/存儲過程中有一個特殊的語法PERFORM語法,用於執行語句但是丟棄執行結果的場景,常用於一 ...
  • 視圖的增刪改查 視圖相當於一張只能讀的表,不可以修改。當組成視圖的表發生數據變化的時候,視圖會相對應的進行改變。 存儲過程的練習 創建存儲過程: create [if not exists] procedure 名字 ([in | out | inout] 參數名稱 參數類型) begin # sq ...
  • 2023-02-10 一、集群的定義 1、redis集群實現了對redis的水平擴容,即啟動N個redis節點,將整個資料庫分佈存儲在N個節點中,每個節點存儲總數據的1/N。 2、redis集群通過分區來提供一定程度的可用性:即使集群中有一部分節點失效或者無法進行通訊,集群也可以繼續處理命令請求 二 ...
  • 數據治理是推動大型集團企業轉型升級、提升競爭優勢、實現高質量發展的重要引擎。通過全鏈數據結構化,實現業務對象、業務規則、業務流程數字化,推進全鏈業務深度數字化,夯實數據運營底座。 某大型實業集團創立於1980年,主要業務涵蓋供應鏈運營、城市建設與運營、旅游會展、 醫療健康、新興產業投資等多個領域。位 ...
  • 2023-02-10 一、redis提供了2個不同形式的持久化方式 1、RDB(Redis DataBase) 2、AOF(Append Of File) 二、RDB的定義 RDB是在指定的時間間隔內將記憶體中的數據集快照寫入磁碟,即Snapshot快照,它恢復時是將快照文件直接讀到記憶體里。 三、備份 ...
  • 大家都知道 MySQL 的數據都是保存在磁碟的,那具體是保存在哪個文件呢?MySQL 存儲的行為是由存儲引擎實現的,MySQL 支持多種存儲引擎,不同的存儲引擎保存的文件自然也不同。InnoDB 是我們常用的存儲引擎,也是 MySQL 預設的存儲引擎。本文主要以 InnoDB 存儲引擎展開討論。 ...
  • NineData 是多雲數據管理平臺(https://www.ninedata.cloud/),致力於讓每個人用好數據和雲。作為資料庫領域的技術創新團隊,面對這麼火ChatGPT,我們 NineData 的工程師也針對ChatGPT,做了一些關於資料庫領域的相關測試,測試結果,真的是智商狂飆。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...