Vue-理解 vuex

一、前言

在開發中大型 Vue 應用時,我們常常會遇到多個組件之間共享數據、通信復雜的問題。例如:

  • 多個組件需要訪問同一個用戶信息;
  • 組件之間需要傳遞狀態或事件;
  • 數據變更需要同步更新多個組件;

這時,Vuex 就派上用場了。它是 Vue 官方推薦的狀態管理模式,專為 Vue.js 應用程序開發提供集中式存儲管理。

本文將帶你深入了解:

  • 什么是 Vuex?
  • Vuex 的核心概念(State、Getter、Mutation、Action、Module);
  • 如何在 Vue 項目中安裝和使用 Vuex;
  • 實際開發中的典型使用場景;
  • Vuex 在 Vue 2 和 Vue 3 中的差異;
  • 推薦的最佳實踐;

二、什么是 Vuex?

Vuex 是一個專為 Vue.js 應用程序開發的狀態管理模式 + 庫。它采用集中式存儲管理應用的所有組件的狀態,并以相應的規則保證狀態以一種可預測的方式發生變化。

簡單來說,Vuex 就是一個全局的“倉庫”,所有組件都可以從這個倉庫中讀取或修改數據,從而實現跨組件的狀態共享。

三、為什么需要 Vuex?

? 沒有 Vuex 的問題:

  • 父子組件傳值靠 props / $emit;
  • 兄弟組件之間傳值要通過共同父級;
  • 深層嵌套組件傳值困難;
  • 多個組件依賴相同狀態,難以維護;

? 使用 Vuex 的優勢:

優勢描述
集中式管理所有組件共享一個狀態源
單向數據流更加清晰的數據流向
可維護性高所有狀態變更都在 store 中統一處理
調試友好支持 Vue Devtools,方便查看狀態變化
提升開發效率減少不必要的 props 和 events 傳遞

四、Vuex 的核心概念

Vuex 主要有五個核心模塊:

1.?State:狀態(數據)

用于保存應用程序的狀態,是驅動應用的數據源。

state: {count: 0,user: null
}

2.?Getter:獲取狀態(計算屬性)

類似于 Vue 的 computed 屬性,用于對 state 做一些派生處理。

getters: {doubleCount(state) {return state.count * 2}
}

3.?Mutation:更改狀態的方法(同步操作)

唯一可以修改 state 的方式,必須是同步函數。

mutations: {increment(state) {state.count++},setUser(state, user) {state.user = user}
}

4.?Action:異步操作狀態

用于處理異步邏輯(如請求 API),提交 mutation 來改變狀態。

actions: {async fetchUser({ commit }, userId) {const res = await getUserById(userId)commit('setUser', res.data)}
}

5.?Module:模塊化組織

當項目變得龐大時,可以將 store 分割成模塊,每個模塊擁有自己的 state、getter、mutation、action。

modules: {userModule,cartModule
}

五、如何在 Vue 項目中使用 Vuex

步驟 1:安裝 Vuex

npm install vuex@next --save

注意:如果你使用的是 Vue 2,請使用 vuex@3 版本。

步驟 2:創建 Store 實例

// src/store/index.js
import { createStore } from 'vuex'export default createStore({state: {count: 0},getters: {doubleCount: state => state.count * 2},mutations: {increment(state) {state.count++}},actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment')}, 1000)}},modules: {}
})

步驟 3:掛載到 Vue 實例

// main.js
import { createApp } from 'vue'
import App from './App.vue'
import store from './store'createApp(App).use(store).mount('#app')

步驟 4:在組件中使用 Vuex

<template><div><p>當前計數:{{ count }}</p><p>雙倍計數:{{ doubleCount }}</p><button @click="increment">+1</button><button @click="incrementAsync">異步+1</button></div>
</template><script>
import { mapState, mapGetters, mapActions } from 'vuex'export default {computed: {...mapState(['count']),...mapGetters(['doubleCount'])},methods: {...mapMutations(['increment']),...mapActions(['incrementAsync'])}
}
</script>

📌 說明:

  • 使用?mapStatemapGettersmapMutationsmapActions?可簡化寫法;
  • 也可以直接使用?$store.state.xxx?或?$store.dispatch()?直接調用。

六、Vuex 在 Vue 2 與 Vue 3 中的區別

功能Vue 2(Vuex 3)Vue 3(Vuex 4)
創建 Store 方式new Vuex.Store({})createStore({})
使用方式Vue.use(Vuex)app.use(store)
Composition API 支持需配合?useStore完全支持組合式 API
TypeScript 支持支持更好地支持
推薦程度? 舊項目可用? 新項目推薦使用

七、Vuex 的實際應用場景

