vuex项目中登录状态管理的实践过程

目录
  • 工具:
  • 登录场景:
  • 实践:
    • 场景1思考与实践
    • 场景2思考与实践
  • 总结

工具:

chorme浏览器安装Vue.js devtools方便调试

登录场景:

页面的导航处或其他地方有时会显示用户现在的登录状态,状态可分为:未登录,正在登录(loading),登录成功并显示用户名。

有些页面是不需要登录就可以让用户浏览的,但是有些页面必须登录才可以进入浏览。

实践:

场景1思考与实践

用vuex创建一个数据仓库

//src目录下新建一个store目录,创建index.js如下
//创建数据仓库
import Vuex from 'vuex';
import vue from 'vue';
import loginUser from 'loginUser.js'
Vue.use(Vuex)

const store = new Vuex.Store({
    modules: {  //modules 可以把不同的状态单独的放在一个对象里面
        loginUser //是否正在登录中
    },
    strict: true, //只允许通过mutations改变状态
});

设置登录状态loading和当前登录用户user

//创建一个loginUser.js,创建他的state/mutations/actions

//需要维护的状态
state: {
       loading: false, //登录状态
       user: null, //当前登录的用户
       },
//计算属性
getters: {
       status(state) {
           if (state.loading) {
               return 'loading'
           } else if (state.user) {
               return 'login'
           } else {
               return 'unLogin'
           }
       }
   },

 //改变loading和user状态
mutations: {
       //设置loading
       setLoading(state, msg) {
           state.loading = msg
       },
       //设置用户
       setUser(state, msg) {
           state.user = msg
       }
   },

 //actions中提交改变的状态
 actions: {
       //登陆方法ctx相当于store
       async login(ctx, msg) {
           //登陆状态设置为true
           ctx.commit("setLoading", true)
           const result = await xxxapi.login(msg.loginId, msg.loginPassword)
           if (result) {
               //登录成功
               ctx.commit('setUser', result)
               //登陆成功后登陆状态设置为false
               ctx.commit('setLoading', false)
           }
           //返回登陆是否成功
           return result
       },
       //判断是否已登录
       async isLogin(ctx) {
           //正在登录中
           ctx.commit('setLoading', true)
           //调接口是否登陆
           const result = await xxxapi.isLogin();
           ctx.commit('setUser', result);
           ctx.commit('setLoading', false)
       },
       //注销
       async logout(ctx) {
           ctx.commit('setLoading', false)
           await xxxapi.logout();
           ctx.commit('setUser', null);
           ctx.commit('setLoading', false)
       }
   },

页面使用:

在登录时,有一个登录按钮,按钮的状态我们就可以在Vuex的仓库中获取

<button :disabled="loading">{{ loading ? 'loading...' : '登录' }}
</button>
computed: {
//在computed中封装一下loading,不用每次调用都写this.$store.state.loginUser这一堆
    // loading() {
    //  return this.$store.state.loginUser.loading;
    // }
    // 优化
    //辅助函数
    //import {mapState} from "vuex"
    ...mapState({
      loading: (state) => state.loginUser.loading
    })
  }

点击按钮的时候提交的时候分发action

async handleSubmit() {
      const result = await this.$store.dispatch("loginUser/login", {
        loginId: this.loginId,
        loginPassword: this.loginPassword
      });
      if (result) {
        //  登录成功 路由跳转
        const path = this.$route.query.url || '/'
        this.$router.push(path)
      }
    },

页面的导航中切换显示此时的登录状态[loading/login/unlogin]

  <!--      显示页面登录状态-->
<span v-if="status === 'loading'">正在登录请稍等...</span>
​
<template v-else-if="status === 'login'">
    <span>当前登录用户{{user.name}}</span>
    <span @click="handleLogout">退出</span>
</template>
​
<router-link to="/login" v-else>
        登录
</router-link>
  computed: {
...mapGetters("loginUser", ["status"]),
...mapState("loginUser", ["user"]),
}

登出时 更改状态

async handleLogout(){
    await this.$store.dispatch("loginUser/logout")
    //跳转到登陆页面
    this.$route.push(/xxx)
},

每次页面刷新需要检测登录状态,在main.js中,也就是vue创建的时候就要判断。
store.dispatch('loginUser/isLogin')

场景2思考与实践

参考了后台项目中的权限设置

总体设计:

刷新页面后,在Vuex仓库中先检测此时登录状态–> 导航守卫(router.beforeEach)通过判断meta中设置的参数检测此页面是否

