最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章讓你徹底搞懂vuex

 更新時間:2026年03月02日 09:01:35   作者:likuolei  
Vuex是一個Vue的狀態(tài)管理工具,狀態(tài)就是數(shù)據(jù),用大白話來說就是Vuex是一個插件,可以幫我們管理Vue通用的數(shù)據(jù),這篇文章主要介紹了徹底搞懂vuex的相關(guān)資料,需要的朋友可以參考下

前言

以下是針對“Vuex詳解”的一篇萬字級全面教程(實際字數(shù)約6000+),基于2025–2026年Vue.js開發(fā)視角。Vuex是Vue.js的經(jīng)典狀態(tài)管理庫,雖然Vue 3+官方推薦Pinia作為替代,但Vuex在大量遺留項目和中大型應(yīng)用中仍廣泛使用(Vuex 4兼容Vue 3)。我會從基礎(chǔ)概念入手,逐步深入到高級用法、源碼簡析、最佳實踐、面試高頻,以及與Pinia的對比。內(nèi)容實用、帶代碼示例、表格對比,適合初學(xué)者到中高級開發(fā)者。

如果你是Vue 2用戶,從“一、二”部分看起;Vue 3用戶,注意“三”中的兼容點;想遷移Pinia,看“八”。如果需要代碼倉庫或特定版本差異,直接回復(fù)我。

一、Vuex是什么?為什么需要它?(核心概念)

1.1 Vuex的定義

Vuex是一個專為Vue.js應(yīng)用設(shè)計的狀態(tài)管理模式 + 庫,它采用集中式存儲管理應(yīng)用的所有組件的狀態(tài)(State),并以相應(yīng)的規(guī)則保證狀態(tài)以可預(yù)測的方式發(fā)生變化。

  • 核心靈感:借鑒Flux和Redux,解決Vue中組件間數(shù)據(jù)共享問題(如props鉆透、事件總線亂用)。
  • 官方定位:中大型單頁應(yīng)用(SPA)的全局狀態(tài)管理器。小項目用Provide/Inject或Composition API就夠。
  • 版本演進(2026年現(xiàn)狀):
    • Vuex 3.x:Vue 2默認
    • Vuex 4.x:Vue 3兼容版(支持Composition API,但非首選)
    • 未來:Vuex不會大更新,Pinia是Vue生態(tài)新寵(更輕、更類型友好)。

1.2 為什么用Vuex?(問題解決)

在Vue中,組件間通信常見痛點:

  • Props + Emit:父子通信OK,但多層嵌套或兄弟組件麻煩。
  • Event Bus:全局事件易亂,難追蹤。
  • LocalStorage:異步、不響應(yīng)式。

Vuex解決:

  • 單向數(shù)據(jù)流:State → View → Actions → Mutations → State(循環(huán))。
  • 集中管理:所有狀態(tài)一處修改,全局可訪問。
  • 響應(yīng)式:基于Vue的Reactivity系統(tǒng),狀態(tài)變就自動更新視圖。
  • 可預(yù)測:Mutations同步修改,Actions處理異步。

不適合場景:小項目(用ref/reactive + provide/inject);純靜態(tài)頁。

1.3 Vuex核心模塊(五大件)

Vuex Store = State + Mutations + Actions + Getters + Modules

模塊作用同步/異步調(diào)用方式
State存儲狀態(tài)數(shù)據(jù)this.$store.state.xxx
Mutations修改State的唯一方式(同步)同步commit(‘mutationName’)
Actions處理異步邏輯,提交Mutations異步dispatch(‘actionName’)
Getters計算屬性(派生狀態(tài))this.$store.getters.xxx
Modules模塊化拆分Store(命名空間)按模塊訪問

數(shù)據(jù)流圖(文本版):

Actions (異步) → Mutations (同步修改State) → State → Getters (計算) → View (渲染)
↑ 用戶交互/事件

二、安裝 & 基本使用(Vue 3視角)

2.1 安裝Vuex(2026推薦)

  • Vue 3:npm install vuex@next(Vuex 4.x)
  • Vue 2:npm install vuex

2.2 創(chuàng)建Store

// store/index.js
import { createStore } from 'vuex';

