摘要:觸發行為與相當于。是具體改變狀態的行為,每次的可能被捕捉。而是通過發起執行操作。因此異步行為放在。通過與具體的組件進行綁定。但是,它規定了一些需要遵守的規則應用層級的狀態應該集中到單個對象中。提交是更改狀態的唯一方法,并且這個過程是同步的。
VUEX 概念
store / module
state / getters
mutations / actions
payload: commit / dispatch時的參數
context: 一個store的新實例,vuex把react中的新state的immutable處理,在框架中就處理了
commit
dispatch
plugins
strict
輔助函數: 用于vuex的state與component綁定
mapState / mapGetter: compose
mapAction / mapMutations: methods
Redux
Dispatch 執行一個 Actions, 通過 一個叫做 Reducer的映射表,計算出新的 State。 Store根據新的State去更新全局組件。
Vuex
通過輔助函數將store的屬性與方法,綁定到component中。componet監聽用戶行為。commit / dispatch 一個行為給 mutation / action。 action 內部也是通過commit去執行 mutation。mutation相當于一個操作 state的列表。
// example import Vue from "vue"; import Vuex from "vuex"; const store = new Vuex.Store({ ... }) new Vue({ el: "#app", store, ... })
store 與 component
// simpliest store const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment (state) { state.count++ } } }) 1. 在 componet 中通過 this.$store 訪問 store。 2. store 觸發行為 this.$store.commit("mutation name", payload); this.$store.dispatch("dispatch name", payload);
mutation 與 action
1. mutation 相當于 reducer。 mutation直接在內部改變 state。 reducer 返回一個新的state。 2. mutation 只執行同步操作。 異步層面的操作放在 actions。 mutation是具體改變狀態的行為,每次的 mutation 可能被 plugin 捕捉。 3. actions 并不直接對 state進行操作。而是通過發起 mutation 執行操作。因此異步行為放在 actions。 可通過 Promise 或 async/await 去異步執行。 4. mutation/actions 通過 mapMutations/mapActions 與具體的組件進行綁定。 // mutationExap(state, payload) {} // actionExamp(context, payload) {} // example const store = new Vuex.Store({ state: { count: 0, name: "default name" }, mutations: { exampleMutations1(state) { // do something state.count++ }, exampleMutations1(state, name) { } }, actions:{ exampleActions1(context) { context.commit("exampleMutations1"); }, exampleActions1(context) { // "name" is payload context.commit("exampleMutations1", name); } } });基本規則
Vuex 并不限制你的代碼結構。但是,它規定了一些需要遵守的規則:
應用層級的狀態應該集中到單個 store 對象中。
提交 mutation 是更改狀態的唯一方法,并且這個過程是同步的。
異步邏輯都應該封裝到 action 里面。
state [type: Object]const store = new Vuex.Store({ state: { count: 1 } mutations: ... })modules
const moduleA = { state, mutations, actions, // 可無 getters, // 可無 modules // 可無, 可嵌套 } const moduleB = { state, mutations, actions, getters modules } const store = new Vuex.Store({ modules: { a: moduleA, b: moduleB } }) store.state.a; // -> moduleA 的狀態 store.state.a; // -> moduleB 的狀態getter
const store = new Vuex.Store({ state: { ... }, getter: { exampleGetter(state, getters) { return } } }) const module = { state: ... getter: { exampleGetter(state, getters, rootState) } }mutations [type: string]: Function
// like Reducer const store = new Vuex.Store({ ... mutations: { increment (state, playload) { // 變更狀態 state.count++ } } })
Tips
mutation 必須是同步函數
devtools 不知道什么時候回調函數實際上被調用 —— 實質上任何在回調函數中進行的的狀態的改變都是不可追蹤的
actionsAction 函數接受一個與 store 實例具有相同方法和屬性的 context 對象?
支持異步:
promise
async / await
示例代碼:
function (context) { } context = { state, rootState, getters, commit, dispatch}插件 plugins
https://vuex.vuejs.org/zh-cn/...
store = new vuex.Store({ ... plugins: ["pluginA", "pluginB"] // plugins: process.env.NODE_ENV !== "production" ? [myPluginWithSnapshot] : [] })
內置的 Plugins 插件:
logger
模塊動態注冊 / 按需加載動態加載 store.registerModule("myModule", { // ... }) store.state.myModule; // myModule的狀態 store.unregisterModule(myModule); //卸載模塊 // 不能使用此方法( unregisterModule )卸載靜態模塊(在創建 store 時聲明的模塊)
需要 vue 插件
例如,vuex-router-sync 插件可以集成 vue-router 與 vuex,管理動態模塊的路由狀態。
詳見:https://vuex.vuejs.org/zh-cn/...
嚴格模式
const store = new Vuex.Store({ // ... strict: true })
環境
// 嚴格模式會對狀態進行深度檢測,影響性能 // 因此,生產環境 禁用 const store = new Vuex.Store({ // ... strict: process.env.NODE_ENV !== "production" })測試
// TODO
https://vuex.vuejs.org/zh-cn/...
https://vuex.vuejs.org/zh-cn/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85219.html
摘要:如果不熟悉,在這個教程里面,我們會通過構建一個筆記應用來學習怎么用。這個是我們要構建的筆記應用的截圖你可以從下載源碼,這里是的地址。每當用戶點擊筆記列表中的某一條時,組件會調用來分發這個會把當前選中的筆記設為。 原文:Learn Vuex by Building a Notes App,有刪改。 本文假設讀者熟悉 Vuex 文檔 的內容。如果不熟悉,you definitely sho...
摘要:鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇下的使用方法,傳送門使用構建單頁應用新篇華麗的分割線原文地址前言在最近學習的時候,看到國外一篇講述了如何使用和來構建一個簡單筆記的單頁應用的文章。 鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇 vue2.0 下的 vuex 使用方法,傳送門:使用 Vuex + Vue.js 構建單頁應用【新篇】 ---------...
摘要:鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇下的使用方法,傳送門使用構建單頁應用新篇華麗的分割線原文地址前言在最近學習的時候,看到國外一篇講述了如何使用和來構建一個簡單筆記的單頁應用的文章。 鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇 vue2.0 下的 vuex 使用方法,傳送門:使用 Vuex + Vue.js 構建單頁應用【新篇】 ---------...
摘要:鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇下的使用方法,傳送門使用構建單頁應用新篇華麗的分割線原文地址前言在最近學習的時候,看到國外一篇講述了如何使用和來構建一個簡單筆記的單頁應用的文章。 鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇 vue2.0 下的 vuex 使用方法,傳送門:使用 Vuex + Vue.js 構建單頁應用【新篇】 ---------...
摘要:鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇下的使用方法,傳送門使用構建單頁應用新篇華麗的分割線原文地址前言在最近學習的時候,看到國外一篇講述了如何使用和來構建一個簡單筆記的單頁應用的文章。 鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇 vue2.0 下的 vuex 使用方法,傳送門:使用 Vuex + Vue.js 構建單頁應用【新篇】 ---------...
摘要:鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇下的使用方法,傳送門使用構建單頁應用新篇華麗的分割線原文地址前言在最近學習的時候,看到國外一篇講述了如何使用和來構建一個簡單筆記的單頁應用的文章。 鑒于該篇文章閱讀量大,回復的同學也挺多的,特地抽空寫了一篇 vue2.0 下的 vuex 使用方法,傳送門:使用 Vuex + Vue.js 構建單頁應用【新篇】 ---------...
閱讀 3245·2023-04-26 01:31
閱讀 1892·2023-04-25 22:08
閱讀 3430·2021-09-01 11:42
閱讀 2823·2019-08-30 12:58
閱讀 2165·2019-08-29 18:31
閱讀 2429·2019-08-29 17:18
閱讀 3064·2019-08-29 13:01
閱讀 2552·2019-08-28 18:22