详解Vuex管理登录状态
作者:思吾谓何思 发布时间:2024-04-26 17:38:02
又仔细看了一遍vuex的文档,还是云里雾里的,不过至少明白它是一个专门管理状态的,根据数据状态的改变可以驱动视图更新,既然是这样那至少登录注册是一种状态,就用登录来做测试,学习vuex,不过话说回来,既然专门管理状态,那我至少要仔细推敲一下这个learn的学习项目有那些状态逻辑。
1、据说储存的vuex store里面的状态是临时的,右键刷新一下页面这些状态就销毁了(这是据说,请大神解惑我也没办法证实),如果是这样的话,我的用户状态user还是应该要写入sessionStorage,不然登录了的一刷新页面就变成没登录了,用户不就疯了啊。所以store里面的user状态应该要从sessionStorage里面去读。
2、在这个learn项目中现存的页面中,home,paroducts,FAQ,login,regin,应该是不需要登录就可以访问,而manger和manger以下的子页面是必须要登录才可以访问的。
3、比较特殊的是login和regin,如果用户已经登录了,再去访问这2个页面,原则上来说也是可以的,但如果已经登录了,再用其它账号来登录一次,那sessionStorage存在2个user数据,那就显然不合理了,所以应该规定,如果用户已经登录,又去访问login或者regin,那我们应先remove掉sessionStorage里面user数据
4、vuex规定所有状态的改变只能依靠mutation,而要驱动mutation去改变状态的只能是action。那在这个项目里登录状态变化只会有登录、注册和登出这三种情况,登录和注册成功的时候要去执行一个存在user的action,登出的时候去执行一个不存在user的action。
5、vuex官方还提了一个getter的玩意儿,我感觉应该是在我们需要取用store里面状态的时候,确切的说应该是取出这个状态之后,给这个状态做一些加工改变用的,而且应该只能getter一次吧,多了感觉要乱套啊(不知道这个想法对不对),但看见这样的写法this.$store.getters.doneTodosCount,感觉应该可以用不止一次把。估计我想得有点多了,目前看起来也用不上,也许要经历过需要的应用场景才能理解透彻把。
6、还有个module,这个就有点迷了,没太搞懂,先不管了
预想中store的登录状态还是要从sessionStorage来取的,所以我先把路由约束好,那些页面需要user,那些不需要,访问那些页面需要remove user
打开main.js
添加代码
// 这个官方名字叫导航守卫,挺形象的
router.beforeEach((to, from, next) => {
// 如果是去登录或注册,那就先把user移除
if (to.path === '/login' || to.path === '/regin') {
sessionStorage.removeItem('user')
}
let user = JSON.parse(sessionStorage.getItem('user'))
if (!user && (to.path === '/manger/my' || to.path === '/manger/send' || to.path === '/manger/history')) {
next({ path: '/login' })
} else {
next()
}
})
这样写感觉怪怪的,不知道有没有简单点的写法?
不过想要的效果是能达到的
然后尝试写store
先写个基本结构
然后一步一步具体写
是说这需要一个function?
唉哟,不对,我蠢了,这是赋值(不知道说赋值准不准确)嘛,又不是写一个obj对象,不需要逗号的哈
store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// 创建基本状态
const state = {
// 登录状态为没登录
logined: false,
// 用户信息数据,目前只需要avatar和name,还是把username也加上吧
LoginedUser: {
name: '',
avatar: '',
username: ''
}
}
// 创建改变状态的方法
const mutations = {
// 改变状态的方法也需要2个,一个是登录或注册了,一个是登出了
// 这里不能写箭头函数???
// 登录
LOGIN (state) {
// 先让登录状态变为登录了
state.logined = true
// 然后去sessionStorage取用户数据
let user = JSON.parse(sessionStorage.getItem('user'))
// 再把用户数据发下去
state.LoginedUser.name = user.name
state.LoginedUser.avatar = user.avatar
state.LoginedUser.username = user.username
},
// 登出
LOGOUT (state) {
// 这个同理
state.logined = false
state.LoginedUser.name = ''
state.LoginedUser.avatar = ''
state.LoginedUser.username = ''
}
}
// 创建驱动actions可以使得mutations得以启动
const actions = {
// 这里先来一个驱动LOGIN的东西就叫login吧
// 这个context是官方写的,应该叫什么无所谓
login (context) {
context.commit('LOGIN')
},
// 同样来个logout
logout (context) {
context.commit('LOGOUT')
}
}
export default new Vuex.Store({
state,
mutations,
actions
})
我感觉应该就这样就可以了吧,还是要测试一下
不对还应该要把action挂到该挂的地方,然后该引用store状态的地方引用store的数据
先去登录页面挂action
应该是这样的,注册也是一样
然后是登出的页面
header.vue
同时我们就不在创建页面的时候从sessionStorage取数据了
还有一个main.js
要是不能在main.js里面生效还真是麻烦啊,试想一下,已登录用户直接去了/login页面,seeionStorage里面用户数据清除了,但store里面的数据又没更新,那在头部不是还挂一个头像啊???
还有一步获取store里面的数据
header.vue
还是赶紧测试一下吧
哭了.....直接四个错误
这我都是照着官方说的写的啊
把header.vue的数据注释掉,还有一个错误
但这个dispatch 是undefined 是啥意思啊,我是照着写的啊,大佬帮我解惑一下啊
把dispatch 改成context 也不行
改成commit 试一下
还是一样没脾气了,我再去看看资料吧
研究了好久解决了一部分问题
首先我把store.js,里面的action写成了这样
但我觉得原来的写法也没有错
然后在main.js里面注释掉了这句
然后就正常了,dispatch是正确的,所以我所担心的事果然发生了
先去登录
可以看见header右上方的确立刻变成了用户信息,达到了要求,然而我要是自己去地址栏输入/login
跳到了登录页面,但头像真的还挂在右上角........,说明store里面真的还是登录的数据,虽然仔细想想其实这并没有什么影响,他要是再一次登录成功,数据自然也就变了,而且一般没人会这么去访问登录页面,但心里觉得这样不对啊。
而且我觉得这个action的分发应该有办法写在main.js里面的,不知道有没有大神指点一二!
来源:http://www.jianshu.com/p/baa7cfaa9498


