vuex

81 阅读2分钟

---

theme: channing-cyan

state

  • state是一个单一状态树,vuex中唯一的数据来源,每个应用将仅仅包含一个store实例
  • store.state.count可以用来获取store中state中的数据,但是这种获取方式过度的导致组件依赖全局状态单例,在模块化的构建系统中,在每个需要使用state的组件中需要大量呃引入,并且在测试组件时需要模拟状态
  • vuex通过vue的插件系统将store实例从根组件中注入到所有的子组件里,且自组件能通过this.$store访问到state中的数据
  • mapState()辅助函数能够获取state中的数据,当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余,为了解决这个问题我们可以使用mapState()辅助函数来帮助我们生成计算属性

getter是store中的state中派生出来的一些状态

mutation

  • 更改vuex的store中你的状态的唯一方法是提交mutation,每一个mutation都有一个字符串的时间类型个一个回调函数,这个回调函数就是我们实际进行状态更改的地方,并且它会接收state作为第一个参数
  • 不能直接调用一个mutation处理函数,需要用store.commit()方法去调用
  • store.commit中可以传入额外的参数,即mutation的载荷payload
  • mutation必须是同步函数,每一条mutation被记录在,devtools都需要捕捉到前一状态,和后一状态的快照,但是在mutation中的异步函数是捕捉不到的,因为当mutauion触发的时候,回调函数还没有被调用,devtools不知道什么时候回调函数实际上被调用---实质上任何回调函数中进行的状态的改变都是不可追踪的
  • 在组件中使用this.$store.commit('xxx')提交mutation,或者使用mapMutation辅助函数将组件中的methons映射为store.commit调用

action

  • action类似于mutaion
  • action提交的是mutaion,而不是直接更改状态
  • action可以包含任何异步操作
  • action函数接受一个与store实例具有一样方法和属性的context对象,因此我们可以用context.commit提交一个mutation,或者通过context.state和context.getters来获取state和getters
  • 组建中通过store.dispatch()来分发触发action
  • mapActions也可以用来分发action
  • store.dispatch()可以用来处理被触发的action的处理函数返回的promise,并且store.dispatch()仍旧返回promise

modules

  • 默认情况下,模块内部的action和mutation任然是注册在全局命名空间的,这样使得多个模块对同一个action或mutation做出响应,getter也同样注册在全局命名空间,不要在不同的,无命名空间的模块中定义一样的getter从而导致错误
  • 增加模块具有更高的封装度和复用性,可以添加namespaced:true的方式使其成为带命名空间的模块,当模块被注册之后,它的所有getter,action及mutation都会被自动根据模块注册路径调整命名