在小白开发的项目中前端使用的是Vue,虽然在日常工作中可以使用Vue进行开发工作。但是没有系统的学习过Vue,对Vue的一些特性和方法使用时常常需要查询资料解决问题,查询资料常常会占用大量时间,尤其对Vuex的使用。虽然可以通过很多Vue框架中带有的Vuex框架直接使用,但是用的越多,小白就会觉得越混乱、越不明白,只知其用不知其意。于是小白决定系统学习一下Vuex,来补充一下Vue知识。

1.Vuex是什么?

Vuex是一个用于Vue.js应用程序的状态管理模式。它可以集中管理Vue应用程序中的所有组件的状态,并提供了一种机制来保持状态的一致性和可追踪性。

2.Vuex中有哪些对象?

一个Vuex模块中通常包含以下五个对象:namespaced、state、mutations、actions 和 getters。这些对象分别用于定义模块的命名空间、状态、变更操作、异步操作和计算属性。

除了这五个对象,还有一些其他可选的对象可以在模块中使用:

  1. modules:如果你的模块需要进一步细分为子模块,可以使用 modules 对象来组织和嵌套这些子模块。
  2. plugins:你可以使用 plugins 数组来安装Vuex插件,这些插件可以监听活修改状态的变化。
  3. actions的辅助对象:在 actions 中,你可以定义 rootrootStatecommitdispatch 等参数,来访问根模块的状态和调用根模块的 mutationsactions
  4. mutations的辅助对象:在 mutations 中,你可以定义 rootState 参数,来访问根模块的状态。
  plugins: [
    // ...
  ],

  actions: {
    someAction({ rootState, commit, dispatch }) {
      // ...
    },
  },

  mutations: {
    someMutation(state, { rootState }) {
      // ...
    },
  },

3.从定义层面使用Vuex

  1. 安装Vuex:使用npm或yarn安装Vuex。
  2. 创建一个state:在你的Vue应用程序中创建一个 store 文件夹,并在其中创建一个 store.js 文件。
  3. 定义状态(State):在 store.js 文件中,定义一个包含需要共享的状态的对象。
  4. 定义mutations:在 store.js 文件中,定义一系列用于修改状态的mutations函数。每个mutation函数接收一个state对象作为参数,并根据需要修改状态。
  5. 定义actions:在 store.js 文件中,定义一系列用于处理异步操作的actions函数。每个action函数可以调用一个或多个mutations函数来修改状态。
  6. 定义getters:在 store.js 文件中,定义一系列用于获取state对象的“getters普通对象形式”或用于获取state的计算属性“getters函数”,可以通过“getters”来定义state状态的衍生值或计算属性并获取。getters不是必须的。
  7. 注册store:在你的Vue应用程序的入口文件(main.js)中,导入 store.js 并使用Vue.use()方法注册Vuex。
  8. 在组件中使用状态:使用 this.$store.state 来访问状态,使用 this.$store.commit() 来调用mutations,使用 this.$store.dispatch() 来调用actions。
  9. 示例如下:

store.js

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
    state: {
      count: 0
    },
    mutations: {
      increment(state) {
        state.count++;    
      },
      decrement(state) {
        state.count--;
      },
      incrementByParam(state, amount) {
        state.count += amount;
      },
      decrementByParam(state, amount) {
        state.count -= amount;
      }
    },
    actions: {
      increment(context) {
        context.commit('increment');
      },
      incrementAsync(context) {
        setTimeout(() => {
          context.commit('increment');
        }, 1000);
      },
      decrement(context) {
        context.commit('decrement');
      }
    },
    getters: {
      // 对象形式的getters,允许以属性的方式访问计算后的值,而无需调用函数
      getCount: state => state.count,
      // 函数形式的getters,可以接受额外的参数,并根据传入的参数进行计算返回结果
      getCountByParam: (state) => (num) => {
        return state.count + num;
      }
    }
})

main.js

 import store from "xxxxx/store";

new Vue({
  store,
  // ...其他Vue应用程序的配置...
}).$mount('#app');

4.项目中使用时,为了项目的扩展性,通常使用Vuex模块来分割和组织状态,如果使用了模块分割需要注意模块命名空间。下面是使用模块的初级示例,其中getters演示了命名空间的使用。

5.真实的项目我们可能需要多个modules,并且每个modules中getters、mutations、actions 和 state 通常会变得非常大,所以它们也需要用单个文件分割。

下面用moduleCart作为示例来演示一个Vuex模块中五个对象的分割: namespaced,state,mutations,actions 和 getters。创建一个文件夹名为cart,在文件夹中创建五个文件分别为moduleCart.js、moduleCartActions.js、moduleCartGetters.js、moduleCartMutations.js和moduleCartState.js

以上就是小白用心整理的Vuex的内容,通过整理小白对Vuex有了更多的了解,之前小白不理解不明白的地方明,现在明白了。小白会在编码的路上继续努力、继续加油!

08-27 07:10