vuex入門實例(3/3) - end

vuex入門實例(3/3)

最後一篇 想寫下vuex 2.0之後的變化, 其實嚴格意義不算入門了 你們隨便看看就好 算這個系列的完結吧 :)javascript

vuex爲了迎合vue2.0的變化 進行了大量的調整和優化vue

先看下尤大2.0的設計 傳送門java

總結下大概有幾點變化git

1. 更加語義化

原文 Terms naming change for better semantics 這個語義化說的是觸發action和mutation的API上
在使用action的時候 咱們通常是從vue組件自己dispatch派發一個action 這個其實只是一個命令 並無實際
改變什麼, 而dispatch一個mutation 實際上是改變了vuex自己的數據 因此通常從數據角度理解 這種應該屬於事物提交。那麼變化以後的命名就是commit這樣更加語義化 也更好的理解職責es6

新的寫法github

dispatch --> Action

methods:{
    Add : function(){
      this.$store.dispatch('ADD',2).then(function(resp){
          console.log(resp)
      })
    }
}

commit --> Mutation

actions:{
    "ADD" : function(store , param){
        return new Promise(function(resolve, reject) {
            store.commit('ADD',param)
            resolve("ok");
        })
    }
}

1.x 寫法就是觸發actionmutation都叫dispatchvuex

ADD: function(store, param ){
    store.dispatch('COMMIT',param)
}

2. 更靈活

1.x以前的版本action是不定義在vuex裏的, 而2.x actions能夠直接在store中定義了 也就是能夠在store實例中直接dispatchpromise

var store =  new Vuex.Store({
    state: {
        messages: 0
    },
    mutations:{
        "ADD": function(state, msg) {
            state.messages += msg;
        }
    },
    // action不用再去外面定義 能夠直接寫在構建參數裏
    actions:{
        "ADD" : function(store , param){
            store.commit('ADD',param)
        },
    }
})
store.dispatch('ADD',2)

而getter也是如此 在vue中直接取getters框架

computed:{
   msg : function(){
      return this.$store.getters.getMessage
   }
}

3. Promise Action

原文 Composable Action Flow 直譯 可組合的action流
其實這個組合事件流概念 沒怎麼用過 也很差翻譯 我就簡單從變化性翻譯它
就是action如今返回了promise 在以前的版本 並無返回promise 而2.x的源碼中已經返回了promise
因此也就能夠支持所謂的Composable Action異步

// action咱們定義一個返回promise的add action
actions:{
    "ADD" : function(store , param){
        return new Promise(function(resolve, reject) {
            store.commit('ADD',param)
            resolve("ok");
        })
    }
}

// 這裏能夠在dispatch以後直接處理異步
this.$store.dispatch('ADD',2).then(function(resp){
   console.log(resp) // ok
})

4. MapGetters/ MapActions

新版vuex提供了幾個封裝方法 mapState, mapMutations, mapGetters,mapActions

這些都是什麼鬼呢?

其實若是你用過vuex1.x如下的版本 其實它就是咱們vue組件中的vuex屬性的 換了一種更高逼格寫法

能夠定義一組要獲取的actions getters 而後map進來

// 舊版寫法
 var App = Vue.extend({
    template:"....",
    vuex:{
        getters:{
            msg : function(state){
                return state.messages
            }
        },
        actions:{
            add :actions.ADD
        }
    }
 })

 // 新版寫法 es5 寫法
 var App = Vue.extend({
    template:"....",
    computed:Vuex.mapGetters({
        msg : 'getMessage'
    }),
    methods:Vuex.mapGetters({
        add : 'ADD'
    })
})

這種本質跟1.x的vuex寫法是同樣的 內部都是使用vue的Object.defineProperty取作響應式

// es6寫法 支持rest參數這種寫法 也能夠直接徹底使用map套裝注入
import { mapGetters, mapActions } from 'vuex'
export default {
  computed: {
    someComuted () { … },
    ...mapGetters(['getMessage', 'getName'])
  },
  methods: {
    someMethod () { … },
    ...mapActions(['ADD','EDIT'])
  }
}

5. Silent

在commit一個mutation的時候 是否觸發訂閱的插件。

默認silent爲false 若是silent設置爲true 則表示不觸發註冊的subscribe

通常訂閱的插件都不會觸發了 包括dev-tools

// 實例代碼
 store.commit('ADD',param,{ silent: true})
// 源碼 
 if (!options || !options.silent) {
   this._subscribers.forEach(sub => sub(mutation, this.state))
 }

6. 其餘變更

最新的vuex-2.0.0.rc5 爲說明API一些新變化

// 這個就是換個名字
   store.middlewares -> store.plugins
    
   // 這貨貌似幹掉又被還原了 尤大真是喜怒無常 哈    
   store.watch
   
   // 使用subscribe 監聽vuex的變化
   store.subscribe((mutation, state) => { ... })

   // 註冊模塊
   registerModule

   // 註銷模塊
   unregisterModule

總結

整體來講vuex2.0的變化仍是跟vue自己同樣 也算折騰了一下 新版的寫法和逼格更高些。做爲vue全家桶中重要的狀態流管理框架 vuex值得你擁有

vuex入門實例結束 感謝閱讀:)

demo地址

相關文章
相關標籤/搜索