場景示例
用戶登錄狀態管理存儲 token、用戶信息
購物車狀態共享多頁面/組件共享購物車數據
多組件間通信不同層級組件共享數據
表單狀態管理保存表單輸入、校驗結果
全局加載狀態顯示 loading 動畫
國際化語言切換存儲當前語言并響應變化

八、Vuex 最佳實踐建議

建議說明
保持 State 只讀不能直接修改 state,只能通過 mutation
Mutation 必須同步異步操作應放在 Action 中
Action 提交 MutationAction 負責執行異步邏輯后提交 mutation
合理拆分 Module避免 store 過于臃腫
使用命名空間模塊化時啟用 namespace 提高可維護性
封裝 map 輔助函數提高代碼簡潔性和可讀性
配合 Vue Devtools查看狀態變化、調試更高效
不濫用 Vuex小型項目可考慮使用 reactive / ref 替代

九、總結對比表

概念是否同步是否可直接修改 state是否推薦使用
State???
Getter???
Mutation??(唯一方式)?
Action?(內部異步)?(通過提交 mutation 修改)?
Module???(大項目必備)

十、結語

感謝您的閱讀!如果你有任何疑問或想要分享的經驗,請在評論區留言交流!

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

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

相關文章

【209】VS2022 C++對排好序的vector使用二分查找算法的例子

本文介紹了如何對已經排序的 vector 進行二分法查找。 首先&#xff0c;我們先看一下存儲數據的類&#xff0c;我們假設所有數據的 id 是唯一的&#xff1a; DataItem.h #pragma once #include<string>namespace zc {class DataItem{public:int m_id;std::string m_na…

ABAP 上傳 excel 報表

&#xff08;1&#xff09;先在屏幕上增加上傳文件的按鈕 "屏幕選擇條件" SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001. PARAMETERS : p_source LIKE rlgrap-filename . SELECTION-SCREEN END OF BLOCK b1. 你會發現&#xff0c;上面的代碼只…

Compose與View系統互操作方案

本文將全面解析 Android 現代 UI 框架 Jetpack Compose 與傳統 View 系統的互操作方案&#xff0c;涵蓋基礎原理、實戰技巧、性能優化和高級應用&#xff0c;助你實現漸進式遷移和混合開發。 一、互操作的必要性與整體架構 1.1 為什么需要互操作性 漸進式遷移&#xff1a;大型…

HNCTF 2025 Just Ping Write-up

