Vue-Pinia

目录

Pinia状态管理库

使用步骤

1、安装Pinia

2、在vue应用实例中使用pinia

3、在src/stores/token.js中定义stores

4、在组件中使用store

axios请求拦截器

代码实现


Pinia状态管理库

        Pinia是Vue的专属状态管理库,它允许你跨组件或页面共享状态

        一般在登录时会产生一个token,在访问其他接口的时候要携带这个token才能成功访问。我们使用测试工具postman测试的时候可以直接在Header中携带token,但是我们在之前在学习vue的时候使用axios直接就访问了接口,这样除非是后端没有编写拦截器,否则是无法访问的。为了解决这个问题,让我们浏览器也可以成功访问拦截器生效的接口,我们就要使用到Pinia了。

你可以将pinia简单的理解为中转站,能让一个组件使用到另一个组件的东西

使用步骤

1、安装Pinia

在项目命令行下安装Pinia,指令:npm install pinia

2、在vue应用实例中使用pinia

 

3、在src/stores/token.js中定义stores

        这里使用const定义了token,但这并不代表它的值不可以改变了。const不可改变的是它的引用地址。在这个例子中, const token = ref(' ')中的token是一个引用变量,而不是原始值。这意味着你可以通过token,value来改变引用变量的值。

 

4、在组件中使用store

如:

        在登录时将生成的token放入生成的tokenStore中

//获取登录生成的token
import {useTokenStore} from '@/stores/token.js'
const tokenStore = useTokenStore();


//登陆接口
const login = async function(){
    let result = await userLoginService(registerData.value);
    ElMessage.success("登录成功");

    //将获取生成的token存储到pinia中
    tokenStore.setToken(result.data)

    router.push('/')
}

 然后在需要使用token验证的接口哪里从存储的store中取出来,赋值给响应头heanders就携带了token了

import request from '@/utils/request.js'
import {useTokenStore} from '@/stores/token.js'


export const categoryListService = function(){
    const tokenStore = useTokenStore();
    // tokenStore.token就是token

    //在pinia中定义的响应式数据都不需要加上.value
    return request.get('/category/list',{headers:{'Authorization':tokenStore.token}})
}

axios请求拦截器

        像上面的例子中,一个接口使用到token 就要方法里写调用tokenStore,然后再headers上加token。如果一堆接口都要使用,那么每一个接口中都要写这个一摸一样的逻辑,复用性极强。为了偷懒也为了代码的整洁美观,复用性高的代码片段我们想办法只写一次一劳永逸。为此要使用到请求拦截器,每次发起请求,直接拦截下来然后自动给你安上token。

        这个请求拦截器和我们之前学的响应拦截器很相似,只不过是没了result回调函数,取而代之的是一个config回调函数,这里面就是用在写在发起请求之前拦截下来做些什么。

代码实现        

//定制请求的实例

//导入axios  npm install axios
import axios from 'axios';
import { ElMessage } from 'element-plus';

//导入定义好的状态
import { useTokenStore } from '@/stores/token.js';

//定义一个变量,记录公共的前缀  ,  baseURL
const baseURL = '/api'
const instance = axios.create({baseURL})

//添加请求拦截器
instance.interceptors.request.use(
    config => {
        //添加token
        const tokenStore = useTokenStore();
        if(tokenStore.token){
            config.headers.Authorization = tokenStore.token;
        }
        return config;
    },
    err => {
        ElMessage.error('请求异常');
        return Promise.reject(err);//异步的状态转化成失败的状态
    }
)

//添加响应拦截器
instance.interceptors.response.use(
    result => {
        if(result.data.code == 0){
            return result.data;
        }else{
            ElMessage.error(result.data.message ? result.data.message : '服务异常')

            //结束异步操作
            return Promise.reject(result.data);
        }
    },
    err => {
        ElMessage.error(result.data.message ? result.data.message : '服务异常');
        return Promise.reject(err);//异步的状态转化成失败的状态
    }
)


export default instance;

 

注意:如果出现这个错误,不是代码的问题,是token过期了,重新登录一下就可以了

 

 


Pinia问题解决 - 补充

Pinia持久化插件 - perisist

使用pinia的时候会遇到一个bug,本来已经登录了,数据也显示出来了,但是当你刷新页面之后,又请求异常了

这是因为Pinia默认是内存存储,刷新浏览器的就会丢失数据,因此要使用Persist插件可以将pinia中的数据持久化的存储

