深入理解Vuex:构建更强大的Vue.js应用程序

VueX的基本介绍

当您构建大型的Vue.js应用程序时,状态管理变得至关重要。Vuex是Vue.js官方提供的状态管理库,它允许您在应用程序中集中管理状态,并提供了一种可预测的状态管理方案。以下是一些关于Vuex的相关信息:

  1. 核心概念:Vuex包括几个核心概念,如state(状态)、getters(获取器)、mutations(变化)和actions(动作)。这些概念共同组成了Vuex的状态管理机制,使得状态的变化变得可预测和可控。
  2. 单一数据源:在Vuex中,应用的状态被存储在单一的数据源中,这使得状态的变化变得更加可追踪和管理。通过严格的状态管理,可以避免在应用程序中出现难以追踪的bug。
  3. 数据流:Vuex遵循严格的数据流规则,所有的状态变化都需要通过特定的方式来触发和处理。这种数据流的规范性使得应用程序的状态变化更加可控,也更容易调试和维护。
  4. 插件和工具:Vuex提供了丰富的插件和开发工具,帮助开发者更好地管理和调试应用程序的状态。例如,Vue DevTools可以帮助您实时追踪和调试Vuex状态的变化。
  5. 适用场景:Vuex特别适用于大型的、复杂的Vue.js应用程序,对于简单的应用程序可能会显得过于繁琐。在需要管理大量状态和实现复杂数据流的场景下,Vuex能够发挥其强大的作用。

VueX 的核心概念

State(状态)

State即应用程序中需要管理的状态,可以理解为存储数据的地方。在Vuex中,所有的状态都被存储在单一的数据源中,即store。这样做的好处是可以方便地跟踪状态的变化,以及在需要时进行调试和监控。

Getters(获取器) Getters可以理解为store的计算属性,它们的作用是从state中派生出一些状态,类似于Vue组件中的计算属性。通过getters,我们可以对state进行一些复杂的计算或筛选,然后在组件中使用这些派生出的状态。

Mutations(变化)

Mutations是唯一允许修改state的地方。每个mutation都有一个字符串类型的事件类型(type)和一个回调函数,回调函数接受state作为第一个参数。在mutation中,我们可以对state进行同步的修改操作。

Actions(动作)

Actions类似于mutations,不同之处在于actions可以包含异步操作。通过actions,我们可以提交mutation来间接地对state进行修改。这样做的好处是可以将一些异步操作放在actions中,使得我们的代码更加清晰和易于维护。

Modules(模块)

当应用变得非常复杂时,单一的store可能会变得难以维护。Vuex允许我们将store分割成模块(module),每个模块拥有自己的state、getters、mutations和actions。这样做的好处是可以更好地组织代码,使得应用的状态管理更加清晰和可维护。

VueX 的基本使用

用法

安装Vuex

首先,您需要通过npm或yarn安装Vuex:

csharp 复制代码
npm install vuex
# 或
yarn add vuex

1. 在 src 下创建 store 目录, 并添加 index.js 文件

js 复制代码
    // 从vuex 中引入 createStore
    import { createStore } from "vuex";

    // 创建一个新的 store 实例
    const store = createStore({
        // state 是一个方法,存放状态的地方
        state() {
            // return的就是当前的状态
            return {
                num: 0,
            };
        },

        // 同步修改state
        mutations: {
            /**
             * 接收的第一个参数是当前的state
             * 第二个参数是传过来的参数
             */
            add(state, name) {
                console.log(name);
                state.num++;
            },
        },
        actions: {
            /**
             * 第一个参数是context 也就是当前上下文
             * 比如可以直接获取state、使用 commit 调用等
             *
             * 第二个参数是页面传过来的参数
             */
            asyncAdd(context, name) {
                console.log(name);
                /**
                 * 使用 commit 调用 mutations 里面的方法改变数据
                 * 第一个参数是方法名
                 * 第二个是要传的参数
                 */
                context.commit("add", name);
            },
        },
    });

    export default store;
2. 在入口文件引入, 并通过 use 挂载
js 复制代码
    import { createApp } from "vue";
    import router from "./router";
    import vuex from "./store";

    createApp(LearnRouter)
        // 使用use 方法 把我们路由挂载到vue上
        .use(router)
        // 使用 use 把vuex挂载到实例上
        .use(vuex)
        .mount("#app");

通过以上的步骤,您就可以在Vue应用程序中使用Vuex来管理状态了。当您需要在组件中使用state、getters、mutations或actions时,可以通过this.$store来访问store中的内容。

3.在页面使用

js 复制代码
    <template>
        <h2>App组件</h2>
        <h1>通过 $store.state.数据 的方式</h1>
        <h2>{{ $store.state.num }}</h2>
    </template>

    <script>
    import { mapState } from 'vuex'
        export default {
            data() {
                return {

                }
            }
        }
    </script>

通过 辅助函数 使变量方便使用

在需要使用变量的页面从vuex导入mapState

js 复制代码
    import { mapState } from 'vuex'
    
    //在computed 里 使用
    componted: {
        ...mspState(['数据1','数据2','数据3'])
    }

