最后一篇 想写下vuex 2.0之后的变化, 其实严格意义不算入门了 你们随便看看就好 算这个系列的完结吧 :)javascript
vuex为了迎合vue2.0的变化 进行了大量的调整和优化vue
先看下尤大2.0的设计 传送门java
总结下大概有几点变化git
原文 Terms naming change for better semantics 这个语义化说的是触发action和mutation的API上
在使用action
的时候 咱们通常是从vue组件自己dispatch
派发一个action 这个其实只是一个命令 并无实际
改变什么, 而dispatch
一个mutation
实际上是改变了vuex自己的数据 因此通常从数据角度理解 这种应该属于事物提交。那么变化以后的命名就是commit
这样更加语义化 也更好的理解职责es6
新的写法github
methods:{ Add : function(){ this.$store.dispatch('ADD',2).then(function(resp){ console.log(resp) }) } }
actions:{ "ADD" : function(store , param){ return new Promise(function(resolve, reject) { store.commit('ADD',param) resolve("ok"); }) } }
1.x 写法就是触发action
和mutation
都叫dispatch
vuex
ADD: function(store, param ){ store.dispatch('COMMIT',param) }
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 } }
原文 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 })
新版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']) } }
在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)) }
最新的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入门实例结束 感谢阅读:)