使用 Vuex 保存用户状态

还记得我前面对比 React 时说过的话么?React 生态虽然丰富,但缺少官方指定库,所以质量参差不齐。Vue 在这方面做的比较好,官方有几个推荐产品组成全家桶。

虽然现在的改造东一榔头西一棒槌,但放长远来看,这套系统一定会整体迁移到 Vue,并且实现组件化。所以,为了能在组件间共享状态,我决定从现在开始就使用 Vuex。

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

如果你想了解 Vuex,建议去看官方文档,非常短小精悍,不超过1个小时你就能看完。

上一章里,我为老框架建立了一个接班人,准备逐步把工作交给它。接下来,我就会用 Vuex 构建一个全局数据中心,方便将来在系统内部存取数据。这次为了扩展考虑,我使用了 Vuex 的模块概念,即把不同的数据放在不同的模块里,方便管理。另外,从现在起,我会肆无忌惮地使用新技术,使用 Vue 开发的功能会通过 Webpack 打包到 JS 里(不包含原先的内容),加载到页面中。

// index.js
import Vue from 'vue';
import Vuex from 'vuex';
import { API } from 'config';
import user from './user/';
import mutations from './mutations';
import actions from './actions';

Vue.use(Vuex);

export default {
  state: {
    API: API,
    _token: '',
  },
  mutations,
  modules: {
    user
  }
};

// user.js
import mutations from './mutations';
export default {
  state: {
    id: 0,
    name: '',
    fullname: '',
    email: '',
    sidebar: null
  },
  mutations
}

然后回到入口 JS,在里面添加用户身份检查:

import base from './store/';

let store = new Vuex.Store(base);
let app = new Vue({
  el: 'body',
  store
});

let headers = new Headers();
headers.append('Accept', 'application/json');
fetch(API + 'login', {
  mode: 'cors',
  headers: headers,
  credentials: 'include'
})
  .then( response => {
    return [response.status, response.json()];
  })
  .then( (status, json) => {
    if (status === 401) {
      router.push('/login');
      return;
    }
    store.commit(UserMutations.SET_USER_INFO, json.user);
  })
  .catch( err => {
    router.push('/error/500');
  });

这里我用了 Fetch API,从服务器请求用户身份。如果服务器返回 401 错误,就说明用户没有登录,然后就通过路由跳转到登录界面;否则的话,把用户信息记入 store 完成操作。

results matching ""

    No results matching ""