vue2 - Day05 - VueX

Vuex 是 Vue.js 官方的狀態管理庫。它是一個讓你能在應用中集中管理共享狀態的工具。當應用的規模逐漸增大,組件之間的數據傳遞變得越來越復雜時,Vuex 就成為了救星,提供了一個集中式的存儲來管理所有的組件狀態,并且保證狀態以一種可預測的方式發生變化。

文章目錄

    • 目的
    • Vuex 怎么做的?
      • (1). State
        • <1> 為什么有 `data` 和 `state`?
            • `data` 關心的是單個組件的內部狀態;
        • <2> 使用數據信息
      • (2)Getters
      • (3)Mutations
        • Vuex 嚴格模式
      • (4) Actions
      • (5)Modules
    • Vuex 的“心臟” —— 單向數據流
        • 為什么 Vuex 很“牛”?
    • 總結:Vuex 讓你理清數據的“廚房”!

目的

Vuex 的目標是讓你的 Vue 應用在狀態管理上不至于像一鍋亂燉,避免在多個組件間傳遞數據時亂七八糟。你可以想象,在 Vuex 中,所有狀態都被“規范化”了,組件們可以優雅地共享這些數據,而不需要通過層層的父子傳遞 props 和事件。這也解決了“數據共享時,父組件、子組件、孫組件之間的數據流動混亂”的老大難問題。

  1. 集中式管理:把所有共享的狀態存放在一個地方,統一管理,避免數據凌亂。
  2. 嚴格的單向數據流:讓數據更新的過程清晰可控,不會出現“你修改我,我改你”的尷尬局面。
  3. 跨組件通信:組件之間不再需要通過復雜的 prop 和 event 來傳遞數據,只需要從 store 獲取就好。

Vuex 怎么做的?

Vuex 采用了幾個核心概念來實現這一切:State、Getters、Mutations、Actions 和 Modules