修改数据

在 引入 vuex 的文件内 书写

js 复制代码
    import { createStore } from 'vuex'

    const store = createStore({
        state() {
            return {
                num: 10086,
                num2: 10010,
                num3: 176125,
            }
        },
        // 当前选项内存储 vuex 内唯一的 修改 state 内数据的方法
        mutations: {
            addNum(state, data) {
                // 第一个形参: 就是当前的state 选项
                // 第二个形参: 外界调用 addNum 的时候,传递的值
                state.num++
            }
        }
    })

    export default store

在使用方法的文件内调用

js 复制代码
    <template>
        <h2>App组件</h2>
        <h1>通过 $store.state.数据 的方式</h1>
        <h2>{{ $store.state.num }}</h2>

        <h1>通过 辅助函数 的方式</h1>
        <h2>{{ num }}</h2>
        <button @click="NumAdd">点击修改 num 的值</button>
    </template>

    <script>
    import { mapState } from 'vuex'
        export default {
            data() {
                return {

                }
            },
            methods: {
                NumAdd() {
                    // 拿到 方法,当触发 NumAdd 时, 触发 传递过来的 addNum 方法
                    this.$store.commit('addNum')
                }
            },
            computed: {
                ...mapState(['num','num2','num3'])
            }
        }
    </script>

actions 选项

js 复制代码
    // 当前选项类似于 mutations 中的方法
    // 内部 主要存储对于异步方法的处理
    // 调用 mutations 中, 修改 state 的数据
    actions: {
        asyncAddNum(context, data) {
            // 当前的两个参数
                // context: 上下文,可以利用第一个形参获取 state 中的数据 或者 
                调用 mutations 中的方法
                // data: 外界调用当前方法传递的参数
            setTimeout(() => {
                context.commit('addNum')
            },1000)
        }
    }
    
    
    //在要用到该方法的文件中 
    import { mapActions } from 'vuex'
    
    // methods 里 解构
    ...mapActions(['asyncAddNum'])
    
    // 在触发 事件时 直接调用
     Num3Add() {
         this.asyncAddNum()
     }

getter 选项

js 复制代码
    // 在 引入 vuex 的地方 创建 getters 选项
    import { createStore } from 'vuex'

    const store = createStore({
        state() {
            return {
                num: 10086,
                num2: 10010,
                num3: 176125,
                name: '张三'
            }
        },
        getters: {
            getterName (state) {
                return state.name
            }
        }

    })

    export default store
    
    <template>
        <h1>App组件</h1>
        <!-- 通过 $store.getters.属性名 获取 -->
        <h2>{{ $store.getters.getterName }}</h2>
        <!-- 通过 mapGetters 解构 进来数据 -->
        <h2> {{ getterName }} </h2>
    </template>

    <script>
    import { mapGetters } from 'vuex'
    export default {

        computed: {
            ...mapGetters(['getterName'])
        }

    }
    </script>

modules 选项

新建一个文件分割数据 stu.js

js 复制代码
    export default {
    state() {
        return {
            name: '李四',
            age: '18'
        }
    }

}

在 store的 index.js 文件内 引入 stu.js 并且注册 stu

js 复制代码
    import { createStore } from 'vuex'

    import stu from './stu'
    const store = createStore({
        state() {
            return {
                num: 10086,
                num2: 10010,
                num3: 176125,
                name: '张三'
            }
        },
        modules: {
            stu
        }

    })

    export default store

在使用界面直接用 $store.state.stu.属性名

js 复制代码
    <template>
        <h1>App组件</h1>
        <h2>{{ $store.state.stu.name }}</h2>
        <h2>{{ $store.state.stu.age }}</h2>
    </template>

    <script>
    import { mapGetters } from 'vuex'
    export default {

        computed: {
            ...mapGetters(['getterName'])
        }

    }
    </script>

总的来说,Vuex为大型的、复杂的Vue.js应用程序提供了一种强大的状态管理方案,通过严格的数据流规则和一些核心概念,使得状态管理变得更加可控和可预测。希望以上的讲解能够帮助您更好地理解和使用Vuex。

相关推荐
bysking17 分钟前
【前端-组件】定义行分组的表格表单实现-bysking
前端·react.js
王哲晓33 分钟前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
fg_41136 分钟前
无网络安装ionic和运行
前端·npm
理想不理想v37 分钟前
‌Vue 3相比Vue 2的主要改进‌?
前端·javascript·vue.js·面试
酷酷的阿云1 小时前
不用ECharts!从0到1徒手撸一个Vue3柱状图
前端·javascript·vue.js
微信:137971205871 小时前
web端手机录音
前端
齐 飞1 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
神仙别闹1 小时前
基于tensorflow和flask的本地图片库web图片搜索引擎
前端·flask·tensorflow
GIS程序媛—椰子2 小时前
【Vue 全家桶】7、Vue UI组件库(更新中)
前端·vue.js
DogEgg_0012 小时前
前端八股文(一)HTML 持续更新中。。。
前端·html