vuex进阶知识点巩固
一、Getter
我们先回忆一下上一篇的代码
computed:{ getName(){ returnthis.$store.state.name } }
这里假设现在逻辑有变,我们最终期望得到的数据(getName),是基于this.$store.state.name上经过复杂计算得来的,刚好这个getName要在好多个地方使用,那么我们就得复制好几份.
vuex给我们提供了getter,请看代码(文件位置/src/store/index.js)
importVuefrom'vue' importVuexfrom'vuex' Vue.use(Vuex) exportdefaultnewVuex.Store({ //类似vue的data state:{ name:'oldName' }, //类似vue的computed-----------------以下5行为新增 getters:{ getReverseName:state=>{ returnstate.name.split('').reverse().join('') } }, //类似vue里的mothods(同步方法) mutations:{ updateName(state){ state.name='newName' } } })
然后我们可以这样用文件位置/src/main.js
computed:{ getName(){ returnthis.$store.getters.getReverseName } }
事实上,getter不止单单起到封装的作用,它还跟vue的computed属性一样,会缓存结果数据,只有当依赖改变的时候,才要重新计算.
二、actions和$dispatch
细心的你,一定发现我之前代码里mutations头上的注释了类似vue里的mothods(同步方法)
为什么要在methods后面备注是同步方法呢?mutation只能是同步的函数,只能是同步的函数,只能是同步的函数!!请看vuex的解释:
现在想象,我们正在debug一个app并且观察devtool中的mutation日志。每一条mutation被记录,devtools都需要捕捉到前一状态和后一状态的快照。然而,在上面的例子中mutation中的异步函数中的回调让这不可能完成:因为当mutation触发的时候,回调函数还没有被调用,devtools不知道什么时候回调函数实际上被调用——实质上任何在回调函数中进行的状态的改变都是不可追踪的。
那么如果我们想触发一个异步的操作呢?答案是:action+$dispatch,我们继续修改store/index.js下面的代码
文件位置/src/store/index.js
importVuefrom'vue' importVuexfrom'vuex' Vue.use(Vuex) exportdefaultnewVuex.Store({ //类似vue的data state:{ name:'oldName' }, //类似vue的computed getters:{ getReverseName:state=>{ returnstate.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文件,肯定不是我们想要的,所以就有了模块化.假设src/store目录下有这2个文件
moduleA.js
exportdefault{ state:{...}, getters:{...}, mutations:{...}, actions:{...} }
moduleB.js
exportdefault{ state:{...}, getters:{...}, mutations:{...}, actions:{...} }
那么我们可以把index.js改成这样
importmoduleAfrom'./moduleA' importmoduleBfrom'./moduleB' exportdefaultnewVuex.Store({ modules:{ moduleA, moduleB } })
这样我们就可以很轻松的把一个store拆分成多个.
四、总结
- actions的参数是store对象,而getters和mutations的参数是state.
- actions和mutations还可以传第二个参数,具体看vuex官方文档
- getters/mutations/actions都有对应的map,如:mapGetters,具体看vuex官方文档
- 模块内部如果怕有命名冲突的话,可以使用命名空间,具体看vuex官方文档
- vuex其实跟vue非常像,有data(state),methods(mutations,actions),computed(getters),还能模块化.