Vuex

1、什么是vuex?
  • 每一个 Vuex 应用的核心就是 store(仓库)。“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。
2、初始化vuex

(1)下载vuex

cnpm i vuex -D

(2)建一个store文件夹(store/index.js)

// 初始化vuex

import Vue from 'vue';
import Vuex from 'vuex';

// 引入module
import app from './module/app';

Vue.use(Vuex);

// 生成一个vuex实例
export default new Vuex.Store({
  modules: {
    app
  }
})

(3)在store文件夹里建一个module文件夹用来存放数据(store/module/app.js)

// 存放数据的地方
const state = {
  num: 100
}

// 派生数据(很少用)
const getters = {
    doubleNum(state){
        return state.num*2
    }
}

// 同步改变
const mutations = {
  changeNum(state, payload){
    state.num = payload;
  }
}

// 异步改变
// action提交的是mutation,而不是直接更变状态。
// action可以包含任意异步操作。
const actions = {  
<!-- 分发action:
	应用场景:当一次action对应的数据的更改,必须依赖另外一个action中的数据更改时,必须在本此action中先去触发另外一个action操作;
    另外一个action可能为同步,也可能为异步,如果为异步需要借助promise或者async函数; -->
    <!--changeNumAsync(context, payload){-->
        
    <!--}-->
    changeNumAsync({commit}, payload){
        commit('changeNum', payload)
    }
}

export default {
  // 命名空间
  namespaced: true, // 配合module使用
  state,
  actions,
  getters,
  mutations
}

(4)在main.js里面引入store

import Vue from 'vue'
import App from './App.vue'

import store from './store'

new Vue({
  el: '#app',
  store,
  render: h => h(App)
})

(5)辅助函数

mapState辅助函数
写法:
对象写法:
computed:mapState({
//写法一:箭头函数可使代码更简洁
	count:state=> state.count 
//写法二:传字符串参数 'count' 等同于 `state => state.count`
	count:state=> state.count 
	
//写法三:为了能够使用 `this` 获取局部状态,必须使用常规函数
	count(state){ 
return state.count+this.a 

	}
})
数组写法:
当映射的计算属性的名称与 state 的子节点名称相同时
computed:mapState([
	“count”
])

mapActions辅助函数
在组件中分发action:
methods: {
    ...mapActions([
      'increment' // 映射 this.increment() 为 this.$store.dispatch('increment')
    ]),
    ...mapActions({
      add: 'increment' // 映射 this.add() 为 this.$store.dispatch('increment')
    })
  }

(6)在页面中使用

<template>
  <div>
    <button @click="changeNum('+')">+</button>
    <span>{{num}}</span>
    <button @click="changeNum('-')">-</button>
  </div>
</template>
<script>
  export default {
    name: 'app',
    computed: {
      num() {
        return this.$store.state.app.num
      }
    },
    methods: {
      changeNum(type) {
        if (type == '+') {
          // this.$store.commit('changeNum', this.num+1)
          this.$store.dispatch('changeNumAsync', this.num+1)
        } else {
          this.$store.commit('changeNum', this.num-1)
        }
      }
    },
    mounted(){
      console.log(this.$store)
    }
  }
</script>

上次更新: 2019-5-4 21:13:03