需要登录后才能查看 -->页面渲染。

整体逻辑:

1.进入页面时判断此页面是否需要登录才能查看

2.判断登录状态。有三种状态如下:

  1. 如果已经登录了就直接进入想去的页面。
  2. 如果没登录,就进入登录页面让用户登录。
  3. 如果状态是加载中(loading),要传入想去的页面的路径,并在加载中页面监控Vuex仓库中用户登录状态的变化,监听状态变化完了之后,此时要不就是已经登录了,要不就是没有登录的状态,然后再走第1步判断是否要登录权限。

实践:

在router中设置meta,如果auth为true就是需要登录才能访问

//routes.js中
import Home from "./xx/xx.vue"
export default[
{
      path:"/home",
    component:Home,
    meta: {
      auth: true, //需要权限才可以访问的页面
    }
}
]
在index.js中设置路由守卫
router.beforeEach((to, from, next) => {
    if (to.meta.auth) {
        // 需要登录权限才可以访问
        const result = store.getters["loginUser/status"]
        if (result === 'loading') {
            //    加载状态,不知道有没有登录
            //    跳转一个正在登录中页面,并且要在页面中监控是否已经登录成功了,要不然会永远停留在这里
            //    并且路由跳转的时候得记录你之前是从哪里过来的,要不然不知道要跳转到哪一个页面
            next({
                path: '/loading', //去【正在登录中】的页面
                query: {
                    url: to.fullpath
                }
            })
        } else if (result === 'login') {
            // 登录成功了
            next();
        } else {
            //    没有登录
           this.$message.info('你需要登录');
             next({
                path: '/login', //去【正在登录中】的页面
                query: {
                    url: to.fullpath
                }
            })
        }
    } else {
        //不需要登录权限就可以访问的页面
        next()
    }
})

在logining【正在登录中】页面中监控此时的状态

