国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

vuex使用中需要注意的點

妤鋒シ / 2023人閱讀

摘要:每一條被記錄,都需要捕捉到前一狀態和后一狀態的快照。在組件中提交你可以在組件中使用提交,或者使用輔助函數將組件中的映射為調用需要在根節點注入。當模塊被注冊后,它的所有及都會自動根據模塊注冊的路徑調整命名。

vuex中幾個核心概念: state, getters, mutations, actions, module getters

可以認為是store的計算屬性;與計算屬性一樣,getter的返回值會根據它的依賴緩存起來,且只有當它的依賴值發生變化才會被重新計算

mapGetters

輔助函數僅僅是將 store 中的 getter 映射到局部計算屬性:

import { mapGetters } from "vuex"

export default {
  // ...
  computed: {
  // 使用對象展開運算符將 getter 混入 computed 對象中
    ...mapGetters([
      "doneTodosCount",
      "anotherGetter",
      // ...
    ])
  }
}
mutations 只能是同步操作

更改vuex的store中的狀態的唯一方法就是提交 mutations
在 mutation 中混合異步調用會導致你的程序很難調試。例如,當你能調用了兩個包含異步回調的 mutation 來改變狀態,你怎么知道什么時候回調和哪個先回調呢?

mutation必須是同步函數

mutations: {
  someMutation (state) {
    api.callAsyncMethod(() => {
      state.count++
    })
  }
}

現在想象,我們正在 debug 一個 app 并且觀察 devtool 中的 mutation 日志。每一條 mutation 被記錄,devtools 都需要捕捉到前一狀態和后一狀態的快照。然而,在上面的例子中 mutation 中的異步函數中的回調讓這不可能完成:因為當 mutation 觸發的時候,回調函數還沒有被調用,devtools 不知道什么時候回調函數實際上被調用——實質上任何在回調函數中進行的狀態的改變都是不可追蹤的。

在組件中提交mutations

你可以在組件中使用 this.$store.commit("xxx") 提交 mutation,或者使用 mapMutations 輔助函數將組件中的 methods 映射為 store.commit 調用(需要在根節點注入 store)。

import { mapMutations } from "vuex"

export default {
  // ...
  methods: {
    ...mapMutations([
      "increment", // 將 `this.increment()` 映射為 `this.$store.commit("increment")`

      // `mapMutations` 也支持載荷:
      "incrementBy" // 將 `this.incrementBy(amount)` 映射為 `this.$store.commit("incrementBy", amount)`
    ]),
    ...mapMutations({
      add: "increment" // 將 `this.add()` 映射為 `this.$store.commit("increment")`
    })
  }
}
actions 可以是異步操作

action提交的是mutation,而不是直接更改狀態

action 可以包含任何異步操作

分發 action 在組件中分發Action

你在組件中使用 this.$store.dispatch("xxx") 分發 action,或者使用 mapActions 輔助函數將組件的 methods 映射為 store.dispatch 調用(需要先在根節點注入 store):

import { mapActions } from "vuex"

export default {
  // ...
  methods: {
    ...mapActions([
      "increment", // 將 `this.increment()` 映射為 `this.$store.dispatch("increment")`

      // `mapActions` 也支持載荷:
      "incrementBy" // 將 `this.incrementBy(amount)` 映射為 `this.$store.dispatch("incrementBy", amount)`
    ]),
    ...mapActions({
      add: "increment" // 將 `this.add()` 映射為 `this.$store.dispatch("increment")`
    })
  }
}
組合 Action

Action 通常是異步的,那么如何知道 action 什么時候結束呢?更重要的是,我們如何才能組合多個 action,以處理更加復雜的異步流程?

首先,你需要明白 store.dispatch 可以處理被觸發的 action 的處理函數返回的 Promise,并且 store.dispatch 仍舊返回 Promise:

// 假設 getData() 和 getOtherData() 返回的是 Promise

actions: {
  async actionA ({ commit }) {
    commit("gotData", await getData())
  },
  async actionB ({ dispatch, commit }) {
    await dispatch("actionA") // 等待 actionA 完成
    commit("gotOtherData", await getOtherData())
  }
}
module

由于使用單一狀態樹,應用的所有狀態會集中到一個比較大的對象;當應用變得非常復雜時,store 對象就有可能變得相當臃腫。

為了解決以上問題,Vuex 允許我們將 store 分割成模塊(module)。每個模塊擁有自己的 state、mutation、action、getter、甚至是嵌套子模塊——從上至下進行同樣方式的分割:

const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: { ... },
  mutations: { ... },
  actions: { ... }
}

const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

store.state.a // -> moduleA 的狀態
store.state.b // -> moduleB 的狀態

如果你希望使用全局 stategetterrootStaterootGetter 會作為第三和第四參數傳入 getter,也會通過 context 對象的屬性傳入 action。

命名空間

