五大件
state,actions,mutations,getter,modules
区别
state: 主要存放用户数据
mutations: set 用户数据(同步形式)
actions: 主要是异步操作,通过 commit  触发 mutations 中的操作改变 state
getters: change 用户数据(经常性的)
modules: 将近似的操作抽离放到一个模块里,防止 store 过于臃肿.
Vuex 中 action 的{commit}的理解
1 2 3 4 5 6 7 8 9 10
   | actions: {     increment (context) {       context.commit('increment')     }   }
  actions: { 	increment({commit}){     commit('increment')   }
  | 
 
理解
context 是默认参数,将 {commit}  从 context 中解构出来.
let { commit } = context 
那么 commit  就是 context  对象中的一个参数,直接赋值调用即可.
1 2 3 4 5 6 7 8 9 10 11 12 13
   |  function setCookie(name, value, options) {   options = options || {};   let secure = options.secure,     path = options.path,     domain = options.domain,     expires = options.expires;    }
  function setCookie(name, value, { secure, path, domain, expires } = {}) {    }
 
  | 
 
参数 options 默认有 { secure, path, domain, expires }  参数,
而 options  默认可能空,设置它的默认值为 {} .
state
state 中的数据不能在组件中赋值,必须使用 mutation 改变.
获取 state
- 通过属性访问
 
1 2 3 4 5 6 7 8 9 10 11
   | import store from "@/store/index.js";  export default {   data() {     return {};   },   computed: {     username() {       return store.state.username;     },   }, };
   | 
 
- 通过 
this.$store.state  访问. 
1 2 3 4 5
   | computed: {   username() {     return this.$store.state.username   } }
  | 
 
mapState
1 2 3 4 5
   | import { mapState } from 'vuex' ... computed: mapState({ username: state => state.name, age: state => state.age }) //mapState字符串数组 computed: mapState(['username','age']) //当要获取组件自己的data数据时,必须使用常规函数 computed: { ...mapState({ username: function(state){ return this.firstName + ' ' + state.username }, age: state => state.age }) }
  | 
 
Action
可以执行同步和异步.,通过 commit 触发 mutations 中的操作改变 state
分发 Action
- 通过 
dispatch  分发. 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | <template>   <view>     <view>{{ count }}</view>     <button @click="add">click add</button>   </view> </template> <script> import store from "@/store/index.js"; export default {   computed: {     count() {       return this.$store.state.count;     },   },   methods: {     add() {       store.dispatch("addCountAction");     },   }, }; </script>
   | 
 
mapActions
- 通过 
mapActions  分发. 
使用 mapActions  辅助函数将组件的 methods  映射为 store.dispatch  调用(需要现在根节点注入 store )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
   | <template>   <view>     <view>{{ count }}</view>     <button @click="addCount">click add</button>   </view> </template> <script> import { mapAction } from 'vuex'; export default {   computed: {     count() {       return this.$store.state.count     }   },   methods: {     ...mapActions(['addCountAction'])       //将this.addCountAction映射为this.$store.dispatch('addCountAction')
        //传入参数       //将this.addCountAction(amount)映射为this.$store.dispatch('addCountAction',amount)
        //传入对象       ...mapActions({         addCount: 'addCountActions'         //将this.addCount()映射为this.$store.dispatch('addCountAction')       })   } } </script>
   | 
 
- 组合 Action
 
store.dispatch  可以处理被触发 action  的处理函数返回的 Promise ,并且仍返回 Promise .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | store.dispatch('actionA').then(()=>{   ... })
 
  actions: { 	actionB({ commit, state}){     return dispatch('actionA').then(()=> { 			commit('someMutation')     })   } }
       actions: {     async actionA({commit, state}){       commit('gotData', await getData())     },     async actionB({commit, state}){       await dispatch('actionA')        commit('gotOtherData', await getOtherData())     }   }
  | 
 
一个 store.dispatch  在不同模块中可以触发多个 action  函数.在这种情况下,只有当所有触发函数完成后,返回的 Promise 才会执行.
因为 action 是包含 promise 的,所以在组件中也可以使用 then .
1 2 3 4 5
   | let payload = {   username: this.userInfo.username,   date: new dateFormat().toString("date"), }; this.getLogList(payload).then(() => this.buildLog());
  | 
 
getters
getters 是 store 中的计算属性.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   | list: [   {     id: 1,     name: "商品一",     status: false,   },   {     id: 2,     name: "商品二",     status: true,   },   {     id: 3,     name: "商品三",     status: false,   },   {     id: 4,     name: "商品四",     status: true,   },   {     id: 5,     name: "商品五",     status: false,   }, ];
   | 
 
将上面数组筛选出 status 为 true 的对象.
1 2
   | // vuex中 getters: { activeList(state) { return state.list.filter(v=>v.status) } }
  | 
 
在页面中获取的方法
1 2 3 4
   | <div> {{ $store.getters.activeList}} </div>
  //第二种写法 computed(){ list(){ return this.$store.getters.activeList } } // 第三种 computed:{ ...mapGetters(['aciveList']) }
  |