国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vuex進階知識點鞏固

2019-11-19 13:48:52
字體:
供稿:網(wǎng)友

一、 Getter

我們先回憶一下上一篇的代碼

computed:{  getName(){   return this.$store.state.name  }}

這里假設(shè)現(xiàn)在邏輯有變,我們最終期望得到的數(shù)據(jù)(getName),是基于 this.$store.state.name 上經(jīng)過復(fù)雜計算得來的,剛好這個getName要在好多個地方使用,那么我們就得復(fù)制好幾份.

vuex 給我們提供了 getter,請看代碼 (文件位置 /src/store/index.js)

import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({ // 類似 vue 的 data state: {  name: 'oldName' }, // 類似 vue 的 computed -----------------以下5行為新增 getters:{  getReverseName: state => {    return state.name.split('').reverse().join('')  } }, // 類似 vue 里的 mothods(同步方法) mutations: {  updateName (state) {   state.name = 'newName'  } }})

然后我們可以這樣用 文件位置 /src/main.js

computed:{  getName(){   return this.$store.getters.getReverseName  }}

事實上, getter 不止單單起到封裝的作用,它還跟vue的computed屬性一樣,會緩存結(jié)果數(shù)據(jù), 只有當依賴改變的時候,才要重新計算.

二、 actions和$dispatch

細心的你,一定發(fā)現(xiàn)我之前代碼里 mutations 頭上的注釋了 類似 vue 里的 mothods(同步方法)

為什么要在 methods 后面?zhèn)渥⑹峭椒椒?#63; mutation只能是同步的函數(shù),只能是同步的函數(shù),只能是同步的函數(shù)!! 請看vuex的解釋:

現(xiàn)在想象,我們正在 debug 一個 app 并且觀察 devtool 中的 mutation 日志。每一條 mutation 被記錄, devtools 都需要捕捉到前一狀態(tài)和后一狀態(tài)的快照。然而,在上面的例子中 mutation 中的異步函數(shù)中的回調(diào)讓這不 可能完成:因為當 mutation 觸發(fā)的時候,回調(diào)函數(shù)還沒有被調(diào)用,devtools 不知道什么時候回調(diào)函數(shù)實際上被調(diào) 用――實質(zhì)上任何在回調(diào)函數(shù)中進行的狀態(tài)的改變都是不可追蹤的。
那么如果我們想觸發(fā)一個異步的操作呢? 答案是: action + $dispatch, 我們繼續(xù)修改store/index.js下面的代碼

文件位置 /src/store/index.js

import Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)export default new Vuex.Store({ // 類似 vue 的 data state: {  name: 'oldName' }, // 類似 vue 的 computed getters:{  getReverseName: state => {    return state.name.split('').reverse().join('')  } }, // 類似 vue 里的 mothods(同步方法) mutations: {  updateName (state) {   state.name = 'newName'  } }, // 類似 vue 里的 mothods(異步方法) -------- 以下7行為新增 actions: {  updateNameAsync ({ commit }) {   setTimeout(() => {    commit('updateName')   }, 1000)  } }})

然后我們可以再我們的vue頁面里面這樣使用

methods: {  rename () {    this.$store.dispatch('updateNameAsync')  }}

三、 Module 模塊化

當項目越來越大的時候,單個 store 文件,肯定不是我們想要的, 所以就有了模塊化. 假設(shè) src/store 目錄下有這2個文件

moduleA.js

export default {  state: { ... },  getters: { ... },  mutations: { ... },  actions: { ... }}

moduleB.js

export default {  state: { ... },  getters: { ... },  mutations: { ... },  actions: { ... }}

那么我們可以把 index.js 改成這樣

import moduleA from './moduleA'import moduleB from './moduleB'export default new Vuex.Store({  modules: {    moduleA,    moduleB  }})

這樣我們就可以很輕松的把一個store拆分成多個.

四、 總結(jié)

  1. actions 的參數(shù)是 store 對象,而 getters 和 mutations 的參數(shù)是 state .
  2. actions 和 mutations 還可以傳第二個參數(shù),具體看vuex官方文檔
  3. getters/mutations/actions 都有對應(yīng)的map,如: mapGetters , 具體看vuex官方文檔
  4. 模塊內(nèi)部如果怕有命名沖突的話,可以使用命名空間, 具體看vuex官方文檔
  5. vuex 其實跟 vue 非常像,有data(state),methods(mutations,actions),computed(getters),還能模塊化.
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 都兰县| 阿勒泰市| 太白县| 甘南县| 若尔盖县| 广宁县| 松阳县| 兰溪市| 子长县| 静海县| 焦作市| 沂源县| 红河县| 图们市| 察隅县| 达孜县| 扎赉特旗| 伊通| 六盘水市| 长沙市| 开化县| 呼和浩特市| 平原县| 舒兰市| 那坡县| 灵丘县| 常宁市| 临城县| 五莲县| 大姚县| 梅州市| 进贤县| 登封市| 鹿邑县| 临安市| 延长县| 镇原县| 肥乡县| 遵化市| 南通市| 榕江县|