Vue中状态管理器(vuex)详解以及实际应用场景

yizhihongxing

Vue中状态管理器(Vuex)详解以及实际应用场景

一、什么是Vuex

Vuex是一个用于Vue.js应用程序的状态管理模式。它采用集中式存储管理应用的所有组件状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具 devtools extension ,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

二、Vuex的核心概念

  1. State 状态: 在store中存储数据的对象。在组件内部通过$store.state.xxx或mapState获取数据。
  2. Getter获取器: 在store中提供了一种将状态映射为计算属性的方法,即Getter。可以在组件内部通过$store.getters.xxx或mapGetters获取。
  3. Mutation突变: 改变store中状态的唯一方法,但是仅仅是同步改变,因此不能写异步操作。在组件内部调用$store.commit('XXX',params)来触发Mutation的执行。
  4. Action行动: 异步操作 or 复杂操作的函数,在组件内部调用$store.dispatch('XXX',params)来触发Action的执行。Action中可以触发Mutation的执行。
  5. Module: 将store分割成模块,每个模块具有自己的state, mutation, action, getters。

三、Vuex详细实现

1.安装Vuex

使用npm或者yarn进行安装。

//使用npm安装
npm install vuex --save 

//使用yarn安装
yarn add vuex

2.注册store

在Vue应用程序中注册store,关于store的注册,我们应该将状态、mutations、actions、getters分别拆分到单独的文件中,按模块划分,方便维护。

//store.js文件
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);

const state = {
    count: 1
}

const mutations = { 
    add(state){   
        state.count++;
    },
    reduce(state){
        state.count--;
    }
}

const actions = {   
    addAction(context){   
        context.commit('add');
    },
    reduceAction({commit}){    
        commit('reduce');
    }
}

const getter = {
    getCount(state){
        return state.count;
    }
}

export default new Vuex.Store({
    state,mutations,actions,getter
});

3.使用Vuex

在根组件中将store绑定到Vue,使用$store.commit/ dispatch/ state/ getters来调用。

//main.js文件
import Vue from 'Vue'
import App from './App.vue'
import store from './store.js'

new Vue({
    el: '#app',
    store,   //将store注入根组件
    render: h => h(App)
});
//Example1.vue文件

<template>
    <div>
        <button @click="add">点击增加</button>
        <button @click="reduce">点击减少</button>
        <div>count{{count}}</div>
    </div>
</template>

<script>
    import { mapState,mapGetters,mapMutations,mapActions } from 'vue';
    export default {
        computed: {
            ...mapState([
                'count'
            ]),
            ...mapGetters([
                'getCount'
            ])
        },
        methods: {
            ...mapMutations([
                'add',
                'reduce'
            ]),
            ...mapActions([
                'addAction',
                'reduceAction'
            ])
        }
    }
</script>

4.命名空间

当store中模块化的数据过多时,可能会出现命名冲突的问题,Vuex提供了命名空间的方式来避免这种问题。

//navbar.js 文件
const navbar = { 
    state:{
        username: 'John' 
    },
    mutations:{ ... },
    actions:{ ... },
    getters:{
        getUsername(state,getters,rootState){ 
            return state.username;
        }
    }
}
export default navbar;
//store.js文件
import navbar from './navbar.js';

export default new Vuex.Store({
    modules: {
        navbar: navbar,
    }
})

当使用命名空间时,得注意在方法访问时,应该在组件中传入参数{root: true},来使其找到正确的命名空间store。

示例代码如下:

<button @click="$store.commit('navbar/add',null,{ root: true })">+</button>

5.异步操作

如果想要执行异步操作的方法,可以使用actions,并进行封装,最后在mutations中进行数据操作。

示例代码如下:

//store.js文件
const actions = {
    async getMarket({ commit }) {
        const res = await api.getMarket();
        commit('setMarket',res.data);
    }
}

const mutations = {
    setMarket(state, market) {
        state.market = market;
    }
}

示例代码2:

//store.js文件
const actions = {
    getMovies({ state, commit }) {
        return new Promise((resolve, reject) => {
            Vue.http.get(`${state.baseUrl}/in_theaters?start=0&count=10`)
                .then(res => {
                    let movies = res.body.subjects.map(item => ({
                        title: item.title,
                        imgUrl: item.images.small
                    }));
                    commit('setMovies', movies);
                    resolve();
                }, err => {
                    reject(err);
                });
        });
    }
}

