加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Vue学习记录-状态管理

发布时间:2020-12-16 23:19:32 所属栏目:百科 来源:网络整理
导读:要解决的问题 平时的系统开发中,基本都会碰到这个权限问题,需要根据用户的登录状态进行处理。最常见的情况就是“先登录,后使用”。除去打包成APP,无法看到连接外,如果地址栏里直接输入地址就能绕过登录的话,那就忒不安全了。 方案1:自己做一个状态管

要解决的问题

平时的系统开发中,基本都会碰到这个权限问题,需要根据用户的登录状态进行处理。最常见的情况就是“先登录,后使用”。除去打包成APP,无法看到连接外,如果地址栏里直接输入地址就能绕过登录的话,那就忒不安全了。

方案1:自己做一个状态管理

具体的代码,我删掉了,所以这里只陈述一下过程

1. main.js里面,加一个var user = {didLogin:false},并在methods中添加一个方法changeUserAuth(isLogin){ user.didLogin = isLogin; };

2. main.js里面,添加路由beforeEach,通过判断user.didLogin,进行next()或者next({name:'login});

3. 子页面中如果要修改这个状态的话,通过方法进行修改,this.$root.changeUserAuth(true);

方案2:vuex

正规军的做法,就是vuex了,通过他统一对全局变量进行管理。说一下具体的用法

1. 安装

  npm i vuex --save

2. 创建store.js(/ProjectPaht/src/vuex/store.js),并定义types(/ProjectPaht/src/vuex/types.js)

/* store.js */import Vue from 'vue''vuex'import user from './modules/user' <span style="color: #008000">//<span style="color: #008000">用户
<span style="color: #000000">
Vue.use(Vuex)

export <span style="color: #0000ff">default <span style="color: #0000ff">new<span style="color: #000000"> Vuex.Store({
modules: {
user,}
})

/*  types.js  */

export const USER_INFO_UPDATE = 'USER_INFO_UPDATE';

3. 定义各个模块的数据(user.js)

import * as types from '../types'const USER_INFO = 'userInfo'<span style="color: #000000">;

const state =<span style="color: #000000"> {
<span style="color: #008000">//<span style="color: #008000"> 用户登录信息
userInfo: JSON.parse(localStorage.getItem(USER_INFO) || '{}'<span style="color: #000000">),}

const actions =<span style="color: #000000"> {
<span style="color: #008000">/<span style="color: #008000">

  • 用户登录
    <span style="color: #008000">/<span style="color: #000000">
    userLogin({commit},res) {
    localStorage.setItem(USER_INFO,JSON.stringify(res));
    commit(types.USER_INFO_UPDATE,res);
    },<span style="color: #008000">/
    <span style="color: #008000">*
  • 退出登录
    <span style="color: #008000">*/<span style="color: #000000">
    userLogout({commit}) {
    localStorage.removeItem(USER_INFO);
    commit(types.USER_INFO_UPDATE,{});
    },}

const getters =<span style="color: #000000"> {
userInfo: state =><span style="color: #000000"> state.userInfo,didLogin: state => state.userInfo.userid.length > 0<span style="color: #000000">,}

const mutations =<span style="color: #000000"> {
types.USER_INFO_UPDATE {
state.userInfo =<span style="color: #000000"> res
},}

export <span style="color: #0000ff">default<span style="color: #000000"> {
state,actions,getters,mutations
}

3. 更改store数据

页面跳转以后,就会执行到main.js的路由beforeEach中去了

'./router''./vuex/store''vuex'

<span style="color: #0000ff">new<span style="color: #000000"> Vue({
el: '#app'<span style="color: #000000">,router,store,template: ''<span style="color: #000000">,components: {
App,},computed: mapState({
userInfo: ({user}) => user.userInfo,<span style="color: #008000">//<span style="color: #008000">从user.js中获取信息用于判断是否登录
<span style="color: #000000"> }),methods: {
checkAuth: <span style="color: #0000ff">function<span style="color: #000000"> () {
let {userid = ''} = <span style="color: #0000ff">this<span style="color: #000000">.userInfo;
<span style="color: #0000ff">return userid.length > 0; <span style="color: #008000">//<span style="color: #008000">这里做的比较简单,只是通过userid进行的判断
<span style="color: #000000"> }
}
})

router.beforeEach((to,from,next) =><span style="color: #000000"> {
<span style="color: #008000">//<span style="color: #008000"> 如果不是登录页面
<span style="color: #0000ff">if (to.name != 'login'<span style="color: #000000">) {   <span style="color: #0000ff">if (!<span style="color: #000000">router.app.checkAuth()) {
next({name: 'login'<span style="color: #000000">});
<span style="color: #0000ff">return<span style="color: #000000">;
}
}
next();
});

最后理一下数据流向

1. 页面通过接口调用接口,完成账号验证;

2. 通过vuex修改store,这里具体起作用的是vuex/modules/user.js;

3. 进行页面跳转,会被router.beforeEach拦截,通过对store的判断,具体完成跳转(到登录、到下个页面)

因为之前用了Redux,所以vuex直接就用上了,没有任何难度。关于vuex的具体用法,还是参照一下官方文档吧 https://vuex.vuejs.org/

  

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读