part 1 路由部分主邏輯逆向 package mainimport ("net/http" )func main() {// 注冊路由和處理函數// 當訪問 "/api/ping" 路徑時&#xff0c;調用 pingHandler 函數處理請求http.HandleFunc("/api/ping", pingHandler)// 注冊開發測試API路由//…

OpenCV CUDA模塊中用于稠密光流計算的 TV-L1(Dual TV-L1)算法類cv::cuda::OpticalFlowDual_TVL1

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::OpticalFlowDual_TVL1類是基于變分優化方法的稠密光流算法實現&#xff08;Dual TV-L1 光流模型&#xff09;&#xff0c;在 GPU 上加…

ThreadPoolTaskExecutor+CompletableFuture實現多線程異步數據同步和自定義線程池監控和動態調整實現

前言 ThreadPoolTaskExecutor是Spring框架提供的一個線程池實現&#xff0c;它是對Java標準庫中ThreadPoolExecutor的封裝&#xff0c;提供了更便捷的配置和集成方式&#xff0c;特別適合在Spring環境中使用。相關線程池概念見線程&線程池相關 CompletableFuture 是 Java…

一篇文章理解js閉包和作用于原理

一、js閉包的作用原理 JS閉包是指內部函數訪問外部函數變量的機制&#xff0c;常用于數據封裝和模塊化。典型應用包括創建私有變量、解決循環中的異步問題、實現函數柯里化等。案例分析展示了閉包在計數器、防抖函數等場景的使用&#xff0c;同時揭示了可能的內存泄漏風險。正…

GUI絲滑教程-python tinker

在 Tkinter GUI 應用中&#xff0c;線程可以幫助你在后臺執行長時間運行的任務&#xff0c;而不阻塞界面響應。下面是一些技巧&#xff0c;幫助你在使用線程時避免 Tkinter 界面卡頓的問題。 為什么 Tkinter 界面會卡頓&#xff1f; Tkinter 使用 主線程 來處理 UI 更新&…

第一部分-數據通信網絡基礎

目錄 一、什么是網絡通信&#xff1f; 二、網絡通信設備的基本識別 1.雙絞線 2.集線器&#xff08;物理層設備&#xff09; 3.中繼器&#xff08;物理層設備&#xff09; 4.接入交換機 5.匯聚交換機 6.核心交換機 7.路由器 8.無線路由器 9.光貓 一、什么是網絡通信&#xff1f;…

windows電腦解決筆記本搜索不到wifi問題

windows筆記本電腦明明打開了wifi功能&#xff0c;卻搜索不到wifi&#xff0c;此問題可能是網絡適配器被禁用的原因導致&#xff0c;通過以下方法也許能解決&#xff0c;無需重啟電腦 1、右鍵點擊網絡或wifi圖標&#xff0c;打開界面”網絡和internet“ 2、選擇”高級網絡設置…

C# 界面檢測顯示器移除并在可用顯示器上顯示

C# 檢測顯示器被移除&#xff0c;將界面在當前可用的顯示器上顯示&#xff0c;避免程序在任務欄點擊無響應。 using System; using System.Linq; using System.Windows.Forms;public class MonitorWatcher : IDisposable {private readonly Form _targetForm;private Screen …

JAVA實戰開源項目:青年公寓服務平臺 (Vue+SpringBoot) 附源碼

本文項目編號 T 233 &#xff0c;文末自助獲取源碼 \color{red}{T233&#xff0c;文末自助獲取源碼} T233&#xff0c;文末自助獲取源碼 目錄 一、系統介紹二、數據庫設計三、配套教程3.1 啟動教程3.2 講解視頻3.3 二次開發教程 四、功能截圖五、文案資料5.1 選題背景5.2 國內…

阿里云服務狀態監控:實時掌握云服務健康狀況

前言 在云計算時代,企業和開發者越來越依賴云服務提供商的基礎設施和服務。當我們的應用部署在云上,服務的可用性和穩定性就與云服務提供商息息相關。一旦云服務出現故障或維護,可能會對我們的業務造成直接影響。因此,實時了解云服務的運行狀態變得尤為重要。阿里云作為國…

使用VSCode開發FastAPI指南

1概述 FastAPI 是一個現代的高性能 Web 框架&#xff0c;用于使用 Python 構建 API。它旨在讓開發者輕松快速高效地構建 API&#xff0c;同時提供 API 的自動驗證、序列化和文檔記錄等功能&#xff0c;使其成為構建 Web 服務和微服務的熱門選擇。 在這個 FastAPI 教程中&#…

2025年硬件實習/秋招面試準備

前言 暑期即將到來&#xff0c;有很多研一研二以及大三大四的同學準備硬件類&#xff08;硬件研發、嵌入式硬件、layout、電源設計、射頻、硬件測試、工藝、FAE&#xff09;的實習或秋招。鑒于此&#xff0c;總結一下網友們秋招、實習中的硬件高頻考點&#xff0c;并分析他們是…

VSCode - Trae 插件關閉彈出框代碼補全

Trae 插件關閉彈出框代碼補全 彈出框代碼補全與非彈出框代碼補全 如下是彈出框代碼補全 如下是非彈出框代碼補全 關閉 / 啟用彈出框代碼補全 點擊 【管理】&#xff08;小齒輪&#xff09; -> 點擊 【設置】 取消勾選&#xff08;如果需要啟用&#xff0c;則勾選即可&…

Elasticsearch從安裝到實戰、kibana安裝以及自定義IK分詞器/集成整合SpringBoot詳細的教程ES(三)

DSL官方地址&#xff1a; DSL查詢分類 Elasticsearch提供了基于JSON的DSL&#xff08;https://www.elastic.co/docs/explore-analyze/query-filter/languages/querydsl&#xff09;來定義查詢。常見的查詢類型包括&#xff1a; 查詢所有&#xff1a;查詢出所有數據&#xff0…

我們來學mysql -- keepalive主從高可用

keepalive主從高可用 簡明扼要安裝KP場景“高可用”配置主keepalived.conf從keepalived.confmysql_check.sh 高可用驗證KP運行情況通過vip連接mysqlvip連接上創建數據庫關閉主庫所在服務器的KPvip連接上再次創建數據庫 結尾 簡明扼要 搭建mysql的主從八股文如是&#xff1a;主…

Compose筆記(二十六)--DatePicker

這一節主要了解一下Compose中的DatePicker,DatePicker是一個用于選擇日期的組件&#xff0c;它提供了直觀的界面讓用戶可以通過日歷視圖或直接輸入來選擇年、月、日。我們在開發中時常會用到日期選擇器&#xff0c;簡單總結如下: API: DatePickerDialog onDismissRequest&…

【靶場】upload-labs-文件上傳漏洞闖關

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言1.第一關1.保存html頁面2.修改頁面html3.訪問修改后的本地html文件4.上傳php文件5.訪問上傳的php2.第二關1.抓上傳包修改文件類型2.上傳成功3.第三關1.phtml php3會被解析為php原理2.上傳成功4…