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+echart 展示后端获取的数据实现

    下面我将详细讲解“Vue+echart 展示后端获取的数据实现”的完整攻略。首先我们需要明确几个概念: Vue:一款轻量级的前端框架,可以实现响应式的数据绑定和组件化开发; Echarts:一款强大的可视化图表库,支持多种图表类型和交互方式,可以方便地展示数据; 后端:在本文中,代表数据源,可以是数据库、文件等。 下面我们按照以下步骤来实现: 1. 前端页面…

    Vue 2023年5月27日
    00
  • Vue如何基于es6导入外部js文件

    Vue可以基于ES6语法通过import关键字来导入外部的JavaScript文件,这个功能比起使用传统的<script>标签更为灵活和高效。下面是详细的步骤: 1. 创建Vue项目 首先需要安装Vue脚手架(可以使用npm或yarn进行安装),使用以下命令可以快速创建一个Vue项目: vue create my-project 2. 创建外部J…

    Vue 2023年5月29日
    00
  • 打印Proxy对象和ref对象的包实现详解

    “打印Proxy对象和ref对象的包实现详解”是一个介绍JavaScript中 Proxy 对象和 Reflect 对象的文章,为了更好地理解这个主题,我们需要了解以下几个方面: Proxy对象和Reflect对象的概念和作用; Proxy对象和Reflect对象的使用场景; Proxy对象和Reflect对象的包实现方式。 什么是Proxy对象和Refle…

    Vue 2023年5月28日
    00
  • vue3 setup() 高级用法示例详解

    下面我来为您详细讲解“vue3 setup() 高级用法示例详解”的完整攻略。 什么是vue3 setup()函数 setup()是Vue3中的一个新函数,用来替代Vue2中的data、computed、methods等选项,用于组件的数据响应、计算属性、方法等快速开发,同时还可以在其中访问props、context等组件相关对象。setup()函数是Vue…

    Vue 2023年5月28日
    00
  • vue中过滤器filter的讲解

    Vue中过滤器Filter的讲解 Vue中的 Filter 可以用来格式化输出内容,例如格式化日期、货币、大小写等。 Filter 本质上就是一个方法,它接收一个输入值,经过处理后返回一个输出值。以下是 Filter 的基本使用方法和示例说明。 基本使用方法 在 Vue 组件选项中声明 filters 对象,可以包含多个自定义 Filter 函数。示例: V…

    Vue 2023年5月27日
    00
  • 详解Vue注册组件的方法

    关于Vue注册组件的方法,主要有两种方式,分别是全局注册和局部注册。 1. 全局注册 在Vue中,全局注册即是把组件注册到Vue构造器中,使该组件可在任何地方被使用。我们可以通过Vue.component方法进行全局注册。 语法格式如下: Vue.component(‘组件名称’, { 组件配置项 }) 其中,’组件名称’即为组件的标签名,’组件配置项’包括…

    Vue 2023年5月27日
    00
  • Vue中金额、日期格式化插件@formatjs/intl的使用及说明

    Vue中金额、日期格式化插件@formatjs/intl的使用及说明 简介 @formatjs/intl 是一个用于处理数字、日期、货币等多种格式化需求的插件。可以在 Vue 中方便地使用它来对各种格式进行处理。 安装 在项目中安装@formatjs/intl: npm install @formatjs/intl 同时,需要安装@formatjs/intl…

    Vue 2023年5月27日
    00
  • vue 组件使用中的一些细节点

    下面我来详细讲解一下vue组件使用中的一些细节点。 组件标签名的命名 在Vue中使用组件需要先在Vue实例中注册该组件,命名时需要注意以下几点: 组件标签名建议使用连字符形式如 <my-component></my-component>,而不是驼峰式形式如 <MyComponent></MyComponent>…

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