Skip to content

Vuex 状态管理最佳实践

目录结构

text
store/
  ├── index.js        # 入口文件
  ├── state.js        # 状态定义
  ├── mutations.js    # 状态修改
  ├── actions.js      # 异步操作
  └── modules/        # 模块拆分
      ├── user.js
      └── cart.js

核心实现

javascript
// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import mutations from './mutations'
import actions from './actions'
import user from './modules/user'

Vue.use(Vuex)

export default new Vuex.Store({
    state,
    mutations,
    actions,
    modules: {
        user
    }
})

模块化使用

javascript
// store/modules/user.js
export default {
    namespaced: true, // 开启命名空间
    state: {
        token: ''
    },
    mutations: {
        setToken(state, token) {
            state.token = token
            uni.setStorageSync('token', token)
        }
    },
    actions: {
        login({commit}, userInfo) {
            return new Promise(resolve => {
                // 登录逻辑
                commit('setToken', 'xxx')
                resolve()
            })
        }
    }
}

在页面中使用

javascript
import {mapState, mapActions} from 'vuex'

export default {
    computed: {
        ...mapState('user', ['token'])
    },
    methods: {
        ...mapActions('user', ['login']),
        async handleLogin() {
            await this.login({username: 'test', password: '123'})
        }
    }
}

尘埃虽微,积之成集;问题虽小,记之为鉴。 雾中低语,心之所向;思绪飘渺,皆可成章。