Vuex
vuex是什么?
1.vuex的概念:专门在Vue中实现集中式状态(数据)管理的一个vue插件,对vue应用中多个组件的共享状态进行集中式的管理(读/写), 也是一种组件之间通信的方式,且适用于任意组件间通信
2.Github地址:https://github.com/vuejs/vuex
什么时候使用vuex?
1.多个组件依赖于同一状态
2.来自不同组件的行为需要变更同一状态
先执行import,再执行其他的代码
main.js
import Vue from 'vue'
import App from './App.vue'
//store的s不能大写
import store from "./store"
// 关闭vue的生产提示
Vue.config.productionTip = false;
new Vue({
store,
render: h => h(App),
}).$mount('#app')
store/index.js
// store
// 引入vuex、vue
import Vuex from 'vuex'
import Vue from 'vue'
// 准备actions——用于响应组件中的动作
const actions = {};
// 准备mutations——用于操作数据(state)
const mutations = {};
// 准备state——用于存储数据
const state = {
};
Vue.use(Vuex);
// 创建并导出vuex
export default new Vuex.Store({
actions,
mutations,
state
})
VUEX的基本使用
1.初始化数据,配置actions、配置mutations,操作store
求和案例:
vue文件
<template>
<div>
<h2>当前的和为:{{ $store.state.sum }}</h2>
<!-- v-model.number双向绑定的是number类型的 -->
<select v-model.number="num">
<!-- value="1"中的1是字符串类型,:value="1"中的1是number类型 -->
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<button @click="add">+</button>
<button @click="sub">-</button>
<button @click="addOdd">当前和为奇数再加</button>
<button @click="addWait">等一等再加</button>
</div>
</template>
<script>
export default {
data() {
return {
num: 1, //选择的数字
};
},
methods: {
add() {
// this.$store.dispatch("addNum", this.num);
this.$store.commit("ADDNUM", this.num);
},
sub() {
// this.$store.dispatch("subNum", this.num);
this.$store.commit("SUBNUM", this.num);
},
addOdd() {
this.$store.dispatch("OddNum", this.num);
},
addWait() {
this.$store.dispatch("delay", this.num);
},
},
};
</script>
<style>
</style>
store/index.js
// store
// 引入vuex、vue
import Vuex from 'vuex'
import Vue from 'vue'
// 使用vuex
Vue.use(Vuex);
// 准备actions——用于响应组件中的动作
const actions = {
// 加减这两个操作无需放在actions里面,多余的
/* // 加
addNum(context, val) {
// console.log(context);
// console.log(val);
context.commit('ADDNUM', val)
},
// 减
subNum(context, val) {
context.commit('SUBNUM', val)
}, */
// 奇数时减
OddNum(context, val) {
if (context.state.sum % 2) {
context.commit('ADDNUM', val)
}
},
// 延时操作
delay(context, val) {
setTimeout(() => {
context.commit('ADDNUM', val)
}, 500);
}
};
// 准备mutations——用于操作数据(state)
const mutations = {
ADDNUM(state, val) {
state.sum += val
},
SUBNUM(state, val) {
state.sum -= val
}
};
// 准备state——用于存储数据
const state = {
sum: 0, //和
};
// 创建并导出vuex
export default new Vuex.Store({
actions,
mutations,
state
})
2.组件中读取vuex中的数据:$store.state.xxx
3.组件中修改vuex中的数据:
this.$store.dispatch("actions中的方法名", 数据);
或
this.$store.commit("mutations中的方法", 数据);
备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,即直接用commit,调用mutations中的方法
getters的使用
1.概念:当state中的数据需要经过加工后再使用时,可以使用getters加工
2.配置getters
const getters={
newNum(state){
return state.num*10
}
}
export default new Vuex.Store({
...
getters
})
3.组件中读取数据:$store.getters.newNum
四个map方法的使用
使用之前要先映射:
// 映射状态
import { mapState, mapMutations, mapActions, mapGetters } from "vuex";
1.mapState方法:用于帮助我们映射state中的数据为计算属性
2.mapGetters方法:用于帮助我们映射getters中的数据为计算属性
computed: {
// 借助mapState生成计算属性,从state中读取数据(对象写法)
// ...mapState({ sum: "sum", school: "school", subject: "subject" }),
// 借助mapState生成计算属性,从state中读取数据(数组写法)
...mapState(["sum", "school", "subject"]),
/* dSum() {
return this.$store.getters.dSum;
}, */
//借助mapgetters生成计算属性,从getters中读取数据(对象写法)
//...mapGetters({dSum:'dSum'}),
//借助mapgetters生成计算属性,从getters中读取数据(数组写法)
...mapGetters(["dSum"]),
},
3.mapSctions:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数
4.mapMutations方法:用于帮助我们生成与mutations对话的方法,即$store.commit(xxx)的函数
methods: {
// 对象写法
// ...mapMutations({ ADDNUM: "ADDNUM", SUBNUM: "SUBNUM" }),
// 借助mapMutations生成对应的方法,方法中会调用commit去联系Mutations,数组写法
...mapMutations(["ADDNUM", "SUBNUM"]),
// 借助mapActions生成对应的方法,方法中会调用dispatch去联系mapActions,数组写法
...mapActions(["OddNum", "delay"]),
// 对象写法
...mapActions({ OddNum: "OddNum", delay: "delay" }),
},
案例:
vue文件
<template>
<div>
<h2>当前的和为:{{ sum }}</h2>
<h4>加工后的和为:{{ dSum }}</h4>
<h3>我在{{ school }}学习{{ subject }}</h3>
<!-- v-model.number双向绑定的是number类型的 -->
<select v-model.number="num">
<!-- value="1"中的1是字符串类型,:value="1"中的1是number类型 -->
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select>
<!-- <button @click="add">+</button>
<button @click="sub">-</button>
<button @click="addOdd">当前和为奇数再加</button>
<button @click="addWait">等一等再加</button> -->
<button @click="ADDNUM(num)">+</button>
<button @click="SUBNUM(num)">-</button>
<button @click="OddNum(num)">当前和为奇数再加</button>
<button @click="delay(num)">等一等再加</button>
</div>
</template>
<script>
// 映射状态
import { mapState, mapMutations, mapActions, mapGetters } from "vuex";
export default {
data() {
return {
num: 1, //选择的数字
};
},
methods: {
// 程序员写的
/* add() {
// this.$store.dispatch("addNum", this.num);
// this.$store.commit("ADDNUM", this.num);
this.ADDNUM(this.num);
},
sub() {
// this.$store.dispatch("subNum", this.num);
// this.$store.commit("SUBNUM", this.num);
this.SUBNUM(this.num);
},
addOdd() {
// this.$store.dispatch("OddNum", this.num);
this.OddNum(this.num);
},
addWait() {
// this.$store.dispatch("delay", this.num);
this.delay(this.num);
}, */
// 对象写法
// ...mapMutations({ ADDNUM: "ADDNUM", SUBNUM: "SUBNUM" }),
// 借助mapMutations生成对应的方法,方法中会调用commit去联系Mutations,数组写法
...mapMutations(["ADDNUM", "SUBNUM"]),
// 借助mapActions生成对应的方法,方法中会调用dispatch去联系mapActions,数组写法
...mapActions(["OddNum", "delay"]),
// 对象写法
...mapActions({ OddNum: "OddNum", delay: "delay" }),
},
computed: {
// 程序员写的
/* sum() {
return this.$store.state.sum;
},
school() {
return this.$store.state.school;
},
subject() {
return this.$store.state.subject;
}, */
// 借助mapState生成计算属性,从state中读取数据(对象写法)
// ...mapState({ sum: "sum", school: "school", subject: "subject" }),
// 借助mapState生成计算属性,从state中读取数据(数组写法)
...mapState(["sum", "school", "subject"]),
/* dSum() {
return this.$store.getters.dSum;
}, */
...mapGetters(["dSum"]),
},
};
</script>
<style>
</style>
store文件
// store
// 引入vuex、vue
import Vuex from 'vuex'
import Vue from 'vue'
// 使用vuex
Vue.use(Vuex);
// 准备actions——用于响应组件中的动作
const actions = {
// 加减这两个操作无需放在actions里面,多余的
/* // 加
addNum(context, val) {
// console.log(context);
// console.log(val);
context.commit('ADDNUM', val)
},
// 减
subNum(context, val) {
context.commit('SUBNUM', val)
}, */
// 奇数时减
OddNum(context, val) {
if (context.state.sum % 2) {
context.commit('ADDNUM', val)
}
},
// 延时操作
delay(context, val) {
setTimeout(() => {
context.commit('ADDNUM', val)
}, 500);
}
};
// 准备mutations——用于操作数据(state)
const mutations = {
ADDNUM(state, val) {
state.sum += val
},
SUBNUM(state, val) {
state.sum -= val
}
};
// 准备state——用于存储数据
const state = {
sum: 0, //和
school: 'XXX学院',
subject: '前端'
};
// 准备getters——用于将state中的数据进行加工处理,相当于vue中的computed计算属性
const getters = {
dSum(state) {
return state.sum * 10
}
};
// 创建并导出vuex
export default new Vuex.Store({
actions,
mutations,
state,
getters
})
模块化+命名空间
开启命名空间:namespaced: true,
1.目的:让代码更好维护,让多种数据分类更加明确
2.修改store
3.开启命名空间后,组件中读取state 数据:
方式一:
this.$store.state.xxxx.list
方式二:
...mapState('xxxx',['数据名','数据名','数据名','数据名'])
4.开启命名空间后,组件中读取getters数据 :
方式一:
this.$store.getters["xxxx/list"]
方式二:
...mapGetters('xxxx',['数据名','数据名','数据名','数据名'])
5.开启命名空间后,组件中调用dispatch,来调用actions中的方法
方式一:
this.$store.dispatch("xxxx/方法名",传的实参)
方式二:
...mapActions('xxxx',{页面中的方法:"actions中的方法",页面中的方法:"actions中的方法"})
6.开启命名空间后,组件中调用commit,来调用mutations中的方法
方式一:
this.$store.commit("xxxx/方法名",传的实参)
方式二:
...mapMutations('xxxx',{页面中的方法:"mutations中的方法",页面中的方法:"mutations中的方法"})