使用方法

  • 安装persist:npm install pinia-persistedstate-plugin

  • 在pinia中使用persist                                        

与其他不同,不是app使用,而是pinia使用

  • 定义状态Store时指定持久化配置参数
//定义store
import {defineStore} from 'pinia'
import {ref} from 'vue'

//第一个参数:名字,唯一性
//第二个参数:函数的内部可以定义状态的所有内容

//返回值:函数

export const useTokenStore = defineStore('token',()=>{
    const token = ref('')

    const setToken = (newToken) =>{
        token.value = newToken;
    }

    const removeToken = () => {
        token.value=''
    }

    return {
        token,setToken,removeToken
    }
},{
    persist:true    //开启持久化存储
});

在使用token的这个地方使用persist:true开启持久化存储

这样刷新页面之后,pinia中存储的数据也不会消失了

未登录统一处理

现在使用的edge浏览器访问的接口,现在我们直接复制地址,用另一个浏览器打开

使用Chrome浏览器打开这个地址,我们发现还是停留在这个界面

        当我们访问这个地址的时候,由于在这个浏览器中没有登录过,也就没有token。我们所希望的是可以直接跳转到登录注册界面,让用户去登录生成token,总不能让用户自己在地址栏手动输入/login的url吧。

        响应拦截器是检查是否携带token的,因此我们要在这里做判断,判断是否为登录状态,如果不是,那么就重定向至登录界面

import router from '@/router'

