vuex的安装
vue add vueX
在store中使用Vue.use(Vuex) 会在vue实列中添加一个$store
$store好比一个仓库,可以存储需要的数据
1export default new Vuex.Store({
2 state: {
3 name: 'huahua'
4 }
5})
组件获取name可以通过this.$store.state.name
组件内计算属性的简写
常规写法
1computed: {
2 name () {
3 return this.$store.state.name
4 }
5}
导出vuex中的mapState
1import {mapState} from 'vuex';
2export default {
3 computed: {
4 //这个mapState返回的正好是一个个函数
5 ...mapState(['name','age','look'])
6 }
7}
如果有跟当前组件data中相同的属性名字,可以通过导出对象的方式处理,其他不重名依然可以使用上面数组的方式,或者直接手动重命名掉
1computed: {
2 ...mapState({
3 storeName:state => state.name
4 })
5}
页面中直接使用storeName,使用方式和data属性一样用法
getters
getters相当于组件内的computed,用于计算store中用户需要的值变化,通过getters计算重新返回一个新的值,
1export default new Vuex.Store({
2 getters: {
3 //这个person可以是由state中的name, age, apparance等组成,当这些属性值变化的时候,getters会自动计算
4 person (state) {
5 return ''
6 }
7 }
8})
person里面还可以传入第二个参数getters,通过getters参数可以获取当前getters里面所有的属性
1getters: {
2 person(state,getters) {
3 return ''
4 }
5}
组件中使用mapGetters获取store中的getters
1import {mapGetters} from vuex;
2
3export default {
4 computed: {
5 ...mapGetters(['person'])
6 }
7}
同样可以使用对象的方式
1import {mapGetters} from vuex;
2export default {
3 computed: {
4 ...mapGetters({
5 newPerson: 'person'
6 })
7 }
8}
⚠️mapGetters里面的对象写法上跟mapStates是不同的,getters对象写法只需要一个key:valuemapStates对象写法需要的是一个对象
store中的数据都是单向数据流
允许组件中使用this.$store.state.xxx的方式访问属性,不能通过其跟新属性值,需要mutation更改,如果在store中增加严格模式的限制, 这样是不允许的, 虽然可以操作
1export default new Vuex.Store({
2 //开发的时候可以开启,用来避免双向的写法,上线的时候需要去掉,一:没有意义,二 strict会深度检测,影响性能
3 //strict: true,
4 //在开发环境开启
5 strict: process.env.NODE_ENV !== 'production'
6})
mutations的使用
1mutation: {
2 //obj为参数
3 changeStuList (state,obj) {
4 state.stuList.push(obj)
5 }
6}
组件中的使用
1this.$store.commit('changeStuList',obj)
也可以通过mapMutations的方式处理
1import {mapMutations} from. 'vuex';
2export default {
3 methods: {
4 ...mapMutations(['changeStuList'])
5 }
6}
⚠️mutations里面不可以写异步,只可以写同步。因为异步执行的函数,将不属于mutation,那么操作的方式还是单向数据流的操作方式
action的使用
在action可以执行异步
action里面可以commit一个mutations,达到异步的目的
在action中的函数名字可以跟mutation的函数名字是一样的
1actions: {
2 //{commit}是上下文对象
3 changeStuList({commit},obj) {
4 //这里可以执行异步函数
5 setTimeout(() => {
6 这里的函数是mutation中的方法,
7 commit('changeStuList',obj)
8 },1000)
9 }
10}
外部调用
1this.dispatch('changeStuList',obj)
同样可以使用mapActions
1methods: {
2 ...mapActions(['changeStuList'])
3}
通过modules区别模块
1import stu from './stu'
2Vue.use(Vuex);
3export default new Vuex.Store({
4 modules: {
5 stu,
6 }
7})
⚠️分模块后,获取属性需要加上模块的名称
1this.$store.state['模块名称'].['属性名称']
1//如果通过这种方式获取, 需要给模块加上命名空间的标示, 在模块增加 `namespaced: true`
2export default {
3 ...mapState('learn',['name'])
4}
如果给模块增加了namespaced: true,那么获取getters的时候也需要增加模块的名称
1export default {
2 computed: {
3 ...mapGetters('learn',['coursePrice'])
4 }
5}
commi和dispatach使用方式也需要增加模块名称
1methods: {
2 handleClick () {
3 this.$store.commit('learn/changePrice',{price:20})
4 }
5}
⚠️mutations, actions, getters,不需要通过模块名称, 会放到全局模块下,使用方式和之前一样
🚬每天分享一点点, 欢迎大家讨论, 共同学习, 有不对的地方,欢迎指出🚬