Vue学习记录-状态管理
要解决的问题
平时的系统开发中,基本都会碰到这个权限问题,需要根据用户的登录状态进行处理。最常见的情况就是“先登录,后使用”。除去打包成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学习记录-状态管理的更多相关文章
- 【Vue】Vue学习(四)-状态管理中心Vuex的简单使用
一.vuex的简介 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.Vuex背后的基本思想,就是前面所说的单向数据流.图4就是Vuex实现单向数据流的示意图. Store ...
- Vue学习记录第一篇——Vue入门基础
前面的话 Vue中文文档写得很好,界面清爽,内容翔实.但文档毕竟不是教程,文档一上来出现了大量的新概念,对于新手而言,并不友好.个人还是比较喜欢类似于<JS高级程序设计>的风格,从浅入深, ...
- vue项目--vuex状态管理器
本文取之官网和其他文章结合自己的理解用简单化的语言表达.用于自己的笔记记录,也希望能帮到其他小伙伴理解,学习更多的前端知识. Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态 ...
- vue总结 08状态管理vuex
状态管理 类 Flux 状态管理的官方实现 由于状态零散地分布在许多组件和组件之间的交互中,大型应用复杂度也经常逐渐增长.为了解决这个问题,Vue 提供 vuex:我们有受到 Elm 启发的状态管 ...
- 前端Vue框架-vuex状态管理详解
新人报道!多多关照-多提宝贵意见 谢谢- vuex理解 采用集中式存储管理模式.用来管理组件的状态,并以自定义规则去观测实时监听值得变化. 状态模式管理理解 属性 理解 state 驱动应用的数据源 ...
- vue的store状态管理模式
var store = { debug: true, state: { message: 'Hello!' }, setMessageAction (newValue) { //所有 store 中 ...
- Java设计模式学习记录-状态模式
前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...
- vue学习记录
vue中常用的指令 v-model 双向数据绑定,一般用于表单元素 v-for 对数组或对象进行循环操作,使用的是v-for <!-- 普通循环 --><li v-for=" ...
- 应用四:Vue之VUEX状态管理
(注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 概念:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应 ...
随机推荐
- 64_t4
texlive-hardwrap-svn21396.0.2-33.fc26.2.noarch.rpm 24-May-2017 15:41 35930 texlive-harmony-doc-svn15 ...
- 获取网站所有的url正则表达式
C# string pattern1 = @"(?is)<[^>]*?src=(['""\s]?)(?<src>[^'""\s ...
- 常见的 JavaScript 内存泄露
什么是内存泄露 指由于疏忽或错误造成程序未能释放已经不再使用的内存.内存泄漏并非指内存在物理上的消失, 而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造 ...
- mysql 创建,授权,删除 用户
1.创建用户 创建一个用户名是 lefunyun 密码是 X5A4FU8I0lKM21YPYUzP 账号 CREATE USER lefuyun@localhost IDENTIFIED BY 'X5 ...
- 关于函数strtok和strtok_r的使用要点和实现原理
strtok函数的使用是一个老生常谈的问题了.该函数的作用很大,争议也很大.以下的表述可能与一些资料有区别或者说与你原来的认识有差异,因此,我尽量以实验为证.交代一下实验环境是必要的,winxp+vc ...
- 冒泡法的算法最佳情况下的时间复杂度为什么是O(n)
我在许多书本上看到冒泡排序的最佳时间复杂度是O(n),即是在序列本来就是正序的情况下. 但我一直不明白这是怎么算出来的,因此通过阅读<算法导论-第2版>的2.2节,使用对插入排序最佳时间复 ...
- [ JS 进阶 ] Repaint 、Reflow 的基本认识和优化
你是不是经常听师兄或一些前端前辈说不能用CSS通配符 *,CSS选择器层叠不能超过三层,CSS尽量使用类选择器,书写HTML少使用table,结构要尽量简单-DOM树要小....等这些忠告,以前我就大 ...
- spring-cloud-sleuth+zipkin追踪服务实现(一)
1.简述 最近在学习spring cloud构建微服务,研究追踪微服务rest服务调用链路的问题,接触到zipkin,而spring cloud也提供了spring-cloud-sleuth来方便集成 ...
- 作死自救日记——不小心修改linux下/etc/sudoers权限的解决办法
作死自救日记,献给跟我一样不小心作了死的人 ================================================ 今天不小心作死修改了/etc/sudoers的权限,作死命 ...
- HadoopMR-Spark-HBase-Hive
 YARN资源调度: 三种 FIFO 大任务独占 一堆小任务独占 capacity 弹性分配 :计算任务较少时候可以利用全部的计算资源,当队列的任务多的时候会按照比例进行资源平衡. 容量保证:保证队 ...