Vuex中的Mutations的具体使用方法

使用 Vuex 来管理 Vue.js 应用的状态,Mutations 是其中的一个重要概念,它可以对 Vuex 中的State状态进行修改,能够保证状态的唯一性以及状态的修改追踪。下面是“Vuex中的Mutations的具体使用方法”的完整攻略:

Mutations是什么

在 Vuex 中,Mutation 就是一种修改状态的方法,它能够保证 Vuex 中的 state 在 Vue 组件中是唯一的,并且能够追踪状态的变化。

Mutation 是一个纯函数,它的第一个参数是 state 本身,之后的参数为需要更新的新值。Mutation 函数只能进行同步修改操作。

mutations: {
    updateCount (state, num) {
        state.count = num
    }
}

上述代码中,updateCount 是一个 Mutation 函数,其中定义了一个修改 State 的行为,通过传递参数 num,来更新 state 中的 count。

如何使用Mutation

Mutation 函数是通过提交一个 Mutation 来触发的,在 Vue 组件中可以通过 this.$store.commit() 方法来触发 Mutation。

<button @click="$store.commit('increment')">点我自增</button>

methods: {
    increment() {
        this.$store.commit('increment')
    }
}

上述代码中,通过按钮点击事件,调用了 increment 方法,而这个方法通过 this.$store.commit() 方法提交了一个 increment 的 Mutation,从而触发了 Vuex 中的 state 的修改。

Mutation的常规使用

在实际开发中,我们会将一系列 state 修改操作,封装在 Mutation 中,以便在 Vue 组件中调用。下面的代码演示了一个实现计数器的例子:

// state
const state = {
    count: 0
}

// mutations
const mutations = {
    increment (state) {
        state.count++
    },
    decrement (state) {
        state.count--
    },
    resetCount (state) {
        state.count = 0
    }
}

// actions
const actions = {}

// export store
export default new Vuex.Store({
    state,
    mutations,
    actions
})

上述代码中,count 表示计数器的值,increment / decrement / resetCount 分别为递增/递减/重置计数器的 Mutation 函数。

在 Vue 组件中,可以通过 methods() 来触发 Mutation:

<template>
    <div>
        <h1>我是计数器应用</h1>
        <h2>{{count}}</h2>
        <button @click="increment">+1</button>
        <button @click="decrement">-1</button>
        <button @click="resetCount">清零</button>
    </div>
</template>

<script>
import { mapState, mapMutations } from 'vuex'

export default {
    computed: {
        ...mapState(['count'])
    },
    methods: {
        ...mapMutations([
            'increment',
            'decrement',
            'resetCount'
        ]),
    }
}
</script>

上述代码中,通过 mapState 和 mapMutations,来将 store 中的 state 和 mutations 映射到组件中,从而在组件中可以直接使用 this 访问对应的数据和方法,如:{{count}}、 increment()。

Mutation的模块化使用

假设现在有两个模块A和B,每个模块都有一个 count 的状态,并且需要通过 Mutation 来实现对 count 数据的修改,则需要在 Vuex 中配置两个模块。

  • AModule
const AModule = {
    namespaced: true, // 开启命名空间
    state: {
        ACount: 0           
    },
    mutations: {
        increment (state, payload) {
            state.ACount += payload.num
        },
        decrement (state, payload) {
            state.ACount -= payload.num
        }
    }
}

export default AModule
  • BModule
const BModule = {
    namespaced: true,  // 开启命名空间
    state: {
        BCount: 0           
    },
    mutations: {
        increment (state, payload) {
            state.BCount += payload.num
        },
        decrement (state, payload) {
            state.BCount -= payload.num
        }
    }
}

export default BModule

由于 AModule 和 BModule 都开启了命名空间,所以调用 Mutation 时需要使用 dispatch 来分别触发,dispatch 的第一个参数为需要调用的 actions 函数或 Mutation 名称,其中的第二个参数为需要传入的 Payload,则可以这样使用:

<template>
    <div>
        <h2>我是模块A</h2>
        <h3>{{ACount}}</h3>
        <button @click="Aincrement">A模块+1</button>
        <button @click="Adecrement">A模块-1</button>
        <br />
        <br />
        <h2>我是模块B</h2>
        <h3>{{BCount}}</h3>
        <button @click="Bincrement">B模块+1</button>
        <button @click="Bdecrement">B模块-1</button>
    </div>

</template>

<script>
import { mapState, mapMutations } from 'vuex'

