全局状态管理统一使用 vuex ,相关代码统一放置在 store 目录中。
状态管理代码按照业务模块划分,每个模块在 store/modules 中创建一个文件,在 store/index.js 引入并整合各个模块。

模块代码示例

  1. import {
  2. login,
  3. encryptPwd
  4. } from '@/api/user.js'
  5. import config from "@/config/index.json"
  6. const TOKEN_KEY = 'token'
  7. const USER_INFO_KEY = 'user-info'
  8. export default {
  9. namespaced: true,
  10. state: () => {
  11. return {
  12. token: uni.getStorageSync(TOKEN_KEY) || '',
  13. userInfo: uni.getStorageSync(USER_INFO_KEY) || {},
  14. clientId: config.clientId,
  15. clientSecrt: config.clientSecrt
  16. }
  17. },
  18. mutations: {
  19. setToken(state, token) {
  20. state.token = token
  21. this.commit('user/saveToToken')
  22. },
  23. setUserInfo(state, userInfo) {
  24. state.userInfo = userInfo
  25. this.commit('user/saveToUserInfo')
  26. },
  27. saveToToken(state) {
  28. uni.setStorage({
  29. key: TOKEN_KEY,
  30. data: state.token
  31. })
  32. },
  33. saveToUserInfo(state) {
  34. uni.setStorage({
  35. key: USER_INFO_KEY,
  36. data: state.userInfo
  37. })
  38. },
  39. removeToken(state) {
  40. state.token = ''
  41. this.commit('user/saveToToken')
  42. },
  43. removeUserInfo(state) {
  44. state.userInfo = {}
  45. this.commit('user/saveToUserInfo')
  46. }
  47. },
  48. actions: {
  49. async login(context, userInfo) {
  50. const {
  51. data
  52. } = await encryptPwd({
  53. password: userInfo.password
  54. })
  55. const {
  56. data: res
  57. } = await login({
  58. clientId: context.state.clientId,
  59. clientSecrt: context.state.clientSecrt,
  60. username: userInfo.username,
  61. password: data.password
  62. })
  63. this.commit('user/setToken', res.token)
  64. this.commit('user/setUserInfo', res.userDto)
  65. uni.reLaunch({
  66. url: "/pages/work/work"
  67. })
  68. },
  69. logout(context) {
  70. this.commit('user/removeToken')
  71. this.commit('user/removeUserInfo')
  72. }
  73. }
  74. }

模块导入示例

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. import user from './modules/user.js'
  4. Vue.use(Vuex)
  5. const store = new Vuex.Store({
  6. modules: {
  7. user,
  8. }
  9. })
  10. export default store

在业务组件中使用全局状态代码示例

  1. import { mapActions, mapState } from 'vuex';
  2. methods: {
  3. ...mapActions('user', ['login']),
  4. submit() {
  5. this.login({
  6. username: this.username,
  7. password: this.password
  8. })
  9. console.log('登录成功');
  10. }
  11. }