Vuex

158 阅读4分钟

Vuex

$store 对象中存放的东西是固定的,主要有:state、mutations、actions、getters、modules

store里面的state、mutations、actions其实都是一个对象

1.state:单一状态树即单一数据源,在一个项目中只使用一个store对象,来存储所有共享的状态信息。存放需要共享的状态信息,使用时通过 $store.state.参数名 即可拿到状态信息。

2.actions:如果确实需要进行一些异步操作,比如网络请求,建议在 Actions 中进行处理,这样 devtools 就能够进行跟踪,由 Actions 处理异步操作,具体的函数部分仍交由 Mutations 进行处理。组件中使用时,调用:this.$store.dispatch('方法名','参数')

3.Mutations: 组件中使用时,调用this.$store.commit

这里执行一个动作,比如要加一个数 这个加就是一个动作 把这个动作通过调用dispatch传给actions,然后通过actions调用commit传递给mutations,然后再mutations里面完成所有逻辑操作 如果数据是通过发起ajax之后才能拿到的话,就必须要通过actions才可以,如果数据本来就有,就可以不用通过actions,直接调用commit就可以

img

如何创建并配置Vuex

Vue2版本只能使用Vuex3 Vue3只能使用Vuex4

步骤

1.在src文件夹下创建一个store文件,在store文件下创建一个index.js文件

2.在index.js文件中写创建Vuex的代码

// 引入Vuex
import Vue from 'vue'
//引入Vue
import Vuex from 'vuex'
//准备actions,用于响应组件中的动作,比如ajax请求等
const actions = {}
//准备mutations,用于操作数据(state)
const mutations = {}
// 准备,用于存储数据
const state = {}
//因为必须在调用Vuex之前把Vuex挂载到Vue身上,所以需要在index.js文件中调用Vue.use进行注册挂载
Vue.use(Vuex)
​
export default new Vuex.Store({
actions,
mutations,
state
})
​

3.在main.js文件中导入Vuex的js文件,然后注册

import Vue from 'vue'
import App from './App.vue'
import store from '@/store/index.js'
Vue.config.productionTip = falsenew Vue({
store,
render: h => h(App)
}).$mount('#app')
​

在actions中定义的函数可以接收到两个参数

第一个参数是一个残缺版的store

第二个参数就是传递过去的值

如何调用

//在组件中调用dispatch方法,调用actions里面的jia这个函数方法传递过去一个value值
this.$store.dispatch('jia', this.msg)
​
//在Vuex的js文件中 给actions添加一个jia这个函数方法
//这个函数方法有两个参数  第一个参数是残缺版的store,第二个参数就是调用dispatch传递过来的value值
const actions = {
  jia(context, value) {
    // console.log('action里面的jia被调用', a, b)
    context.commit('JIA', value)//这个是表示调用mutations里面的名叫JIA的函数方法  传递过去一个value值
  },
}
​
​
​
const mutations = {
  JIA(state, value) {  //这个JIA函数有两个参数 第一个是state,里面有在state中存放的数据  第二个就在actions中调用该方法传递过来的value数据
      
    // console.log('mutations里面的jia被调用', a, b)
    state.sum += value
  },
}

基本使用

<template>
  <div class="app-container">
    <h3>最新的数值是:{{ $store.state.sum }}</h3>
    <select v-model.number="msg">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="add">+</button>
  </div>
</template>
<script>
export default {
  data() {
    return {
      msg: 1
    }
  },
  methods: {
    add() {
      this.$store.dispatch('jia', this.msg)
    }
  },
  mounted() {
    console.log('contr', this)
  }
}
</script>
// 引入Vuex
import Vue from 'vue'
//引入Vue
import Vuex from 'vuex'
//准备actions,用于响应组件中的动作,比如ajax请求等
const actions = {
  jia(context, value) {
    // console.log('action里面的jia被调用', a, b)
    context.commit('JIA', value)
  }
}
//准备mutations,用于操作数据(state)
const mutations = {
  JIA(state, value) {
    // console.log('mutations里面的jia被调用', a, b)
    state.sum += value
  }
}
// 准备,用于存储数据
const state = {
  sum: 0,
  // timer: null
  timer: true
}
Vue.use(Vuex)
export default new Vuex.Store({
  actions,
  mutations,
  state
})
​

当state中的数据需要经过加过之后再进行使用时,可以在Vuex中配置一个getters对象 跟计算属性一样 都是通过返回值确定值的,里面的方法接收一个参数 这个参数就是state

如何读取:在store.js中追加getters配置

const getters = {
  bigSum(state) {
    return state.sum * 10
  }
}

在vuex中可以借助mapState帮我们映射state中的数据为计算属性(两种方式)

对象写法

步骤:

1.先在Vuex中的State方法中定义数据

2.在组件中导入mapState import { mapState } from 'vuex'

3.在computed计算属性中使用mapState这个方法

4.mapState使用格式 mapState({sum:'sum',xuexiao:'xuexiao'}) 这个括号里的sum表示的是创建出来的计算属性的方法名 后面引号里面的表示的是去找state里面的sum数据

computed: {
    //mapState({sum:'sum',xuexiao:'xuexiao'})这个返回值就是一个对象,通过...展开运算符把这个对象里面的所有数据放到computed里面
    ...mapState({ sum: 'sum', xuexiao: 'xuexiao', xueke: 'xueke' })
  },

数组写法

只有传递过去的方法名和state中数据名相同时,才能使用数组写法

 ...mapState(['sum', 'school', 'subject'])

mapGetters

用于映射getters中的数据为计算属性,用法和mapState一样

//...mapGetters({ bigsum: 'bigSum' })  对象写法
​
  ...mapGetters(['bigSum']) //数组写法

mapMutations

mapMutations这个方法是直接调用Vuex中index.js文件中的mutations对象中的方法

mapMutations通过mapMutations映射的方法里面的value需要通过调用函数时手动传递参数

...mapMutations(['JIA', 'JIAN'])就相当于是this.$store.commit("JIA",msg) 调用mutations里面JIA这个方法,并传递一个msg参数过去

<button @click="JIA(msg)">+</button>
​
// ...mapMutations({ add: 'JIA', remove: 'JIAN' }),  //对象写法
    ...mapMutations(['JIA', 'JIAN']),  //数组写法    如果想用数组写法,调用的函数名和mutations中的方法名必须一样

mapActions

mapActions这个方法是直接调用Vuex中index.js文件中的mapActions对象中的方法

mapActions通过mapActions映射的方法里面的value需要通过调用函数时手动传递参数

...mapActions(['waittime', 'waittime'])就相当于是this.$store.dispatch("waittime",this.msg) 调用actions里面waittime这个方法,并传递一个msg参数过去 如需传递参数需要在组件中绑定该事件时就传递参数

 
<button @click="ADD(msg)">和为奇数再加</button>  //调用方法时需要自己手动传递参数
...mapActions({ ADD: 'js', waittime: 'waittime' })
...mapActions(['ADD', 'waittime']) //数组形式表示函数名和Vuex中actions里面的方法名一致

\