默認情況下,模塊內部的 action、mutation 和 getter 是注冊在全局命名空間的——這樣使得多個模塊能夠對同一 mutation 或 action 作出響應。

如果希望你的模塊具有更高的封裝度和復用性,你可以通過添加 namespaced: true 的方式使其成為命名空間模塊。當模塊被注冊后,它的所有 getter、action 及 mutation 都會自動根據模塊注冊的路徑調整命名。例如:

const store = new Vuex.Store({
  modules: {
    account: {
      namespaced: true,

      // 模塊內容(module assets)
      state: { ... }, // 模塊內的狀態已經是嵌套的了,使用 `namespaced` 屬性不會對其產生影響
      getters: {
        isAdmin () { ... } // -> getters["account/isAdmin"]
      },
      actions: {
        login () { ... } // -> dispatch("account/login")
      },
      mutations: {
        login () { ... } // -> commit("account/login")
      },

      // 嵌套模塊
      modules: {
        // 繼承父模塊的命名空間
        myPage: {
          state: { ... },
          getters: {
            profile () { ... } // -> getters["account/profile"]
          }
        },

        // 進一步嵌套命名空間
        posts: {
          namespaced: true,

          state: { ... },
          getters: {
            popular () { ... } // -> getters["account/posts/popular"]
          }
        }
      }
    }
  }
})

如果你希望使用全局 state 和 getter,rootState 和 rootGetter 會作為第三和第四參數傳入 getter,也會通過 context 對象的屬性傳入 action。
若需要在全局命名空間內分發 action 或提交 mutation,將 { root: true } 作為第三參數傳給 dispatch 或 commit 即可。

需要注意的點 默認情況下,模塊內的getter, mutation,action是注冊在全局空間的,state只注冊在局部命名空間的;

要想使模塊內的getter, mutation,action注冊在模塊命名空間,必須在模塊內加上 namespaced: true



使用命名空間在調用action時必須使用

this.$store.dispatch("hero1/getHeroInfo");

computed: {
      doneTodosCount () {
          return this.$store.getters["hero1/doneTodos"][0].item;
      }
  },

參考鏈接

頁面刷新時,store中的數據會清空

解決方案
https://stackoverflow.com/que...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95493.html

相關文章

  • 使用 Vuex + Vue.js 構建單頁應用【新篇】

    摘要:使用構建單頁應用新篇在去年的七月六號的時候,發布了一篇使用構建單頁應用的文章,文章主要是介紹的基本使用方法,發現對大部分的入門同學有很大的幫助,時至今日還有很多同學不斷的點贊與收藏,瀏覽量最高達到。 使用 Vuex + Vue.js 構建單頁應用【新篇】 在去年的七月六號的時候,發布了一篇 使用 Vuex + Vue.js 構建單頁應用 的文章,文章主要是介紹 vuex 的基本使用方法...

    crelaber 評論0 收藏0
  • Vuex源碼學習(二)脈絡梳理

    摘要:各位看官沒看過功能梳理的可以先閱讀下源碼學習一功能梳理前車之鑒有了源碼學習的經驗,每次看認真鉆研源代碼的時候都會抽出一小段時間來大體瀏覽一遍源代碼。大體了解這個源代碼的脈絡,每個階段做了什么,文件目錄的劃分。 各位看官 沒看過功能梳理的可以先閱讀下Vuex源碼學習(一)功能梳理. 前車之鑒 有了vue-router源碼學習的經驗,每次看認真鉆研源代碼的時候都會抽出一小段時間來大體瀏覽一...

    chenjiang3 評論0 收藏0
  • 用Vue搭建一個應用盒子(一):todo-list

    摘要:最近在研究的相關知識,最好的學習方法莫過于自己開發一個,這樣帶著問題來學習,進步自然飛速。在首頁里,我們會用寫一個導航,通過的路由導航到不同的應用。我們在文件夾里創建一個新的組件。 最近在研究vue的相關知識,最好的學習方法莫過于自己開發一個SPA,這樣帶著問題來學習,進步自然飛速。于是邊查邊寫差不多花了2周寫完了一個todo-list,功能不夠完備,但是麻雀雖小,卻也是五臟俱全,基本...

    MAX_zuo 評論0 收藏0
  • vuex狀態初始化間件設計

    摘要:在之前使用的過程中,對于狀態初始化的設計思路,是將其放到一個全局服務中,這樣每次進到不同頁面,只需要調用同一個全局的動作,就能完成初始化。同時,具體的初始化狀態值,則由每個模塊自己控制。的中間件有個特點,首先它提供了與動作的切入口。 總算把最近嘗試的東西實現出來了,寫點文章沉淀一下。 前言 單頁面應用在使用單向數據流的設計方案后,狀態樹的控制就變得至關重要。這里面對的問題在于一個最基礎...

    fireflow 評論0 收藏0

發表評論

0條評論

妤鋒シ

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<