Vuex(一)各方法的使用详解

一.什么是Vuex

开门见山,为什么要使用vuex?在vue项目中如果我们要用到组件传值,一般会选用父子,子父通信的方式,对于简单的项目这种方式是非常方便的。但是对于数据量非常大的项目,是不可取的。Vuex就为我们提供了一种集中管理数据的方式;

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

二.state

state是Vuex的数据源,所有的数据都存储在state,Vuex的其他方法都围绕state开展;
获取state的值,有两种方式,一种是直接获取,另一种是通过映射获取;

1.直接获取state中的值
//Vuex中定义count
state: {
        count: 0
    },
//组件中使用
<p>获取count方式1:直接获取--{{ $store.state.count }}</p>
2.映射获取

映射获取首先需要导入mapState方法,然后在computed中调用

//导入
import { mapState } from "vuex";

<p>获取count方式2:函数获取--{{ count }}</p>

//mapState返回值是一个对象,对象的值为函数,通过结构展开还原为一个函数
//等价于{count(){.....}}
computed:{
...mapState(["count"]),
}

三.getters

getters用于对state的预处理;

getters: {
        even(state) {
            return state.count % 2 === 0 ? '偶数' : '奇数'
        }
    },

调用同样是两种方法

 <p>getter使用方式一:直接使用--{{ $store.getters.even }}</p>
 <p>getter使用方式二:函数调用--{{ even }}</p>

 // getter
computed:{
	...mapGetters(["even"]),
}

四.mutations

1.mutations用于对state中值的修改;
    mutations: {
        update(state, num = 1) {
            state.count += num
        },
     }

调用:

	<p>直接改变count</p>
    <button @click="updatecount">count+1</button>
    <p>调用函数改变</p>
    <button @click="update()">count+1</button>
    
methods:{
  //直接触发update
updatecount() {
      this.$store.commit("update");
    },
}
 //调用函数映射为update
    ...mapMutations(["update"]),
2.mutations的传参

mutations默认只能穿一个参数,对于多个参数可以使用对象形式传递;

 mutations: {
 updateMore(state, payload) {
            state.count += payload.num
        }
        }
    <button @click="updateMorecount">直接传递</button>
    <button @click="updateMore({ num: 5 })">函数传递</button>
     updateMorecount() {
      this.$store.commit("updateMore", { num: 5 });
    },
      //传递多个参数
    ...mapMutations(["updateMore"]),

五.actions

为了每一步对数据的操作都形成快照,mutations是不支持异步的,异步操作在action中完成;

 actions: {
        updateDelae(context) {
            setTimeout(() => {
                context.commit('update')
            }, 1000)
        }
    },
    <p>异步修改组件的值</p>
    <button @click="updateAgeFnDelate">直接调用</button>
    <button @click="updateAgeDelate">调用函数</button>
    //直接异步调用
    delayUpdate() {
      this.$store.dispatch("updateDelae");
    },
    //调用函数异步
    ...mapActions(["updateDelae"]),

六.modules

对于大的工程来说,一个项目中只有一个state是不够的,所有引入了模块的概念,便于对数据的分类管理;

//模块
 modules: {
        name: {
            namespaced: true,
            state: {
                name: 'liyfn'
                , age: 18
            },
            actions: {
                updateAgeDelate(context) {
                    setTimeout(() => {
                        context.commit('updateAge', 5)
                    }, 1000)
                }
            },
            mutations: {
                updateAge(state, payload) {
                    state.age += payload
                },

            }

        },

    }
1.获取state
   <!-- 模块 -->
    <p>获取组件的值-直接获取:{{ $store.state.name.name }}</p>
    <p>间接获取:{{ age }}</p>
    //组件获取
    //方式一:在mapstate中第一个参数传入组件名字
    ...mapState("name", ["age"]),
    
    //方式二:引用createNamespacedHelpers ,实例化时候传入组件名称
    //并解构出来mapState方法,避免与原名称冲突,使用重命名
    import { createNamespacedHelpers } from "vuex";
	const {mapState: mapStateAn} = new createNamespacedHelpers("name");
     ...mapStateAn(["age"]),
2.mutations,action,getters

使用方法大同小异,我们以mutations举例:

    <button @click="updateAgeFn">直接修改</button>
    <p>修改组件的值方式二,借用函数</p>
    <button @click="updateAge(5)">借用函数</button>
	
	    //修改组件的值方式一
    updateAgeFn() {
      this.$store.commit("name/updateAge", 5);
    },
    //修改组件的值 方式二
    //同state获取
    // ...mapMutationsAn(["updateAge"]),
       ...mapMutations("name", ["updateAge"]),


那么关于Vuex中各个方法的使用我们已经介绍完了,当然,Vuex中也不止这些,我们下次分解;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liyfn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值