Vuex是是一个程序里面的状态管理模式,它是集中式存储所有组件的状态的小仓库,并且保持我们存储的状态以一种可以预测的方式发生变化。
state中存放的是全局变量,定义如下
state: {//存放全局变量
myName:'冯昕',
myAge:23,
myJob:"我是小米前端工程师"
},
想要在组件中使用state中的值也是非常简单的,官方推荐我们写在computed属性中,这样代码比较美观,你也可以通过this.$store.state.myName来直接访问属性的值
<template>
<div class>
<div>名字:{{ myName }}</div>
<div>年龄:{{ myAge }}</div>
<div>工作:{{ myJob }}</div>
</div>
</template>
<script>
// 辅助函数: mapState, 可以把 数组快速转换成 计算属性中的方法
import { mapState } from 'vuex'
export default {
computed: {
// ...: 对象的展开语法, 去掉对象的 {} 包围
...mapState(['myName', 'myAge', 'myJob']),
},
mounted() {
//此时得到的是一个对象,里面包含了我们定义的数据
console.log(this.$store.state)
},
}
</script>
getters修饰state中的值
getters: {//修饰state中的值
changeName(state){
return `${state.myName}爱吃鸡屁股`
}
},
在组件中的使用方法
<template>
<div class>
<div>名字:{{ myName }}</div>
<div>年龄:{{ myAge }}</div>
<div>工作:{{ myJob }}</div>
<div>经过getters处理之后的名字:{{ newName }}</div>
</div>
</template>
<script>
// 辅助函数: mapState, 可以把 数组快速转换成 计算属性中的方法
import { mapGetters, mapState } from 'vuex'
export default {
computed: {
...mapState(['myName', 'myAge', 'myJob']),
//...mapGetters(['changeName']),
//可以直接使用也可以通过对象的方式来重新命名
...mapGetters({ newName: 'changeName' }),
},
mounted() {
//也可以通过this.$store.getters.changeName来获取
console.log(this.$store.getters.changeName)
},
}
</script>
mutations修改state中的值,
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {//存放全局变量
myName:'冯昕',
myAge:23,
myJob:"我是小米前端工程师"
},
getters: {//修饰state中的值
changeName(state){
return `${state.myName}爱吃鸡屁股`
state.myName = 'taocheng'
}
},
mutations: {//修改state中的值
//定义一个方法
//第二个参数num是传递的值
setAge(state,num){
state.myAge += num
}
},
actions: {
},
modules: {
}
})
在组件中的使用方法,这是带参数修改的的mutations方法,此外还有不带参数的
<template>
<div class>
<div>名字:{{ myName }}</div>
<div>
年龄:{{ myAge }}
<button @click="changeMyAge(1)">通过mutations修改年龄</button>
</div>
<div>工作:{{ myJob }}</div>
<div>经过getters处理之后的名字:{{ newName }}</div>
</div>
</template>
<script>export default {
methods: {
changeMyAge(n) {//n就是@click事件中传递的参数
this.$store.commit('setAge', n)
},
},
}
</script>
不带参数的mutations如下
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {//存放全局变量
myName:'冯昕',
myAge:23,
myJob:"我是小米前端工程师"
},
getters: {//修饰state中的值
changeName(state){
return `${state.myName}爱吃鸡屁股`
state.myName = 'taocheng'
}
},
mutations: {//修改state中的值
setName(state){
state.myName = 'fx'
}
},
actions: {
},
modules: {
}
})
在组件中同样可以通过computed计算属性来进行解构,然后直接使用就可以
<div>{{ setName }}</div>
computed: {
...mapMutations(['setName']),
},
最后是辅助函数的原理
<script>
// 把数组遍历之后, 转换成 对象类型:
function mapState(arr) {
var obj = {}
arr.forEach(value => {
obj[value] = function () {
return this.$store.state[value]
}
})
return obj
}
var res = mapState(['num', 'gname', 'price'])
console.log(res)
</script>