export default createStore({
  state: {
    count: 0,
    user: { name: 'Grok' }
  },
  mutations: {
    increment(state) {
      state.count++;
    },
    setUser(state, payload) {
      state.user.name = payload;
    }
  },
  actions: {
    asyncIncrement({ commit }) {  // context對象
      return new Promise(resolve => {
        setTimeout(() => {
          commit('increment');
          resolve();
        }, 1000);
      });
    }
  },
  getters: {
    doubleCount: state => state.count * 2,
    fullName: (state, getters) => `${state.user.name} (double: ${getters.doubleCount})`
  }
});

2.3 在Vue中掛載 & 使用

// main.js
import { createApp } from 'vue';
import App from './App.vue';
import store from './store';

createApp(App).use(store).mount('#app');

組件中使用:

<template>
  <div>
    <p>Count: {{ count }}</p>  <!-- 響應(yīng)式 -->
    <p>Double: {{ doubleCount }}</p>
    <button @click="increment">+1</button>
    <button @click="asyncIncrement">Async +1</button>
  </div>
</template>

<script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';

export default {
  computed: {
    ...mapState(['count']),  // 簡寫state.count
    ...mapGetters(['doubleCount'])
  },
  methods: {
    ...mapMutations(['increment']),  // this.increment() → commit
    ...mapActions(['asyncIncrement'])  // this.asyncIncrement() → dispatch
  }
}
</script>

輔助函數(shù)(mapXXX):簡化訪問,推薦在computed/methods中使用。

2.4 嚴格模式(Strict Mode)

  • 開發(fā)環(huán)境開啟:strict: true(Store選項)
  • 強制所有State修改必須通過Mutations,否則報錯(防直接state.xxx = yyy)。

三、Vue 3兼容 & Composition API用法

Vuex 4支持Vue 3的setup:

<script setup>
import { useStore } from 'vuex';
import { computed } from 'vue';

const store = useStore();

const count = computed(() => store.state.count);
const doubleCount = computed(() => store.getters.doubleCount);

const increment = () => store.commit('increment');
const asyncIncrement = () => store.dispatch('asyncIncrement');
</script>

關(guān)鍵:Vue 3中,Vuex的響應(yīng)式基于Vue的Reactivity,但Pinia更原生支持setup(無this)。

四、進階:Modules模塊化(大型項目必備)

大Store拆分成Modules,避免單一文件臃腫。

// store/index.js
import userModule from './modules/user';

export default createStore({
  modules: {
    user: userModule  // 模塊名
  }
});

// modules/user.js
export default {
  namespaced: true,  // 開啟命名空間(推薦,避免沖突)
  state: { name: 'Grok' },
  mutations: { setName(state, payload) { state.name = payload; } },
  actions: { asyncSetName({ commit }, payload) { commit('setName', payload); } },
  getters: { upperName: state => state.name.toUpperCase() }
};

訪問:

  • 無命名空間:store.state.user.name
  • 有命名空間:commit('user/setName', 'NewName')getters['user/upperName']

最佳實踐:每個功能一個模塊(如user、cart、auth),始終開啟namespaced。

五、Actions & Mutations深入(異步 & 參數(shù))

5.1 Mutations:同步純函數(shù)

  • 必須同步:防狀態(tài)不可預(yù)測。
  • 參數(shù):state(第一個),payload(可選負載)。

5.2 Actions:異步容器

  • 可異步:API調(diào)用、Promise。
  • context對象:{ state, getters, commit, dispatch, rootState, rootGetters }
  • 返回Promise:便于.then處理。
    示例:
actions: {
  async fetchUser({ commit }) {
    const res = await fetch('/api/user');
    const data = await res.json();
    commit('setUser', data);
  }
}

5.3 組合Actions

actions: {
  actionA({ dispatch }) { return dispatch('actionB'); },
  actionB() { /* ... */ }
}

六、Getters & 插件(計算 & 擴展)

6.1 Getters:Store的computed

  • 參數(shù):state(第一個),getters(可選),rootState,rootGetters。
  • 緩存:依賴不變不重算。

6.2 插件(Plugins)

  • 擴展Store:日志、持久化。
    示例(簡單日志插件):
