Vuex 的状态管理 ——Module

阅读时长 6 分钟读完

前言

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态的一致性,方便简洁地管理组件之间的通信。在 Vuex 中,我们会常常听到「State」、「Mutation」、「Action」和「Module」这些概念,其中 Module 则是本文所要讨论的主题。

Module 是什么

Module,中文翻译为“模块”,是 Vuex 中的一个重要且强大的概念。它用于管理 Store 中的子模块,并提供了更为优雅的状态管理方案。

在我们使用 Vuex 进行状态管理的过程中,为了保证代码的可维护性和可拓展性,我们往往需要将 Store 拆分成多个子模块。这时候我们就可以使用 Module 这个概念来组织我们的状态管理。

Module 的组成

一个 Module 可以包含:state、mutations、getters 和 actions。而这些组成部分,在该模块下是完全独立的,不会与其他模块产生任何冲突。

state

state 主要用于存储数据,即所有数据的源头。我们可以通过在 store 对象中定义 state 模块,来生成一个 state。

-- -------------------- ---- -------
----- ----- - --- ------------
    -------- -
        ----- -
            ------ -
                ------------ -----
                -------- -----
            -
        -
    -
--

可以看到,我们在 Modules 中定义了 user 模块,并在该模块下定义了 currentUser 和 isLogin 两个变量。

mutations

mutations 可以看做是一个用于修改 state 的函数方法,用来进行同步的状态更改。

-- -------------------- ---- -------
    ----- ----- - --- ------------
        -------- -
            ----- -
                ------ -
                    ------------ -----
                    -------- -----
                --
                ---------- -
                    ----------------------- ----- -
                        ----------------- - ----
                        ------------- - ----
                    -
                -
            -
        -
    --

在 user 模块中,我们定义了 SET_CURRENT_USER 方法,这个方法会通过参数 user 来更新 state 中的 currentUser 和 isLogin,这样我们就可以在其他组件中通过 $store.state.user.currentUser 来访问当前用户的信息。

getters

getters 可以被看作是 Store 的计算属性,用于根据存储到 state 中的数据,生成新的数据。

-- -------------------- ---- -------
----- ----- - --- ------------
    -------- -
        ----- -
            ------ -
                ------------ -----
                -------- -----
            --
            ---------- -
                ----------------------- ----- -
                    ----------------- - ----
                    ------------- - ----
                -
            --
            -------- -
                ------------ ------- -- -
                    ------ ------------------------------- ------------------------------
                -
            -
        -
    -
--

在这个示例中,我们定义了一个 getFullName 方法,它根据 currentUser 中的 firstName 和 lastName 来合并成 fullName,并返回。

actions

来自 Vue 官网的解释:Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态。
  • Action 可以包含任意异步操作。

简单来说,我们可以把 actions 当做是对 mutations 的再次封装,使我们的代码更容易维护和升级。

-- -------------------- ---- -------
----- ----- - --- ------------
    -------- -
        ----- -
            ------ -
                ------------ -----
                -------- -----
            --
            ---------- -
                ----------------------- ----- -
                    ----------------- - ----
                    ------------- - ----
                -
            --
            -------- -
                ------------ ------- -- -
                    ------ ------------------------------- ------------------------------
                -
            --
            -------- -
                -------------------------- -
                    ------ ------------------------------------ -- -
                        -------------------------- --------------
                    --
                -
            -
        -
    -
--

在这个 示例中,我们增加了 fetchCurrentUser 方法。它通过在 axios 中发起一个异步请求来获取当前用户信息。如果请求成功,就会通过 mutations 中的 SET_CURRENT_USER 方法来更新 state。而这些同步的数据操作,使得我们的组件更加健壮和简单。

总结

通过 Module 我们可以方便的将大的 Store 拆分成多个子模块,大大提高了代码的可维护性和可读性。在使用 Module 的过程中,我们需要注意不同模块之间的命名空间问题,避免数据产生冲突。同时,我们也可以在一个模块上增加其它模块的引用来实现模块复用,从而进一步提高代码的可用性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645ee2fb968c7c53b010f7a9

纠错
反馈