const mutations = {
    setMovies(state, movies) {
        state.movies = movies;
    }
}

四、Vuex的应用场景

  1. 在大型单页面应用中,状态管理变得相对复杂,使用Vuex可以非常方便的进行状态管理。
  2. 存放全局变量,比如用户信息、菜单控制、路由控制等。
  3. Angular和React等框架中也提供了类似的状态管理服务,Vue也不例外,Vuex的出现是Vue为用户带来的福利之一,相当于团队协作中的状态管理的利器。

总之,在不同的应用场景下,使用Vuex可以帮助我们更好地实现状态管理。同时,合理地运用Vuex,还可以让开发者在大型项目中更好地进行团队协作和代码维护。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue中状态管理器(vuex)详解以及实际应用场景 - Python技术站

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

相关文章

  • uniapp引入模块化js文件和非模块化js文件的四种方式

    下面我将详细介绍 uniapp 引入模块化 js 文件和非模块化 js 文件的四种方式。 引入模块化 js 文件的方式 直接引入 可以通过 import 语句直接引入一个模块化 js 文件,如下所示: import {add, subtract} from ‘@/utils/calculate’; 其中 @ 表示项目根目录,calculate 是 utils…

    Vue 2023年5月27日
    00
  • Vue 组件渲染详情

    Vue 组件渲染详情是指在 Vue 应用中,如何使用组件进行渲染及其相关的细节。下面将从 Vue 组件的定义、组件间通信、组件生命周期、组件的复用以及常见问题五个方面,来详细讲解 Vue 组件渲染的攻略。 Vue 组件的定义 Vue 组件分为两种:全局组件和局部组件,其定义方式分别如下: 全局组件 全局组件可以在任何 Vue 实例的模板中使用,定义方式如下:…

    Vue 2023年5月28日
    00
  • springboot vue测试平台接口定义前后端新增功能实现

    下面我将详细讲解“springboot vue测试平台接口定义前后端新增功能实现”的完整攻略,这包括如何进行前后端的接口定义以及新增功能的开发实现。具体攻略如下: 1. 环境准备 在开始之前,需要确保本机已经安装了以下环境: JDK 8或以上版本 Node.js 8或以上版本 Vue CLI IntelliJ IDEA 或其他java开发工具 VS Code…

    Vue 2023年5月28日
    00
  • vue实现简易计时器组件

    下面我将为你详细讲解“Vue实现简易计时器组件”的完整攻略。 首先,在Vue中创建一个计时器组件需要经过以下几个步骤: 第一步:创建组件 在Vue中创建组件可以通过Vue.component()方法进行注册。代码如下: <template> <!– 计时器组件模板代码 –> </template> <script…

    Vue 2023年5月28日
    00
  • Vuex中的State使用介绍

    当我们使用 Vue 开发复杂的应用程序时,我们通常会遇到许多组件共享相同的状态数据的情况。在这种情况下,每个组件都必须知道如何获取和操作此数据,这会导致代码的冗余以及困难的维护性。Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 在 Vuex 中,可以以集中化的方式处理共享状态。该模式包括四个核心概念: state: 管理整个应用程序的状态 …

    Vue 2023年5月28日
    00
  • vue select change事件如何传递自定义参数

    当Vue的select元素的值发生变化时,Vue会通过change事件自动触发对应的事件处理函数。如果我们希望在事件处理函数中传递一些自定义参数,就需要采用一些特殊的方式来实现。 以下是两种示例说明: 示例1 HTML代码 <select v-model="selected" @change="handleChange(‘…

    Vue 2023年5月28日
    00
  • Vue3中其他的Composition API详解

    当提到 Vue3 中新增的 Composition API 时,通常大家第一个想到的是 setup 函数。但实际上,除了 setup 函数,Vue3 中还有许多其他非常实用的 Composition API。在这个完整攻略中,我们将对这些 Composition API 进行详细的解释和示例说明。 ref 和 toRef ref 和 toRef 是 Vue3…

    Vue 2023年5月28日
    00
  • Spring boot + mybatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一)

    下面是详细的攻略。 Spring boot + MyBatis + Vue.js + ElementUI 实现数据的增删改查实例代码(一) 实现目标 本项目旨在演示如何使用 Spring boot + MyBatis + Vue.js + ElementUI 构建一个简单的增删改查系统。项目实现的功能包括: 显示数据列表 新增数据 删除数据 修改数据 筛选数…

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