(1). State

  • state 是存儲數據的地方,它是 Vuex 的數據源。在應用中,組件需要共享的狀態應該放在 state 中。你可以將它看作 Vuex 提供的“全球變量”,它能夠幫助你在組件間共享數據。

  • 當然,如果你把所有東西都放進 state,那可能會導致一堆“雜貨”,所以一定要有一定的規劃,避免所有數據都成堆的亂象。 (′ω`)

const store = new Vuex.Store({state: {count: 0}
})
<1> 為什么有 datastate
  • data 是用來管理組件自身的狀態,關注的是單一組件內的數據變化;

    image-20250120173621152

  • state 是 Vuex 用來管理全局狀態的地方,目的是讓多個組件能夠共享和操作相同的數據。

    image-20250120173634397

換句話說:

  • data 關心的是單個組件的內部狀態;
  • state 關心的是整個應用的全局狀態,特別是跨組件、跨頁面的數據共享和更新。

特性datastate
作用范圍僅限于當前組件的局部狀態全局狀態,多個組件共享
存儲位置Vue 組件內部Vuex store(狀態管理倉庫)
訪問方式this.countthis.$store.state.count
響應性自動響應式更新視圖自動響應式更新視圖
用途處理單個組件的狀態,通常是 UI 數據處理跨組件共享的狀態

舉個例子,如果你有一個購物車應用,在每個商品詳情頁面,商品的數量和價格會保存在該組件的 data 中;而購物車總數、用戶登錄狀態、支付信息等會保存在 Vuex 的 state 中,讓不同組件都能訪問和修改。

所以,datastate 是兩個不同范圍的狀態管理工具,一個是組件級的局部狀態管理,一個是全局級的狀態管理。

<2> 使用數據信息
  • 任何組件都可以通過 this.$store.state 來訪問 Vuex 中的 state

    // Vuex store
    const store = new Vuex.Store({state: {count: 0},mutations: {increment(state) {state.count++;}}
    });// 組件中訪問 state
    export default {computed: {// 直接通過 this.$store.state 訪問 state 中的數據count() {return this.$store.state.count;}},methods: {increment() {// 通過 mutation 更新 statethis.$store.commit('increment');}}
    }
  • 通過輔助函數mapState訪問 state 數據

    import { mapState } from 'vuex';export default {computed: {// 使用 mapState 輔助函數...mapState({count: state => state.count // 將 state.count 映射到組件的 computed 屬性中})},methods: {increment() {this.$store.commit('increment');}}
    }
    

(2)Getters

  • getters 是從 state 中派生出一些狀態的“函數”,類似于 Vue 的計算屬性,它們不會直接改變 state,而是返回一些加工過的計算結果。
  • 例如,如果 state 中有一個列表,我們可以在 getters 中處理這些數據,像是過濾出有效的元素或者計算某個值。
const store = new Vuex.Store({state: {count: 0},getters: {doubleCount: state => state.count * 2}
})

Getters 可不只是“取拿冰箱里的食材”,還會根據你的需求“做點小加工”,像做飯前的切菜一樣(如果你能忍受長時間等待的切菜過程…)。

(3)Mutations

Mutations 就是唯一合法的修改state的唯一途徑!它們是同步的,你不能在這里做異步操作(想抄捷徑?做夢去吧)。每次要改變 state 的內容,你都必須通過 mutation 來“正式授權”進行修改。

const store = new Vuex.Store({state: {count: 0},mutations: {increment(state) {state.count++}}
})

Mutations 就像一個“廚房的管理員”,它是唯一能決定“今天菜單”是什么的,不通過它你就不能隨便動手。想做什么就要跟它打招呼!

  • 例如,你可能會寫一個 mutation 來修改用戶的登錄狀態:

    mutations: {login(state) {state.loggedIn = true;}
    }
    
Vuex 嚴格模式

要啟用 Vuex 的嚴格模式,只需要在創建 Vuex.Store 實例時,將 strict 屬性設置為 true 即可。

const store = new Vuex.Store({strict: true,  // 啟用嚴格模式
});
  • 允許通過 mutations 修改 state:如果你按照 Vuex 的規范通過 commit 調用 mutations 來修改 state,Vuex 嚴格模式不會報錯。
  • 不允許直接修改 state:如果你在 Vue 組件或其他地方直接修改 state,嚴格模式會報錯,并且提供警告。比如:
this.$store.state.count++;  // 這是不被允許的,嚴格模式下會觸發警告

Vuex 在開發環境下會檢測到這種不合規的操作,并提示錯誤信息。

image-20250120182354292

(4) Actions

  • actions 類似于 mutations,但它們可以包含異步操作。actions 用來派發 mutation,通常你會在 actions 中執行一些異步操作(比如向后端發送請求),然后通過 commit 來觸發 mutation。

    actions: {async fetchData({ commit }) {const data = await axios.get('/api/data');commit('setData', data);}
    }
    
  • 它們可以像一個小助手一樣,幫你完成一些復雜的異步任務(比如 API 請求),最后將結果交給 mutation 來更新狀態。

const store = new Vuex.Store({state: {count: 0},actions: {incrementAsync({ commit }) {setTimeout(() => {commit('increment')}, 1000)}}
})

它們可以像一個小助手一樣,幫你完成一些復雜的異步任務(比如 API 請求),最后將結果交給 mutation 來更新狀態。

(5)Modules

  • Vuex 還支持將 store 分成多個模塊,每個模塊都有自己的 state、mutations、actions 和 getters。這對于大型應用來說非常有用,它能幫助你將不同的業務邏輯進行分離。
  • 例如,如果你有一個用戶模塊和一個商品模塊,你可以將它們分別定義在不同的模塊中,避免了一個大的 store 變得過于復雜。
  • 看起來很像分區管理,有了這個功能,你就可以把代碼管理得像一個井然有序的圖書館,而不是一團亂麻(?_?)。
const store = new Vuex.Store({modules: {moduleA: {state: { count: 0 },mutations: {increment(state) {state.count++}}}}
})

Modules 就是讓你可以分攤廚房的責任,讓多個廚師各司其職,避免一鍋煮成了亂燉(不同模塊管理自己的狀態,既不沖突又井然有序)。

Vuex 的“心臟” —— 單向數據流

Vuex 強調了單向數據流(state -> getter -> component -> actions -> mutation -> state),你可以把它看作是一個規范化的流水線,每一步都非常清晰:

  1. state 提供數據;
  2. getter 提供處理過的數據;
  3. component 用來展示數據;
  4. actions 負責異步操作;
  5. mutation 最終改變數據。

整個流程都遵循著嚴格的規則,數據像流水一樣流動。想要逆流而上?想都別想(除非是調皮的 mutation…)。

為什么 Vuex 很“牛”?

Vuex 是一個非常嚴謹的庫,它的設計理念非常高大上(可能是你不想用它時最喜歡說的句子)。它讓你避免了在組件間“亂搞”數據的尷尬局面,確保了每個數據變動都有清晰的路徑和軌跡。

Vuex 的優點包括:

  • 集中管理狀態:所有的狀態都集中在 store,方便管理。
  • 嚴格的數據流控制:單向數據流讓數據變化有跡可循。
  • 便捷的調試工具:Vuex 提供的時間旅行調試功能讓你隨時了解數據如何變化。
  • 模塊化管理:即使是龐大的應用,也能清晰拆分和管理。

但如果你是小型應用,Vuex 的使用就有點像“用大炮打蚊子”。你可能會覺得:這怎么像是拿高科技武器去捉小貓咪呢?(不過一旦應用擴展,你會發現 Vuex 的威力)。

總結:Vuex 讓你理清數據的“廚房”!

Vuex 是一個強大的工具,它讓 Vue 應用的狀態管理變得更加清晰和可預測。在大型應用中,Vuex 能夠有效地集中管理狀態,避免了直接操作 DOM 元素的凌亂(畢竟,Vuex 和 DOM 元素并沒有什么關系哦~(。??︿??。))。

當然,如果你是開發一個小型應用,Vuex 可能就有點“重”。不過沒關系,就像你不需要開動整個火車來送一包米那樣,小應用用別的狀態管理方法就夠了。所以,Vuex 不適合“短跑”,但適合長期合作!(如果你不怕它有時“拗口”…)

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

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

相關文章

中型項目中 HTTP 的挑戰與解決方案

一、引言 在當今數字化時代&#xff0c;HTTP&#xff08;超文本傳輸協議&#xff09;作為Web應用程序的基礎通信協議&#xff0c;在中型項目的開發中扮演著至關重要的角色。它為客戶端和服務器之間的數據傳輸提供了標準規范&#xff0c;使得各種類型的應用&#xff0c;從簡單的…

IDEA導入Maven工程不識別pom.xml

0 現象 把阿里 sentinel 項目下載本地后&#xff0c;IDEA 中卻沒顯示 maven 工具欄。 1 右鍵Maven Projects 點擊IDEA右側邊欄的Maven Projects&#xff0c;再點擊&#xff1a; 在出現的選擇框中選擇指定的未被識別的pom.xml即可&#xff1a; 2 Add as maven project 右鍵p…

VUE學習筆記(入門)5__vue指令v-html

v-html是用來解析字符串標簽 示例 <!doctype html> <html lang"en"> <head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document<…

OSPF的LSA的學習研究

OSPF常見1、2、3、4、5、7類LSA的研究 1、拓撲如圖&#xff0c;按照地址表配置&#xff0c;激活OSPF劃分相關區域并宣告相關網段 2、1類LSA&#xff0c;每臺運行了OSPF的路由器都會產生&#xff0c;描述了路由器的直連接口狀況和cost 可以看到R1產生了一條router lsa&#xff0…

小結:OSPF協議的工作原理

OSPF&#xff08;開放最短路徑優先&#xff09;優點&#xff1a; 快速收斂&#xff1a;OSPF的收斂速度較快&#xff0c;能迅速響應網絡拓撲變化&#xff0c;并在發生故障后快速更新路由信息。 支持大規模網絡&#xff1a;OSPF適合大型網絡&#xff0c;可以通過劃分區域來減少網…

TypeScript - 利用GPT輔助學習

TypeScript 一、基礎1. 安裝 TypeScript2. 創建你的第一個 TypeScript 文件3. 編譯 TypeScript 代碼4. 變量聲明與類型注解5. 函數與類型注解6. 總結 二、進階常用類型1. 類型別名2. 對象類型3. 類型斷言4.typeof 操作符 高級類型1. 類2. 交叉類型3. 泛型與 keyof4. 索引簽名類…

Java - WebSocket

一、WebSocket 1.1、WebSocket概念 WebSocket是一種協議&#xff0c;用于在Web應用程序和服務器之間建立實時、雙向的通信連接。它通過一個單一的TCP連接提供了持久化連接&#xff0c;這使得Web應用程序可以更加實時地傳遞數據。WebSocket協議最初由W3C開發&#xff0c;并于2…

stm32 no connect target

解決 STM32 報錯 “no target connected” 的方法 前言 stm32最小系統在下載程序是一直報錯&#xff1a;no target connected&#xff0c;試了很多辦法成功不了&#xff0c;最后將芯片擦除了才成功。 一、問題描述 當時是寫flash的時候寫到ST Link 存儲的地方了。 之后就不…

element的el-form-item的prop作用

這個在elemenui中介紹比較簡單&#xff0c;一般寫的時候照著例子寫&#xff0c;會正常運行。沒太注意porp到底有啥影響點。這次有點時間整理一下。 這個https://worktile.com/kb/p/3534641鏈接講述的要比一般csdn上的文章清晰。 總結&#xff1a; Vue表單驗證中的prop屬性用于指…

Open3D計算點云粗糙度(方法一)【2025最新版】

目錄 一、Roughness二、代碼實現三、結果展示博客長期更新,本文最近更新時間為:2025年1月18日。 一、Roughness 通過菜單欄的Tools > Other > Roughness找到該功能。 這個工具可以估計點云的“粗糙度”。 選擇一個或幾個點云,然后啟動這個工具。 CloudCompare只會詢問…

窺探QCC518x/308x系列與手機之間的藍牙HCI記錄與分析 - 手機篇

今天要介紹給大家的是, 當我們在開發高通耳機時如果遇到與手機之間相容性問題, 通常會用Frontline或Ellisys的Bluetooth Analyzer來截取資料分析, 如果手邊沒有這樣的儀器, 要如何窺探Bluetooth的HCI log.這次介紹的是手機篇. 這次跟QCC518x/QCC308x測試的手機是Samsung S23 U…

【論文投稿】Python 網絡爬蟲:探秘網頁數據抓取的奇妙世界

目錄 前言 一、Python—— 網絡爬蟲的絕佳拍檔 二、網絡爬蟲基礎&#xff1a;揭開神秘面紗 &#xff08;一&#xff09;工作原理&#xff1a;步步為營的數據狩獵 &#xff08;二&#xff09;分類&#xff1a;各顯神通的爬蟲家族 三、Python 網絡爬蟲核心庫深度剖析 &…

前端炫酷動畫--圖片(一)

目錄 一、四角線框的跟隨移動 二、元素倒影(-webkit-box-reflect) 三、模特換裝(maskblend) 四、元素平滑上升 五、無限視差滾動 六、判斷鼠標進入方向(輪播方向) 七、環形旋轉效果 八、黑白小球交替旋轉 九、hover時圓形放大 十、畫一棵隨機樹(canvas) 十一、代碼雨…

STL--list(雙向鏈表)

目錄 一、list 對象創建 1、默認構造函數 2、初始化列表 3、迭代器 4、全0初始化 5、全值初始化 6、拷貝構造函數 二、list 賦值操作 1、賦值 2、assign&#xff08;迭代器1&#xff0c;迭代器2&#xff09; 3、assign&#xff08;初始化列表&#xff09; 4、assig…

【語言處理和機器學習】概述篇(基礎小白入門篇)

前言 自學筆記&#xff0c;分享給語言學/語言教育學方向的&#xff0c;但對語言數據處理感興趣但是尚未入門&#xff0c;卻需要在論文中用到的小伙伴&#xff0c;歡迎大佬們補充或繞道。ps&#xff1a;本文不涉及公式講解&#xff08;文科生小白友好體質&#xff09;&#xff…

小程序獲取微信運動步數

1、用戶點擊按鈕&#xff0c;在小程序中觸發getuserinfo方法&#xff0c;獲取用戶信息 <scroll-view class"scrollarea" scroll-y type"list"><view class"container"><button bind:tap"getLogin">獲取</button&…

leetcode——找到字符串中所有字母異位詞(java)

給定兩個字符串 s 和 p&#xff0c;找到 s 中所有 p 的 異位詞 的子串&#xff0c;返回這些子串的起始索引。不考慮答案輸出的順序。 示例 1: 輸入: s "cbaebabacd", p "abc" 輸出: [0,6] 解釋: 起始索引等于 0 的子串是 "cba", 它是 "…

LDN的藍牙雙模鍵盤幫助文檔

文檔索引 已支持的PCB列表(僅列出少部分)&#xff1a;鍵盤特性硬件軟件鍵盤以及驅動藍牙模式USB模式 驅動功能介紹主界面鍵盤列表頁面鍵盤配置&#xff08;使用雙模鍵盤的請務必細看本說明&#xff09;功能層配置(改鍵)觸發層配置(改FN鍵等觸發功能)功能選擇&#xff08;重要&a…

STM32 FreeRTOS 信號量

信號量的簡介 reeRTOS中的信號量是一種用于任務間同步和資源管理的機制。信號量可以是二進制的&#xff08;只能取0或1&#xff09;也可以是計數型的&#xff08;可以是任意正整數&#xff09;。信號量的基本操作包括“獲取”和“釋放”。 比如動車上的衛生間&#xff0c;一個…

Android SystemUI——系統快捷設置面板(十三)

通過前面的內容我們了解了 SystemUI 的啟動流程以及相關組件的加載流程,同時也詳細介紹了導航欄的創建和加載流程,對于 SystemUI 的組件來說,除了導航欄之外,下拉快捷設置面板也是比較重要的一個組件。 一、快捷設置面板 快捷設置面板(Quick Settings, QS)是 Android 系…