第17章 前端之全局存储:Vuex=Store

news2024/11/18 10:47:58

17章 前端之全局存储:Vuex=Store

    Store用于对数据进行存储,并共享以为所有需要的Vue页面中的调用提供数据及其方法支撑;Vuex是Store的内置引用包,即如果想要前端Vue程序支撑Store必须在新建Vue程序;如果Vue程序没有引用Vuex包则,在Vue程序引用Vuex包。

1 定义src\store\index.js

import {

    createStore

} from 'vuex'

export default createStore({

    state: {

        token: null,//实例化“TokenJwt”字符串。

        tokenExpire: null,//实例化“TokenJwt”字符串的过期时间。

    },

    getters: {},

    mutations: {

        //通过该方法把“TokenJwt”字符串,进行全局存储。

        saveToken: function(state, data) {

            state.token = data;

            window.localStorage.setItem("Token", data);

        },

        //通过该方法把“TokenJwt”字符串的过期时间,进行全局存储。

        saveTokenExpire: function(state, data) {

            state.tokenExpire = data;

            window.localStorage.setItem("TokenExpire", data);

        },

    },

    actions: {},

    modules: {}

})

2 重构 src\api\api.js中的守卫拦截

 else if (error.response) {

            if (error.response.status == 401) {

                var curTime = new Date()

                var refreshtime = new Date(Date.parse(window.localStorage.refreshtime))

                // 在用户操作的活跃期内

                if (window.localStorage.refreshtime && (curTime <= refreshtime)) {

                    return  refreshToken({token: window.localStorage.Token}).then((res) => {

                        if (res.success) {

                            createApp.prototype.$message({

                                message: '成功获取“TokenJwt”字符串,数据载入中...',

                                type: 'success'

                            });

                             //“TokenJwt”字符串,进行全局存储。

                            this.$store.commit("saveToken", res.response.token);

                             //“TokenJwt”字符串的过期时间,进行全局存储。

                            let curTime = new Date();

                            let expiredate = new Date(curTime.setSeconds(curTime.getSeconds() + res.response.expires_in));

                            this.$store.commit("saveTokenExpire", expiredate);

                            error.config.__isRetryRequest = true;

                            error.config.headers.Authorization = 'Bearer ' + res.response.token;

                            return axios(error.config);

                        } else {

                            // 刷新token失败 清除token信息并跳转到登录页面

                            //ToLogin()

                        }

                    });

                } else {

                    // 返回 401,并且不知用户操作活跃期内 清除token信息并跳转到登录页面

                    //ToLogin()

                }

            }

3 重构src\views\LoginView.vue

  async submitLogin() {

                this.$refs.refRuleLogin.validate(async (valid) => {

                    if (valid) {

                        this.logining = true;

                        this.loginStr = "登录中...";

                        let loginParams = {

                            name: this.formLogin.account,

                            pass: this.formLogin.checkPass

                        };

                        let res = await requestLogin(loginParams);

                        //console.log(res);

                        if (res.status == 200) {

                            //“TokenJwt”字符串,进行全局存储。

                            console.log(this.$store.state.token);

                             let token = res.response.token;

                             this.$store.commit("saveToken", token);

                            console.log(this.$store.state.token);

                           

                            //“TokenJwt”字符串的过期时间,进行全局存储。

                            console.log(this.$store.state.tokenExpire);

                            let curTime = new Date();

                            let expiredate = new Date(curTime.setSeconds(curTime.getSeconds() + res.response.expires_in));

                            this.$store.commit("saveTokenExpire", expiredate);

                            console.log(this.$store.state.tokenExpire);

                             

                            this.$message.success("成功登录");

                            //通过定时器,3秒钟后跳转。

                            await setInterval(

                                async () => {

                                    await this.$router.replace(this.$route.query.redirect ? this

                                        .$route.query.redirect : "/");

                                }, 3000);

                               

                        } else {

                            this.$message.error(res.msg);

                            this.logining = false;

                            this.loginStr = "重新登录";

                        }

                    } else {

                        console.log('输入不能通过验证 !');

                        return false;

                    }

                });

            },

4 重构src\views\ LoginCompositionView.vue

   

<script setup>

    import {

        ref,

        reactive,

        getCurrentInstance

    } from "vue";

    import { useStore } from "vuex";

    import {

        requestLogin

    } from "../api/api.js";

    const formLogin = reactive({

        account: 'test',

        checkPass: 'test',

    });

    const ruleLogin = reactive({

        account: [{

            required: true,

            message: '请输入账号',

            trigger: 'blur'

        }, ],

        checkPass: [{

            required: true,

            message: '请输入密码',

            trigger: 'blur'

        }, ],

    });

    const checked = ref(true);

    const loginStr = ref('登录');

    const logining = ref(false);

    //实例化表单“ref”属性所对应的值。

    const refRuleLogin = ref('');

    const {

        $router,

        $route,

        $message

    } = getCurrentInstance().root.ctx.$root;

    //注意:由于“store”需要“retrun{}出去,所以必须在提交事件之外进行实例化。否则会出现异常。

    const store = useStore();

   

    //表单单击提交事件。

    const submitLogin = (formEl) => {

     

        if (!formEl) return;

        formEl.validate(async (valid) => {

            if (valid) {

                logining.value = true;

                loginStr.value = "登录中...";

                let loginParams = {

                    name: formLogin.account,

                    pass: formLogin.checkPass

                };

                let res = await requestLogin(loginParams);

                //console.log(res);

                if (res.status == 200) {

                    //“TokenJwt”字符串,进行全局存储。

                    console.log(store.state.token);

                     let token = res.response.token;

                     store.commit("saveToken", token);

                    console.log(store.state.token);

                   

                    //“TokenJwt”字符串的过期时间,进行全局存储。

                    console.log(store.state.tokenExpire);

                    let curTime = new Date();

                    let expiredate = new Date(curTime.setSeconds(curTime.getSeconds() + res.response.expires_in));

                    store.commit("saveTokenExpire", expiredate);

                    console.log(store.state.tokenExpire);

                   

                    $message.success("成功登录");

                    //通过定时器,3秒钟后跳转。

                    await setInterval(

                        async () => {

                            $router.replace($route.query.redirect ? $route.query.redirect : "/WelcomeComposition");

                        }, 3000);

                }

                else {

                    $message.error(res.msg);

                    logining.value = false;

                    loginStr.value = "重新登录";

                }

            } else {

                console.log('输入不能通过验证 !');

                return false;

            }

        });

    }

</script>

5 重构src\views\WelcomeView.vue

<template>

    <h1>Welcome</h1>

</template>

<script>

    export default {

        data() {

            return {};

        },

        methods: {

        },

        mounted() {

            /* console.log(this.$store.state.tokenExpire);

            this.$store.commit("saveTokenExpire", null);

            console.log(this.$store.state.tokenExpire); */

           

            var curTime = new Date();

            if (this.$store.state.tokenExpire) {

                var expiretime = new Date(Date.parse(this.$store.state.tokenExpire));

                if (curTime >= expiretime) {

                    this.$router.push("/login");

                }

            } else {

                this.$router.push("/login");

            }

        },

    }

</script>

6 定义src\views\WelcomeCompositionView.vue

<template>

    <h1>WelcomeComposition</h1>

</template>

<script setup>

    import {

        getCurrentInstance

    } from "vue";

    import { useStore } from "vuex";

    //注意:由于“store”需要“retrun{}出去,所以必须在提交事件之外进行实例化。否则会出现异常。

    const store = useStore();

    /* console.log(store.state.tokenExpire);

    store.commit("saveTokenExpire", null);

    console.log(store.state.tokenExpire); */

        const {

        $router,

    } = getCurrentInstance().root.ctx.$root;

    var curTime = new Date();

    if (store.state.tokenExpire) {

        var expiretime = new Date(Date.parse(store.state.tokenExpire));

        if (curTime >= expiretime) {

            $router.push("/LoginComposition");

        }

    } else {

        $router.push("/LoginComposition");

    }

</script>

 对以上功能更为具体实现和注释见:221217_003_admin(前端之全局存储:Vuex=Store)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/96167.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python】一文带你理解并解决conda activate虚拟环境后,pip安装的包没放在虚拟环境

太长不看版 环境变量有问题&#xff0c;查看环境变量&#xff0c;应该会发现&#xff0c;在你虚拟环境的地址之前&#xff0c;有其他的地址&#xff0c;比如/home/xxx/.local/bin:等&#xff0c;而且这个地址里面刚好有pip,python这些程序。 最简单的办法&#xff1a;去把/hom…

第十五章 Golang单元测试

1. 先看一个需求 在我们工作中&#xff0c;我们会遇到这样的情况&#xff0c;就是去确认一个函数&#xff0c;或者一个模块的结果是否正确。 func addUpper(n int) int{res : 0for i : 1;i<n;i{res i}return res }2.传统方法的优缺点 不方便&#xff0c;我们需要在main函…

java基于微信小程序的二手交易系统-计算机毕业设计

项目介绍 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&a…

QCC51XX---RAM资源查看

QCC51XX---系统学习目录_嵌入式学习_force的博客-CSDN博客 想必大家有时会遇到一些memory的panic,就像下图的提示 这主要是内存溢出引起的。而内存溢出主要有内存池(memory pool)和RAM溢出两种,不管哪种溢出都是不规范使用内存或过度使用造成的。那具体有多少能用或怎么正确…

SpringCloud 学习笔记

❤ 作者主页&#xff1a;Java技术一点通的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是Java技术一点通&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得关注、点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习&#xff0c;共同进步&#xff01;&am…

SpringBoot 优雅地实现文件的上传和下载

2.技术栈mavenspringbootmybatis-plusmysqlthymeleafbootstrap3.数据库表 CREATE TABLE t_upload_file (id bigint(11) NOT NULL AUTO_INCREMENT,old_name varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,new_Name varchar(100) CHARACTER SET utf8 CO…

async和await随谈

以下只是个人观点&#xff0c;如果有出入或者错误之处&#xff0c;欢迎提出&#xff0c;你不需要纠结我的说法是否有一些小瑕疵&#xff0c;把其中你认为对的地方融入到自己的知识里去就好了&#xff0c;你学到的才是自己的。 在说async和await之前&#xff0c;先讲另一个东西迭…

ADI Blackfin DSP处理器-BF533的开发详解56:DSP控制ADV7180采集图像到LCD显示(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 代码实现功能 代码实现了采集一帧 720625 尺寸的 P 制 CVBS 信号源&#xff0c;以 YUYV422 的数据格式保存&#xff0c;通过 MDMA 将奇偶场数据交…

比较级和最高级

1. 单音节词和少数双音节词的比较级和最高级的构成 1)常见的单音节词和少数以-er和-ow结尾的双音节词&#xff0c;比较级在末尾加-er,最高级在末尾加-est 例如&#xff1a;单音节词&#xff1a;small-smaller-smallest, tall-taller-tallest; 双音节词&#xff1a;clever-cl…

第二十九章 linux-i2c子系统二

第二十九章 linux-i2c子系统二 文章目录第二十九章 linux-i2c子系统二linux-i2c数据结构分析linux-i2c驱动框架IIC核心IIC总线驱动IIC设备驱动linux-i2c设备实现硬件拓扑linux-i2c数据结构分析 driver 设备驱动模型 i2c_client来描述一个挂载在I2C总线上的I2C设备。 struc…

【图像处理】数字图像处理笔记

文章目录直方图处理滤波器图像复原形态学图像处理灰度形态学——多使用平坦结构元&#xff08;SE&#xff09;【数字图像处理P428图像分割1、canny边缘检测【数字图像处理P463】图像的表征特征描述子目标检测分类器AdaBoost算法——集成学习、迭代算法直方图处理 1、直方图均衡…

ARM处理器概论

目录 一、ARM处理器概述 1.ARM的含义 2.ARM公司 3.主流的两种处理器 RISC处理器&#xff08;精简指令集&#xff09; CISC处理器&#xff08;复杂指令集&#xff09; 4.SOC 二、ARM指令集概述 1.指令与指令集 指令 指令集 2.ARM指令集 ARM指令集 Thumb指令集 3.编…

vuex----的辅助函数mapState, mapActions, mapMutations用法和混入

Vuex的辅助函数mapState, mapActions, mapMutations用法和混入 爱学习的渣渣关注IP属地: 江苏 2022.03.28 00:14:13字数 287阅读 469 一.使用mapState来获取state里的值 第一步先解构 1.最简单的使用数组的形式来获取模块中state中的值 2.用对象的形式来获取模块中的state的…

面试官:Spring refresh过程是怎样的?

小熊学Java网站&#xff1a;https://javaxiaobear.gitee.io/&#xff0c;每周持续更新干货&#xff0c;建议收藏&#xff01; 1. Spring refresh 流程 refresh 是 AbstractApplicationContext 中的核心方法&#xff0c;负责初始化 ApplicationContext 容器&#xff0c;容器必须…

【算法】七月算法打卡

# 2022-07-11 深拷贝 const copyObject (obj {}) > {let newObj nullif (typeof (obj) object && obj ! null) {newObj obj instanceof Array ? [] : {}// 进入下一层进行递归for (let i in obj) newObj[i] copyObject(obj[i])} else {newObj obj}return …

手机(Android)刷NetHunter安装指南,无需ssh执行kali命令, NetHunter支持的无线网卡列表!

一、安装NetHunter 前提&#xff1a;确保手机已经root&#xff0c;已装上magisk。如果没有root&#xff0c;可用尝试magisk root 后执行此文 1、下载Nethunter&#xff1a;Get Kali | Kali Linux 然后push 到sdcard 里&#xff0c; 2、打开magisk&#xff0c;选择刚刚下好的…

krpt.dll丢失怎么安装?怎么修复快一点

krpt.dll丢失怎么安装&#xff1f;其实你只要记住一点&#xff0c;只要是dll文件丢失&#xff0c;那么就不外乎那几种修复方法&#xff0c;自己下载丢失的文件安装&#xff0c;或者使用dll修复工具&#xff0c;这些方法都是可以修复的。下面我们详细的说一说。 目录 一.krpt.…

性能优化-内存泄漏、内存溢出、cpu占用高、死锁、栈溢出、FullGC频繁检测手段-总结与分享

介绍 什么是内存泄漏 含义&#xff1a;内层泄露是程序中己动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费。&#xff08;换言之&#xff0c;GC回收不了这些不再被使用的对象&#xff0c;这些对象的生命周期太长&#xff09; 危害&#xff…

Linux学习03-Linux基础命令1

1 开始执行命令 command [-options] parameter1 parameter2 一行命令中第一个输入的部分绝对是命令或者可执行文件。 例如 ls命令列出目录的文件&#xff0c;需要列出隐藏文件则加 -al。 ls -al ls ls -a -l 2 基础命令操作 显示日期与时间的命令&#xff1a;date 显示日…

Ubuntu22.04系统中二进制包安装公有云k8s

目录公有云版k8s的架构是怎样的公有云中创建k8s实例的过程如下二进制法创建k8s的一般过程Kubernetes的重要性check nodes每台服务器执行基线配置CA rootetcd HA cluster根据CA根证书创建etcd的专有CA证书将etcd注册成为systemd服务配置各master节点的etcd.confansible配置各个m…