vuex

状态管理

状态的分类

  • UI状态
  • 用户状态
    区别:是否存在数据库当中
    将表示状态的数据放在store中,
    哪个组件要用到数据就在store中取
    get
    想要修改就
    set

Store

要将sotre直接传给根组件

const store =new Vuex.Store({
  state:{
    n:0
  },
  mutations:{
      plus(state){
      state.n=state.n+1
    }
  }
})
store.commit('plus')
computed:{
  x(){
return store.state.n}
}

触发操作。在methods中定义要改变状态的方法

methods:{
  add(){
  store.commit('plus')
  }
}

为什么要用辅助函数?

  1. 简化代码
  2. 使用方便

引入后不用赘余的写新名字

辅助函数

mapGetter

import { mapGetters } from 'vuex'
export default {
  // ...
  computed: {
  // 使用对象展开运算符将 getter 混入 computed 对象中
    ...mapGetters([
      'doneTodosCount',
      'anotherGetter',
      // ...
    ])
  }
}

mapStates

import {mapState} from "Vuex"
computed:{
  ...mapState([
    'n'
  ])
}

当映射的计算属性的名称和state的子节点的名称相同时,可以传一个字符串数组
为了避免在子组件中的commit要引入store
可以使用辅助函数 mapMutations

import {mapMutations} from 'vuex'
methods:{
  ...mapMutations(['plus'])
}

mutations必须是同步函数

因为Vue的 devtool跟踪不到数据变化,无法进行时间旅行

actions:{
  plusAsync(context){
setTimeout(()=>{
  context.commit('plus')
},1000)
}
}
import {mapActions} from "vuex"
methods:{
  ...mapMutations(['plusAsync'])
}

模块

 account: {
      namespaced: true,//命名空间

      // 模块内容(module assets)
      state: { ... }, // 模块内的状态已经是嵌套的了,使用 `namespaced` 属性不会对其产生影响
      getters: {
        isAdmin () { ... } // -> getters['account/isAdmin']
      },
      actions: {
        login () { ... } // -> dispatch('account/login')
      },
      mutations: {
        login () { ... } // -> commit('account/login')
      },
}

启用了命名空间的 getter 和 action 会收到局部化的 getter,dispatch 和 commit。换言之,你在使用模块内容(module assets)时不需要在同一模块内额外添加空间名前缀。更改 namespaced 属性后不需要修改模块内的代码。

computed: {
  ...mapState({
    a: state => state.some.nested.module.a,
    b: state => state.some.nested.module.b
  })
},
methods: {
  ...mapActions([
    'some/nested/module/foo', // -> this['some/nested/module/foo']()
    'some/nested/module/bar' // -> this['some/nested/module/bar']()
  ])
}

简化

computed: {
  ...mapState('some/nested/module', {
    a: state => state.a,
    b: state => state.b
  })
},
methods: {
  ...mapActions('some/nested/module', [
    'foo', // -> this.foo()
    'bar' // -> this.bar()
  ])
}

只需要在根js(main.js)下引入s

你可能感兴趣的:(vuex)