深入理解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。

相关推荐
喜欢踢足球的老罗12 分钟前
一张跨域图的“四次换乘“:blob URL 与 Chrome 扩展架构里的工程艺术
前端·chrome·架构
程序员黑豆13 分钟前
AI全栈开发 - Java:基本数据类型 vs 引用数据类型的内存存储
java·前端·ai编程
FserSuN14 分钟前
Chrome CORS / PNA / LNA 问题排查与解决方案
前端·chrome
小小小小宇22 分钟前
Claude Code 自动运行方法大全
前端
道友可好24 分钟前
AI 测试全绿,代码却是错的
前端·人工智能·后端
国科安芯43 分钟前
商业航天通信载荷数字处理单元供电架构研究——基于ASP7A84AS的高精度低压差线性稳压器技术分析
前端·单片机·嵌入式硬件·fpga开发·架构·安全性测试
TangentDomain1 小时前
AI 写代码时代,游戏 UI 架构为什么停在 MVP?
前端·游戏·架构
英勇无比的消炎药1 小时前
前端提效神器全新AI组件库TinyRobot改写日常开发模式
前端·vue.js
GuWenyue1 小时前
10分钟搞定TodoList实战!从0搭建Bun+TS的RESTful接口服务
前端·typescript·bun