created() {
  this.unWatch = this.$watch(() => this.$store.getters["loginUser/status"], (status) => {
    console.log('此时的状态', status);
    if (status !== 'loading'){
      this.$router.push(this.$route.query.url || '/home').catch(() => {}
    }
  }, {
    immediate: true
  })
},
destroyed() {
  //取消监控
  this.unWatch()
}

总结

到此这篇关于vuex项目中登录状态管理的文章就介绍到这了,更多相关vuex登录状态管理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解Vuex管理登录状态

    又仔细看了一遍vuex的文档,还是云里雾里的,不过至少明白它是一个专门管理状态的,根据数据状态的改变可以驱动视图更新,既然是这样那至少登录注册是一种状态,就用登录来做测试,学习vuex,不过话说回来,既然专门管理状态,那我至少要仔细推敲一下这个learn的学习项目有那些状态逻辑. 1.据说储存的vuex store里面的状态是临时的,右键刷新一下页面这些状态就销毁了(这是据说,请大神解惑我也没办法证实),如果是这样的话,我的用户状态user还是应该要写入sessionStorage,不然登录了的

  • vuex项目中登录状态管理的实践过程

    目录 工具: 登录场景: 实践: 场景1思考与实践 场景2思考与实践 总结 工具: chorme浏览器安装Vue.js devtools方便调试 登录场景: 页面的导航处或其他地方有时会显示用户现在的登录状态,状态可分为:未登录,正在登录(loading),登录成功并显示用户名. 有些页面是不需要登录就可以让用户浏览的,但是有些页面必须登录才可以进入浏览. 实践: 场景1思考与实践 用vuex创建一个数据仓库 //src目录下新建一个store目录,创建index.js如下 //创建数据仓库 i

  • 非Vuex实现的登录状态判断封装实例代码

    目录 前言 登录状态封装 getToken isLogin 使用方法 setToken 最后 前言 在项目中肯定会有用户登录状态的判断,所以我们需要封装判断登录状态,用来满足整个项目的应用,当然刚不使用封装的话,会造成耦合度高,代码冗余等结果,在项目中可能常常用到vuex状态管理来进行登录状态的存,那如果项目用不到状态管理,那就可以使用简单的封装来进行登录状态判断. 登录状态封装 我们如果想要普通封装登录状态的话需要两个函数即获取存储的token的getToken和使用token判断是否登录的i

  • 务必掌握的Android十六进制状态管理最佳实践

    目录 前言 我和十六进制的 “三次握手” 使用十六进制前的混沌世界 十六进制能很好解决这些问题 十六进制运作机制 十六进制状态管理实战 十六进制状态存取实战 小结 作为额外附赠的答疑 前言 上周在掘金巧遇一篇 “用设计模式管理状态” 文章,作为补充,在评论区安利我司封装商业级 SDK 时常用的 “十六进制状态管理机制”. 原以为无人对此感兴趣,没想到留言很快便收到文章作者回复,且在评论区耐心和我探讨设计模式 独占式状态机 和十六进制 复合状态管理 使用场景区别. 遗憾的是,通过评论区只言片语,难

  • react18中react-redux状态管理的实现

    react的状态管理还是挺多的现在流行的有以下五种: Recoil MobX XState Redux Context 今天我们来讲一下react众多状态管理之一的redux,虽然这个我不太喜欢用,但是我觉得简单的状态管理谁都会,但是难的就是程序员的分水岭,所以今天来给大家讲一下redux. 下面我们来讲讲redux的优点: 可以在众多组件中传值,突破react单向数据流的限制 不仅支持react还支持vue等主流框架 当然是好用方便啦 接下来我们讲一下啥时候去使用他 在我们有好多组件,但是组件

  • vue项目中api接口管理总结

    默认vue项目中已经使用vue-cli生成,安装axios,基于element-ui开发,axiosconfig目录和api目录是同级,主要记录配置的相关. 1. 在axiosconfig目录下的axiosConfig.js import Vue from 'vue' import axios from 'axios' import qs from 'qs' import { Message, Loading } from 'element-ui' // 响应时间 axios.defaults.

  • Vuex中状态管理器的使用详解

    目录 一.Vuex是什么? 二.什么时候使用Vuex 三.Vuex的核心概念和API 四.应用举例 五.vuex中各种辅助函数的用法,可以使我们更加方便的运用vuex 一.Vuex是什么? Vuex在Vue项目开发时使用的状态管理工具.简单来说,就是对Vue的应用中多个组件的共享状态进行集中式的管理(读/写) Vuex实现了一个单向数据流,在全局拥有一个State存放数据,当组件要更改State中的数据时,必须通过Mutation进行,Mutation同时提供了订阅者模式供外部插件调用获取Sta

  • 详解vuex之store拆分即多模块状态管理(modules)篇

    了解vuex的朋友都知道它是vue用来集中管理状态的容器,如果了解过Reduce的朋友可能看见他时就会非常熟悉,都是用来管理全局的状态的,实现不同组件之间相互的数据访问.这里我们不介绍vuex,主要介绍vuex拆分store以及多模块管理.我们知道如果一个项目非常大的话状态就会非常的多,如果不进行分类处理,所有的状态都维护在一个state里面的话,状态管理就会变得非常的混乱,这样非常不利于项目的后期维护.我们现在前端推崇模块化开发,为的就是提高开发效率和维护效率,避免重复工作.那么vuex是怎么

  • vuex实现登录状态的存储,未登录状态不允许浏览的方法

    基础思路就是使用vuex状态管理来存储登录状态(其实就是存一个值,例如token),然后在路由跳转前进行登录状态的判断,可以使用vue-router的全局前置守卫beforeEach,也可以使用路由独享的守卫beforeEnter. 导航守卫 正如其名,vue-router``` 提供的导航守卫主要用来通过跳转或取消的方式守卫导航.有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的. 记住参数或查询的改变并不会触发进入/离开的导航守卫.你可以通过观察 $route 对象来应对

  • 详解vuex状态管理模式

    一.前言 本次接受一个BI系统,要求是能够接入数据源-得到数据集-对数据集进行处理-展现为数据的可视化,这一个系统为了接入公司自身的产品,后端技术采用spring boot,前端采用vue+vuex+axios的项目架构方式,vuex作为vue的状态管理,是尤为重要的部分.这里,我将vuex如何运作和使用做一次总结,有错的地方,望多多提点. 二.vuex简单使用 安装vuex cnpm install vuex --save 在src目录下建立文件夹,命名为store,建立index.js 如图

  • Vue项目新一代状态管理工具Pinia的使用教程

    目录 前言 Pinia与Vuex的区别 使用Pinia 直接修改数据的两种方式 使用actions修改数据 重置state中数据 Pinia持久化存储 Pinia模块化实现 Pinia中store之间互相调用 总结 前言 Pinia官网介绍说:Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态.Vuex同样可以作为状态管理工具,那么两者有什么区别呢? Pinia与Vuex的区别 pinia只有store.getter.actions,么有mutations,简化了状态管理的操作 pi

随机推荐