猜你喜欢
- 算法简介鸡群算法,缩写为CSO(Chicken Swarm Optimization),尽管具备所谓仿生学的背景,但实质上是粒子群算法的一个
- 由于网络带宽以及某些WAP服务器DECK传输的限制,所以DECK越小越好,最好不要超过1.2K。如果你的需求很复杂,最好分成几个DECK来完
- 发现一个很简单的配置方法,一直想写的没写上,今天抽空就把它给补充完整好了。本文的配置方法Windows,Mac和Linux系统均适合。一.安
- 除了使用xshell等连接服务器以外,pycharm也可以连接服务器,在服务器上运行代码,上传下载文件等操作。步骤如下:1、pycharm工
- 每月需更新某个excel表格,进行两项操作,且不覆盖原有的sheet:1. 在原来的excel表中新增sheet2. 往原有的excel表中
- 本文实例讲述了Python2.7简单连接与操作MySQL的方法。分享给大家供大家参考,具体如下:Python号称简单优雅,其实新手摆弄一些东
- 直接pip install impala 是不行滴,按照以下步骤安装就会成功!一路安装就可以1、pip install six2、pip i
- 目录简介js 中的迭代器是什么样子的迭代协议可迭代协议迭代器协议迭代过程迭代总结自定义迭代传统写法生成器函数写法简介迭代器是一种设计模式,可
- 随着MySQL数据库存储的数据逐渐变大,已经将原来的存储数据的空间占满了,导致mysql已经链接不上了。因此,必须要给存放的数据换个地方了。
- 目录一、基础说起(一)实现最简单的窗体二、好戏开始了(一)把灰色设置成透明色(二)放置一个矩形框在canvas上。(三)大家有发现变化吗?三
- 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘
- 前言今天的文章比较基础,但却是必须掌握的,而且本文有些内容,也许你之前没想过。希望这篇文章能够让你理解环境变量并掌握 Go 环境变量相关操作
- 让我们描绘一下本文的情节:假设您要在本地机器上运行一个进程,而部分程序逻辑却在另一处。让我们特别假设这个程序逻辑会不时更新, 而您运行进程时
- 占位符说明1、%c,格式化字符及其ASCII码2、%s,格式化字符串3、%d,格式化整数4、%u,格式化无符号整数5、%o,格式化无符号八进
- 事务安全 transaction事务 transaction 访问可能更新数据库中各种数据项的一个程序执行单元unit事务由事务开始(beg
- 前言最近接手一个老项目,典型的 Vue 组件化前端渲染,后续业务优化可能会朝 SSR 方向走,因此,就先做些技术储备。如果对 Vue SSR
- python图像爬虫包 最近在做一些图像分类的任务时,为了扩充我们的数据集,需要在搜索引擎下爬取额外的图片来扩充我们的训练集。搞人工智能真的
- 如果是在Oracle10g之前,删除一个表空间中的数据文件后,其文件在数据库数据字典中会仍然存在,除非你删除表空间,否则文件信息不会清除。但
- 本例使用登录页面演示,session的状态保持功能。说明:因为http是无状态的,客户端请求一次页面后,就结束了,当再次访问时,服务器端并不
- 1、从记录中选出所有fault_code列的值在fault_list= [487, 479, 500, 505]这个范围内的记录r