要解决的问题

平时的系统开发中,基本都会碰到这个权限问题,需要根据用户的登录状态进行处理。最常见的情况就是“先登录,后使用”。除去打包成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'
import Vuex from 'vuex' import user from './modules/user' //用户 Vue.use(Vuex) export default new 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';

const state = {
// 用户登录信息
userInfo: JSON.parse(localStorage.getItem(USER_INFO) || '{}'),
} const actions = {
/**
* 用户登录
*/
userLogin({commit}, res) {
localStorage.setItem(USER_INFO, JSON.stringify(res));
commit(types.USER_INFO_UPDATE, res);
}, /**
* 退出登录
*/
userLogout({commit}) {
localStorage.removeItem(USER_INFO);
commit(types.USER_INFO_UPDATE, {});
},
} const getters = {
userInfo: state => state.userInfo,
didLogin: state => state.userInfo.userid.length > 0,
} const mutations = {
[types.USER_INFO_UPDATE](state, res) {
state.userInfo = res
},
} export default {
state,
actions,
getters,
mutations
}

3. 更改store数据

<script>
...
import {mapActions} from 'vuex'; export default {
...
methods: {
...mapActions({
userLogin: 'userLogin', //vues/modules/user.js中定义的方法
userLogout: 'userLogout'
}),
// 登录
onPressLogin: function () {
let param = {
username: this.username,
password: this.password,
}
api.POST('api/account/login', param).then(data=> {
let user = {userid:'wzf'}; //data.data; // 更新state
this.userLogin(user); // 页面跳转
this.$router.push({name: 'home'});
});
}
}
}
</script>

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

...
import router from './router'
import store from './vuex/store'
import {mapState} from 'vuex' new Vue({
el: '#app',
router,
store,
template: '<App/>',
components: {
App,
},
computed: mapState({
userInfo: ({user}) => user.userInfo, //从user.js中获取信息用于判断是否登录
}),
methods: {
checkAuth: function () {
let {userid = ''} = this.userInfo;
return userid.length > 0; //这里做的比较简单,只是通过userid进行的判断
}
}
}) router.beforeEach((to, from, next) => {
// 如果不是登录页面
if (to.name != 'login') {
   if (!router.app.checkAuth()) {
next({name: 'login'});
return;
}
}
next();
});

最后理一下数据流向

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

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

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

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

  

Vue学习记录-状态管理的更多相关文章

  1. 【Vue】Vue学习(四)-状态管理中心Vuex的简单使用

    一.vuex的简介 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.Vuex背后的基本思想,就是前面所说的单向数据流.图4就是Vuex实现单向数据流的示意图.    Store     ...

  2. Vue学习记录第一篇——Vue入门基础

    前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...

  3. vue项目--vuex状态管理器

    本文取之官网和其他文章结合自己的理解用简单化的语言表达.用于自己的笔记记录,也希望能帮到其他小伙伴理解,学习更多的前端知识. Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态 ...

  4. vue总结 08状态管理vuex

      状态管理 类 Flux 状态管理的官方实现 由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue 提供 vuex:我们有受到 Elm 启发的状态管 ...

  5. 前端Vue框架-vuex状态管理详解

    新人报道!多多关照-多提宝贵意见 谢谢- vuex理解 采用集中式存储管理模式.用来管理组件的状态,并以自定义规则去观测实时监听值得变化. 状态模式管理理解 属性 理解 state 驱动应用的数据源 ...

  6. vue的store状态管理模式

    var store = { debug: true, state: { message: 'Hello!' }, setMessageAction (newValue) { //所有 store 中 ...

  7. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...

  8. vue学习记录

    vue中常用的指令 v-model 双向数据绑定,一般用于表单元素 v-for 对数组或对象进行循环操作,使用的是v-for <!-- 普通循环 --><li v-for=" ...

  9. 应用四:Vue之VUEX状态管理

    (注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 概念:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应 ...

随机推荐

  1. 利用gcc的__attribute__编译属性section子项构建初始化函数表【转】

    转自:https://my.oschina.net/u/180497/blog/177206 gcc的__attribute__编译属性有很多子项,用于改变作用对象的特性.这里讨论section子项的 ...

  2. linux内核数据结构之链表【转】

    转自:http://www.cnblogs.com/Anker/p/3475643.html 1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结 ...

  3. 宋牧春: Linux设备树文件结构与解析深度分析(2) 【转】

    转自:https://mp.weixin.qq.com/s/WPZSElF3OQPMGqdoldm07A 作者简介 宋牧春,linux内核爱好者,喜欢阅读各种开源代码(uboot.linux.ucos ...

  4. Linux CGI编程基础【整理】

    Linux CGI编程基础 1.为什么使用CGI? 如前面所见,任何的HTML均是静态网页,它无法实现一些复杂的功能,而CGI可以为我们实现.如:a.列出服务器上某个目录中的文件,对目录中的文件进行操 ...

  5. js固定小数位数 .toFixed()

    toFixed(num)法可把 Number 四舍五入为指定小数位数的数字. num为需要固定的位数 var num=2;console.log(num.toFixed(2));//2.00;var ...

  6. POJ 3186Treats for the Cows(区间DP)

    题目链接:http://poj.org/problem?id=3186 题目大意:给出的一系列的数字,可以看成一个双向队列,每次只能从队首或者队尾出队,第n个出队就拿这个数乘以n,最后将和加起来,求最 ...

  7. 关于Windows中的硬链接

    https://zhidao.baidu.com/question/748233720330351012.html linux中使用硬链接 ln a.txt b.txt 查看硬链接 ls -il 关于 ...

  8. 洛谷 P1469 找筷子 题解

    题目传送门 先排序一遍,再一个一个判断是否有偶数个.注意for循环要i+=2. #include<bits/stdc++.h> using namespace std; ]; int ma ...

  9. 邂逅Sass和Compass之Compass篇

    本文主要讲解Compass的内容,众所周知Compass是Sass的工具库,如果对Sass不甚了解的同学可以移步 邂逅Sass和Compass之Sass篇 Sass本身只是一个“CSS预处理器”,Co ...

  10. ubuntu16.04 内核源码编译

    1)下载 首先看一下自己的内核版本 apt-cache search linux-source下载内核代码:sudo apt-get install linux-source-4.10.0 2)解压: ...