//添加响应拦截器
instance.interceptors.response.use(
    result => {
        if(result.data.code == 0){
            return result.data;
        }else{
            ElMessage.error(result.data.message ? result.data.message : '服务异常')

            //结束异步操作
            return Promise.reject(result.data);
        }
    },
    err => {

        if(err.response.status === 401){
            ElMessage.error("请先登录");
            router.push('/login')
        }else{
            ElMessage.error(result.data.message ? result.data.message : '服务异常');
        }

        return Promise.reject(err);//异步的状态转化成失败的状态
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 各种工具类的使用方法

1. 属性拷贝 属性名词和类型相同才能拷贝 import org.springframework.beans.BeanUtils; BeanUtils.copyProperties(dto,wmNews); //dto, wmNews 是两个实体类 dto为源对象,wmNews为目标对象2. list集合转换为string类型 import org.apache.commons.lang3.String…

将Python程序(.py)转换为Windows可执行文件(.exe)

python开发者向普通windows用户分享程序,要给程序加图形化的界面(传送门:这可能是最好玩的python GUI入门实例! http://www.jianshu.com/p/8abcf73adba3),并要将软件打包为可执行文件(.exe结尾),那如何将.py转为.exe ? 将.py转为.exe 第一步:安装pyinstaller(临时调用了国内豆…

atoi函数的模拟实现

函数原型&#xff1a;int atoi (const char * str); 作用&#xff1a;将字符串转换为整数 注意事项&#xff1a; 1、会忽略字符串前的空白字符&#xff0c;并从第一个非空白字符开始解析整数&#xff0c;直到遇到非数字字符为止 具体代码如下&#xff1a; #include <s…

sscanf提取相应字符到数组

代码如下 #include<stdio.h> #include<string.h>int main(int argc, char const *argv[]) {char buf[128] {0};int m1 0, m2 0;int s1 0, s2 0;char lrc[128] "";sscanf("[02:16.33][04:11.44]我想大声宣布对你恋恋不舍","[%*1d%d…

gitLab server version 13.12.1 is not supported

拉代码的时候&#xff0c;报的这个错&#xff0c;实际上就是因为gitLab 版本太低了&#xff0c;这里不准备升级版本&#xff0c;打算继续使用账号密码来拉取代码 在idea已经安装的插件中&#xff0c;去掉gitlab插件&#xff0c;如下&#xff1a; 之后再拉取代码&#xff0c;就…

五分钟学会搭建悟空CRM内网穿透,实现公网访问企业内网,提升工作效率!

文章目录 前言1. 无需公网IP&#xff0c;使用cpolar实现悟空CRM远程访问2. 通过公网来访问公司内网悟空CRM3. 设置固定连接公网地址 前言 悟空CRM是一款开源的客户关系管理系统&#xff0c;以"客户关系一对一理论"为基础&#xff0c;通过对企业业务流程的重组来整合…

【MATLAB】史上最全的7种回归预测算法全家桶

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 大家吃一顿火锅的价格便可以拥有9种时序预测算法&#xff0c;绝对不亏&#xff0c;知识付费是现今时代的趋势&#xff0c;而且都是我精心制作的教程&#xff0c;有问题可随时反馈~也可单独获取某一算法的代码&#xff08…

《C++避坑神器·十九》C++多线程使用,啥也不懂看它就对了

C11后有了标准的线程库&#xff1a; #include <thread>并发 是指多个线程任务在同一个CPU上快速地轮换执行&#xff0c;由于切换的速度非常快&#xff0c;给人的感觉就是这些线程任务是在同时进行的&#xff0c;但其实并发只是一种逻辑上的同时进行&#xff1b; 并行 是…

GPTS全网刷屏!定制增长速度指数增长

还记的上周OpenAI刚刚举行完开发者大会&#xff0c;在大会上主要公布了三个事情&#xff1a; 新版本的GPT-4 Turbo&#xff1a;更强大、更便宜且支持128K新的助手API&#xff1a;让开发者更轻松地基于GPT构建辅助AI应用平台中新的多模态功能&#xff1a;包括视觉、图像创作&am…

MIB 6.1810操作系统实验:准备工作(Tools Used in 6.1810)

6.1810 / Fall 2023 实验环境&#xff1a; Ubuntuxv6实验必要的依赖环境能通过make qemu进入系统 $ sudo apt-get update && sudo apt-get upgrade $ sudo apt-get install git build-essential gdb-multiarch qemu-system-misc gcc-riscv64-linux-gnu binutils-ri…

Day1跟李沐学AI-深度学习课程00-04【预告、课程安排、深度学习介绍、安装、数据操作+数据预处理】

00 预告 《动手学深度学习》https://github.com/d2l-ai/d2l-zh 01 课程安排 02 深度学习介绍 03 安装 本地安装 使用conda/miniconda环境 conda env remove d2l-zh conda create -n -y d2l-zh python3.8 pip conda activate d2l-zh 安装需要的包 pip install -y jupyter …

云ES容灾方案

一、ES集群可用性容灾 1.1 云ES集群可用性容灾(使用跨可用区实例) 云ES集群部署在三个可用区,单可用区故障,云ES集群依然可能对外提供服务;两个可用区故障,需要进行控制台切流(集群会自动切的选择主节点) 应用服务部署在二个可用区,单可用区故障,依然可对提供服务1.2 …

C/C++---------------LeetCode第1189. “气球” 的最大数量

气球的最大数量 题目及要求统计法在main内使用 题目及要求 给你一个字符串 text&#xff0c;你需要使用 text 中的字母来拼凑尽可能多的单词 “balloon”&#xff08;气球&#xff09;。 字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 “ba…

数据结构-二叉树力扣题

目录 1.相同的树 2.二叉树中查找值为x的节点 3.单值二叉树 4.对称二叉树 5.二叉树的前序遍历 6.另一颗树的子树 层序遍历&#xff1a; 7.二叉树遍历 8.判断二叉树是否是完全二叉树 一个特殊的性质&#xff1a; 1.相同的树 题目链接&#xff1a;力扣&#xff08;LeetC…

与7无关的数

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

LeetCode热题100——二分查找

二分查找 1. 搜索插入位置2. 搜素二维矩阵3. 在排序数组中查找第一个和最后一个元素位置 1. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 // 题…

MySQL5.7安装详细过程--window系统

1、Window安装MySQL5.7详细过程 1.1、下载MySQL5.7安装包 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 1.2、将文件解压到盘符中 你可以解压到你想解压的位置&#xff0c;放在C或其他盘符都可以。 我放在了C盘中&#xff1a;C:\Program Files\my…

【AI视野·今日Robot 机器人论文速览 第六十四期】Fri, 27 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 27 Oct 2023 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers 6-DoF Stability Field via Diffusion Models Authors Takuma Yoneda, Tianchong Jiang, Gregory Shakhnarovich, Matthew R. …

TikTok运营干货——养号篇

随着国内抖音红利的进一步释放&#xff0c;越来越多人涌入了TikTok国内外市场。而TikTok作为海外新兴的社媒平台&#xff0c;也在迅速的发展着&#xff0c;吸引了大批的跨境电商玩家入驻。然而&#xff0c;TikTok运营的一大难点就是养号&#xff0c;许多人还没开始转化号就被封…