const myPlugin = store => {
  store.subscribe((mutation, state) => {
    console.log(`Mutation: ${mutation.type}, Payload: ${mutation.payload}, New State: ${state}`);
  });
};

// 使用
createStore({ plugins: [myPlugin] });

熱門插件(2026仍活躍):

  • vuex-persistedstate:本地存儲State(localStorage)。
  • vuex-orm:數(shù)據(jù)庫式管理(關(guān)系模型)。

七、源碼簡析 & 性能優(yōu)化(高級)

7.1 核心源碼邏輯

  • Store類:new Vue({ data: { $$state: initialState } }) → 借Vue響應(yīng)式。
  • install:Vue.mixin注入$store。
  • commit:執(zhí)行mutations,觸發(fā)響應(yīng)。
  • dispatch:執(zhí)行actions,支持Promise鏈。

7.2 性能優(yōu)化

  • 避免深層嵌套:用Modules扁平化。
  • Getters緩存:多用Getters少計算。
  • 批量commit:異步操作后一次性提交。
  • Immutable:用Object.assign或spread避免直接改state。
  • Devtools:Chrome Vue Devtools監(jiān)控性能。
  • Vue 3:Vuex響應(yīng)式開銷比Pinia高,考慮遷移。

7.3 常見坑

  • 直接改State:嚴格模式報錯,生產(chǎn)崩潰。
  • 異步Mutations:無效,用Actions。
  • 循環(huán)依賴:Getters/Actions別互調(diào)無限循環(huán)。
  • 類型安全:Vuex無內(nèi)置TS,用vuex-module-decorators或Pinia。

八、Vuex vs Pinia對比(2026遷移指南)

方面VuexPinia遷移建議
設(shè)計Mutations/Actions分離統(tǒng)一Actions(同步/異步混用)Pinia更簡
APIthis.$storedefineStore + setup風格Vue3首選
模塊化Modules + namespaced每個Store獨立文件易拆分
類型支持一般(需插件)原生TSTS項目遷
體積較大更輕(無Mutations)小項目遷
Devtools支持更好(時間旅行)
官方推薦Vue2默認,Vue3兼容Vue3官方狀態(tài)管理新項目Pinia

遷移步驟

  1. 安裝Pinia:npm i pinia
  2. 創(chuàng)建Store:defineStore('user', { state: () => ({ name: '' }), actions: { setName() {} } })
  3. useUserStore()替換$store
  4. Mutations → Actions,Getters不變。

九、最佳實踐 & 面試高頻(生產(chǎn)Checklist)

9.1 最佳實踐

  1. 小State只存全局共享數(shù)據(jù),局部用組件state。
  2. 常量化類型:用const INCREMENT = ‘increment’ 防拼寫錯。
  3. 異步全Actions:API、定時器等。
  4. 模塊化從開始:項目一上來就拆Modules。
  5. 測試:用vuex-test-utils測試Mutations/Actions。
  6. 持久化:敏感數(shù)據(jù)用vuex-persistedstate + encryption。
  7. 監(jiān)控:集成Sentry日志異常State。

9.2 面試高頻題(2025–2026)

  1. Vuex數(shù)據(jù)流?(State→View→Actions→Mutations→State)
  2. Mutations為什么必須同步?(可預(yù)測、易調(diào)試)
  3. Actions返回Promise怎么用?(dispatch.then())
  4. mapState/mapGetters怎么工作?(返回computed對象)
  5. Vuex在Vue3的痛點?(this依賴,Pinia無)
  6. 如何實現(xiàn)State持久化?(插件subscribe + localStorage)
  7. Modules命名空間的作用?(防沖突,模塊隔離)

9.3 擴展資源

  • 官方文檔:vuex.vuejs.org(2026仍維護)
  • GitHub示例:vuejs/vuex/tree/4.0/examples
  • 書籍:《Vue.js設(shè)計與實現(xiàn)》狀態(tài)管理章節(jié)
  • 社區(qū):Reddit r/vuejs、StackOverflow

