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日

相关文章

  • vue中实现上传文件给后台实例详解

    针对“vue中实现上传文件给后台的实例详解”,我的回答将分为以下几个部分说明: 概述 前端实现步骤 后端实现步骤 示例说明1 示例说明2 1. 概述 Vue是一种现代化的JavaScript框架,它能够帮助我们快速构建交互式界面。在许多Web应用程序中,我们需要允许用户上传文件到我们的服务器。尽管Vue本身并不提供文件上传功能,但通过结合一些其他的JavaS…

    Vue 2023年5月28日
    00
  • 在vue中使用inheritAttrs实现组件的扩展性介绍

    在Vue组件的开发中,有时候我们需要在父组件中定义一些prop传递给子组件,但同时也会传递一些不需要的属性,这时候就可以使用inheritAttrs来实现组件的扩展性。下面我将为大家详细讲解“在Vue中使用inheritAttrs实现组件的扩展性介绍”的完整攻略,希望能对大家的Vue组件开发有所帮助。 inheritAttrs介绍 在Vue中,inherit…

    Vue 2023年5月29日
    00
  • 理解Vue2.x和Vue3.x自定义指令用法及钩子函数原理

    下面详细讲解“理解Vue2.x和Vue3.x自定义指令用法及钩子函数原理”的完整攻略。自定义指令是Vue框架中提供的一种高级功能,可以用于改变DOM元素的行为,例如为元素添加过渡效果、鼠标经过时高亮等。vue2.x和vue3.x中自定义指令的实现方式有所不同,下面分别介绍。 Vue2.x自定义指令 自定义指令定义方法 在Vue2.x中,我们可以使用Vue.d…

    Vue 2023年5月28日
    00
  • Vue.js 表单校验插件

    Vue.js表单校验插件简介Vue.js表单校验插件是一款常用于Vue.js的插件,可以帮助开发者轻松地在Vue.js应用程序中实现表单校验功能。该插件提供了丰富的校验规则和语法,可以非常方便地满足各种表单校验需求。 安装Vue.js表单校验插件在使用Vue.js表单校验插件前,需要先安装并引入该插件。可以通过npm安装和引入该插件。示例代码如下: # 安装…

    Vue 2023年5月27日
    00
  • Vue的方法和属性案例详解

    非常感谢您对我的提问,下面是“Vue的方法和属性案例详解”的完整攻略。在这篇攻略中,我将分为以下几个部分来讲解: Vue实例的方法和属性介绍 Vue实例的方法和属性示例说明 Vue组件的方法和属性介绍 Vue组件的方法和属性示例说明 1. Vue实例的方法和属性介绍 在Vue中,每个Vue实例都具有一些可用的方法和属性。下面是一些常用的Vue实例属性: $e…

    Vue 2023年5月27日
    00
  • vue2.0$nextTick监听数据渲染完成之后的回调函数方法

    Vue.js 2.0中提供了 $nextTick 方法来在 DOM 更新完成之后执行回调函数。这个方法可以用来解决在特定情况下数据渲染后无法获取到更新后的DOM元素的问题。 方法原理 在 Vue.js 中,数据渲染是异步的。当我们修改了数据后,Vue.js 会在下一个 tick 中更新实例,更新完成后才会执行回调函数。$nextTick 方法就是用来等待数据…

    Vue 2023年5月28日
    00
  • Vue路由重复点击报错问题及解决

    Vue路由重复点击报错问题及解决 问题描述 在使用Vue开发中,遇到路由跳转时,有可能出现以下问题: 多次快速点击同一路由会报错。 从当前路由返回到上一路由,再点击返回到当前路由时会报错。 错误通常如下: NavigationDuplicated{_name: "NavigationDuplicated"} 问题原因 出现该错误,是因为V…

    Vue 2023年5月28日
    00
  • Vant 中的Toast设置全局的延迟时间操作

    下面我为您讲解如何在 Vant 中设置全局的 Toast 延迟时间。 首先,让我们看一下 Vant 中 Toast 组件的默认配置: const defaultOptions = { type: ‘text’, mask: false, message: ”, duration: 3000, className: ”, iconClass: ”, on…

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