Vuex Module 模块化使用

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块

src
 ├── store
 │   ├── modules
 │   │   ├── user.js
 │   │   └── login.js
 │   ├── getters.js
 │   └── index.js
 └── main.js

main.js 使用store  import store from "./store";

/*
 * Copyright © 2020 LiuDanYang. All rights Reserved.
 */

import Vue from "vue";
import App from "./App";
import store from "./store";
import router from "./router";

Vue.config.productionTip = false;

new Vue({
  el: "#app",
  router,
  store,
  render: (h) => h(App),
});

 index.js

/*
 * Copyright © 2020 LiuDanYang. All rights Reserved.
 */

import Vue from "vue";
import Vuex from "vuex";
import getters from "./getters";

import user from './modules/user';
import login from './modules/login';

Vue.use(Vuex);

const store = new Vuex.Store({
  modules: {
    user,
    login,
  },
  getters,
});

export default store;

getters.js

/*
 * Copyright © 2020 LiuDanYang. All rights Reserved.
 */

const getters = {
  users: (state) => state.user.users,
  token: (state) => state.login.token,
};
export default getters;

user.js  (示例中使用的接口请根据项目实际情况使用)

/*
 * Copyright © 2020 LiuDanYang. All rights Reserved.
 */

import { getUserInfo } from "@i/user";

const state = {
  users: {},
};

const mutations = {
  SET_USERS: (state, data) => {
    state.users = data;
  },
};

const actions = {
  /**
   * 获取用户信息
   * @param commit
   * @returns {Promise<unknown>}
   */
  getUserInfo({ commit }) {
    return new Promise((resolve, reject) => {
      getUserInfo().then((res) => {
        const { status, data } = res;
        if (status === "1") {
          commit("SET_USERS", data);
          resolve(data);
        } else {
          reject(res);
        }
      });
    });
  },
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};

login.js  (示例中使用的接口请根据项目实际情况使用)

/*
 * Copyright © 2020 LiuDanYang. All rights Reserved.
 */

import { getLogin } from "@i/user";
import { getToken, setToken } from "@u/auth";

const state = {
  token: getToken(),
};

const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token;
  },
};

const actions = {
  /**
   * 用户登录
   * @param commit
   * @param data
   * @returns {Promise<unknown>}
   */
  getLogin({ commit }, data) {
    const { username, password} = data;
    return new Promise((resolve, reject) => {
      getLogin({
        phonenumber: username.trim(),
        password: password,
      })
        .then((res) => {
          const { status, data } = res;
          if (status === "1") {
            commit("SET_TOKEN", data.token);
            setToken(data.token);
            resolve(res);
          } else {
            reject(res);
          }
        })
        .catch((res) => {
          reject(res);
        });
 
    });
  },
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};

页面使用示例

<!--
  - Copyright © 2020 LiuDanYang. All rights Reserved.
  -->

<template>
  <div>{{ users.name }}</div>
</template>

<script>
import { mapGetters } from "vuex";

export default {
  components: {},
  computed: {
    ...mapGetters(["users"]),
  },
  created() {
    this.getUserInfo();
  },
  methods: {
    getUserInfo(){
      this.$store.dispatch("user/getUserInfo");
    }
  },
};
</script>

<style lang="scss" scoped></style>

Vuex Module 使用其他模块属性值和方法

参考文档:Module

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱宇阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值