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

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日

相关文章

  • vue-tree-chart树形组件的实现(含鼠标右击事件)

    树形组件介绍 vue-tree-chart是基于Vue实现的树形组件,其可以用于呈现大量的数据,并支持鼠标右键事件。该组件支持多级嵌套的树形结构,可以轻松地呈现层级数据,拥有流畅的展开和折叠操作,同时支持自定义节点的样式、连接线等。下面将介绍如何实现该组件。 实现步骤 首先在Vue项目中安装vue-tree-chart组件: npm install vue-…

    Vue 2023年5月28日
    00
  • Vue data的数据响应式到底是如何实现的

    那么让我们来详细讲解一下Vue data的数据响应式实现的攻略。 什么是Vue数据响应式? Vue框架的核心功能之一就是数据响应式。所谓数据响应式,是指当Vue中的某个数据发生变化时,框架可以自动更新依赖这个数据的视图。 Vue数据响应式的实现原理 Vue数据响应式的实现原理主要包括两部分: Object.defineProperty Vue数据响应式是通过…

    Vue 2023年5月27日
    00
  • Vue如何防止按钮重复点击方案详解

    作为Vue的作者,我来为大家介绍一下Vue如何防止按钮重复点击方案详解。我们知道,当用户不断点击某个按钮时,容易产生多个相同的请求并导致不必要的数据冗余。因此, Vue提供了多种方法防止按钮重复点击,可以有效避免这些不必要的问题。 方案一:防抖函数 防抖函数是一种比较常见的方法,我们可以使用lodash库中的 _.debounce函数实现。防抖函数的原理是在…

    Vue 2023年5月28日
    00
  • 详解vue2.0的Element UI的表格table列时间戳格式化

    下面是详解vue2.0的Element UI的表格table列时间戳格式化的完整攻略。 1. 前言 Element UI是一款基于Vue.js 2.0的框架,它提供了丰富、灵活、高效的前端组件,其中表格(table)组件是应用非常广泛的一个组件,但是默认情况下,它的时间戳列(指Unix时间戳)显示的是毫秒数,不太友好。那么,我们该如何对Element UI的…

    Vue 2023年5月29日
    00
  • 理解Proxy及使用Proxy实现vue数据双向绑定操作

    理解 Proxy 在 JavaScript 中,对象是一种引用类型,对象的属性只是指向变量的一个指针。因为这个特性,我们可以获得代理模式的能力:在对象创建之后,可以创建一个代理来控制对象的访问或操作。 Proxy 对象用于定义基本操作的自定义行为(如属性查找,赋值,枚举,函数调用等)。这样,我们可以在读取或修改对象属性时插入其他逻辑,例如数据绑定。 在使用 …

    Vue 2023年5月28日
    00
  • 15分钟上手vue3.0(小结)

    15分钟上手vue3.0(小结) 介绍 Vue.js 3.0 是一个轻量级的框架,易于学习和使用。它具有高效、灵活、高度可定制性等优点,而且我们可以通过官方文档、社区论坛等方式快速掌握其使用方法。 本文将带领大家了解并上手 Vue.js 3.0。 安装 Vue.js 3.0 在开始使用 Vue.js 3.0 之前,我们需要先安装它。我们可以通过以下方式进行安…

    Vue 2023年5月28日
    00
  • vue.js获取数据库数据实例代码

    以下是详细讲解“vue.js获取数据库数据实例代码”的完整攻略: 1. 使用Axios获取数据库数据的示例 在vue.js中使用Axios获取数据库数据是比较常见的方法。以下是代码示例: <template> <div> <!– 数据列表展示 –> <table> <thead> <tr&…

    Vue 2023年5月28日
    00
  • ant design vue嵌套表格及表格内部编辑的用法说明

    Ant Design Vue 是一个基于 Vue.js 的 UI 组件库,是蚂蚁金服开源的一款 UI 组件库,主要目的是为开发人员提供高质量的企业级 UI 组件,支持 react、vue 以及 angular 三个框架。Ant Design Vue 组件库包含众多组件,如按钮、输入框、表格、弹窗、菜单等,最为优秀的一个组件就是表格。在表格中,Ant Desi…

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