export default {
    computed: {
        ...mapState({
            ACount: (state) => state.AModule.ACount, // 获取模块A的状态ACount
            BCount: (state) => state.BModule.BCount // 获取模块B的状态BCount
        })
    },
    methods: {
        ...mapMutations('AModule', [
            'increment',
            'decrement'
        ]),
        ...mapMutations('BModule', [
            'increment',
            'decrement'
        ]),
        Aincrement() {
            this.$store.commit('AModule/increment', {num: 1}) // 通过commit提交各自模块的Mutation
        },
        Adecrement() {
            this.$store.commit('AModule/decrement', {num: 1})
        },
        Bincrement() {
            this.$store.commit('BModule/increment', {num: 1})
        },
        Bdecrement() {
            this.$store.commit('BModule/decrement', {num: 1})
        }
    }
}
</script>

上述代码中,首先在局部引入 mapState 和 mapMutations,然后通过 mapState() 获取模块的状态,通过 mapMutations() 获取模块的 Mutation 方法,最后展示在模板中,并在方法中进行使用。可以看到,通过 $store.commit() 方法可以直接提交各自模块的 Mutation,从而修改对应的局部 state。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vuex中的Mutations的具体使用方法 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • vue v-model的详细讲解(推荐!)

    针对这个问题,我结合我的理解和经验,给出以下完整攻略: Vue v-model的详细讲解 什么是v-model v-model是Vue.js提供的一个双向数据绑定的指令。在表单元素中使用v-model指令,可以方便地将表单元素的值绑定到Vue实例的数据上。 如何使用v-model 基本用法 我们可以将v-model指令添加到表单元素上,来实现数据的双向绑定。…

    Vue 2023年5月28日
    00
  • vue时间线组件的使用方法

    请看以下内容: Vue时间线组件的使用方法 1. 简介 时间线(Timeline)是一种时间轴式的信息展示方式,通常用于展示一些时间上有序的事件或信息。在Vue中,有一些已经封装好的时间线组件可以使用,如Vuetify和Element UI等库中的组件。 2. 安装和导入 以使用Element UI的时间线组件为例,以下是安装和导入的步骤: 首先,在项目中安…

    Vue 2023年5月28日
    00
  • koa2服务端使用jwt进行鉴权及路由权限分发的流程分析

    下面是详细讲解”koa2服务端使用jwt进行鉴权及路由权限分发的流程分析”完整攻略: 什么是 JWT JWT(JSON Web Token)是一个开放标准(RFC 7519),可以使用 JSON 对象在网络上安全地传输信息。JWT 通常被用来在客户端和服务器之间传递身份信息以及其他信息。在用户登录成功后,服务器将 JWT 作为身份认证的令牌返回给客户端,客户…

    Vue 2023年5月28日
    00
  • Java 实现简单静态资源Web服务器的示例

    实现一个简单的静态资源Web服务器,可以基于Java语言编写。本文将提供一个完整的攻略,方便初学者快速上手。 1 创建项目 首先需要创建一个Java项目,可以使用Eclipse或者其他IDE。创建项目后,需要创建如下的目录结构: src ├── main │ └── java │ └── com │ └── example │ └── webserver │…

    Vue 2023年5月28日
    00
  • Vue中判断语句与循环语句基础用法及v-if和v-for的注意事项详解

    来讲解一下Vue中判断语句和循环语句的基础用法及其注意事项。 基础用法 Vue中的判断语句 Vue中的判断语句有两种:v-if和v-show。它们的作用都是根据某个条件来控制html元素的显示与隐藏,不同的是v-if是真正的条件渲染,如果条件为false,那么这个元素就不会被渲染在DOM中,而v-show则是简单地控制元素的display属性。 使用v-if…

    Vue 2023年5月27日
    00
  • vue 3 中watch 和watchEffect 的新用法

    下面我就来讲解 “Vue 3 中 watch 和 watchEffect 的新用法” 的完整攻略。 1. 简介 在Vue 3中,watch 和 watchEffect 的用法得到了很大的改进。 在Vue 2中,watch 选项和 watch 函数要么立即执行要么需要手动设置 immediate 选项才能立即执行。如果你只是需要在数据变化时立即执行一段代码,那…

    Vue 2023年5月28日
    00
  • Vue数据驱动模拟实现3

    Vue数据驱动模拟实现是指通过手动实现Vue框架底层的部分功能,来深入理解Vue的数据响应式原理。下面我们将给出实现Vue数据驱动的完整攻略: 1. 实现数据响应式 Vue的数据响应式是基于Object.defineProperties实现的,我们可以手动实现一个简化版的数据响应式: function defineReactive(obj, key, val…

    Vue 2023年5月28日
    00
  • vue实现在一个方法执行完后执行另一个方法的示例

    要实现在一个方法执行完后执行另一个方法,我们可以使用Vue的生命周期函数或者watch来实现。 利用Vue的生命周期函数 Vue提供了许多生命周期函数,其中mounted是一个在组件挂载后执行的函数。我们可以在mounted中调用第一个方法,然后在该方法中的异步操作完成后,再执行第二个方法。 示例代码如下: <template> <div&…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部