這篇詳解讓你從0到1徹底搞懂Vuex。如果你想深入某個模塊(如Actions異步鏈式、TS支持)、或?qū)Ρ萊edux/Pinia的代碼,直接告訴我!

到此這篇關(guān)于vuex的文章就介紹到這了,更多相關(guān)vuex詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解Vue3組合式API的實現(xiàn)

    深入理解Vue3組合式API的實現(xiàn)

    組合式API為Vue3帶來了更好的邏輯組織和復(fù)用性,支持TypeScript,提供靈活的響應(yīng)式系統(tǒng),它允許開發(fā)者將相關(guān)邏輯組合在一起,通過composable函數(shù)實現(xiàn)邏輯復(fù)用,擺脫了mixin的缺點,同時,組合式API與TypeScript的集成更緊密,能夠提供更準確的類型推斷
    2024-10-10
  • 詳解Nuxt內(nèi)導(dǎo)航欄的兩種實現(xiàn)方式

    詳解Nuxt內(nèi)導(dǎo)航欄的兩種實現(xiàn)方式

    這篇文章主要介紹了詳解Nuxt內(nèi)導(dǎo)航欄的兩種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • vue中組件間多種傳值方式案例詳解

    vue中組件間多種傳值方式案例詳解

    vue中每個組件都是隔離的,包括父組件和子組件,各組件之間需要數(shù)據(jù)通信,就涉及到了組件傳值,本文給大家介紹vue中組件間多種傳值方式案例,感興趣的朋友跟隨小編一起看看吧
    2024-03-03
  • Vue+vite創(chuàng)建項目關(guān)于vite.config.js文件的配置方法

    Vue+vite創(chuàng)建項目關(guān)于vite.config.js文件的配置方法

    Vue項目創(chuàng)建時,我們見過vue-cli 創(chuàng)建項目和webpack 創(chuàng)建項目等方式,這篇文章主要介紹了Vue+vite創(chuàng)建項目關(guān)于vite.config.js文件的配置方法,需要的朋友可以參考下
    2023-06-06
  • ElementPlus組件與圖標按需自動引入的實現(xiàn)方法

    ElementPlus組件與圖標按需自動引入的實現(xiàn)方法

    這篇文章主要介紹了ElementPlus組件與圖標按需自動引入的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Vue表單提交點擊事件只允許點擊一次的實例

    Vue表單提交點擊事件只允許點擊一次的實例

    這篇文章主要介紹了Vue表單提交點擊事件只允許點擊一次的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • element 結(jié)合vue 在表單驗證時有值卻提示錯誤的解決辦法

    element 結(jié)合vue 在表單驗證時有值卻提示錯誤的解決辦法

    這篇文章主要介紹了element 結(jié)合vue 在表單驗證下,有值卻提示錯誤的解決辦法,需要的朋友可以參考下
    2018-01-01
  • vue倉庫的使用方式

    vue倉庫的使用方式

    這篇文章主要介紹了vue倉庫的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Vue3使用時應(yīng)避免的10個錯誤總結(jié)

    Vue3使用時應(yīng)避免的10個錯誤總結(jié)

    Vue?3已經(jīng)穩(wěn)定了相當長一段時間了。許多代碼庫都在生產(chǎn)環(huán)境中使用它,其他人最終都將不得不遷移到Vue?3。我現(xiàn)在有機會使用它并記錄了我的錯誤,下面這些錯誤你可能想要避免
    2023-03-03
  • vue中使用過濾器filters的this為undefined的問題

    vue中使用過濾器filters的this為undefined的問題

    這篇文章主要介紹了vue中使用過濾器filters的this為undefined的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論

大英县| 博爱县| 鲁山县| 平原县| 琼中| 莲花县| 靖远县| 翁源县| 常德市| 徐闻县| 富锦市| 巢湖市| 井研县| 修武县| 宜阳县| 菏泽市| 曲松县| 三穗县| 长垣县| 上思县| 遵化市| 伊春市| 固安县| 鄂托克前旗| 扎鲁特旗| 栾川县| 张家港市| 辽阳县| 蒲城县| 双桥区| 威宁| 五华县| 太谷县| 射洪县| 昌江| 玉山县| 富宁县| 永康市| 富川| 雅江县| 米泉市|