当前位置:   article > 正文

vue3+ts+axios+pinia实现无感刷新_axios pinia

axios pinia

1.先在项目中下载aiXos和pinia

npm i pinia --save
npm install axios --save

2.封装axios请求-----

下载js-cookie

npm i JS-cookie -s
  1. //引入aixos
  2. import type { AxiosRequestConfig, AxiosResponse } from "axios";
  3. import axios from 'axios';
  4. import { ElMessage } from 'element-plus';
  5. import { useUserInfoStore } from '@/stores/modules/UserInfo'
  6. import router from '@/router';
  7. import qs from 'qs';
  8. import Cookie from "js-cookie";
  9. let baseURL = "";
  10. // console.log(process.env.NODE_ENV);//判断环境
  11. if (process.env.NODE_ENV === 'development') {
  12. baseURL = '/m.api'//后台请求接口地址
  13. } else {
  14. baseURL = 'http://xxxx.cn:8080';//这里是项目上线后的地址
  15. }
  16. declare interface TypeResponse extends AxiosResponse {
  17. /**
  18. * 错误号,200表示成功,10006令牌过期
  19. */
  20. errno: number,
  21. /**
  22. * 返回的信息
  23. */
  24. errmsg: string
  25. }
  26. //创建axios实例
  27. const instance = axios.create({
  28. baseURL, // 接口地址
  29. timeout: 3000,
  30. headers: {
  31. "Content-Type": 'application/x-www-form-urlencoded'
  32. }
  33. });
  34. //添加拦截器
  35. instance.interceptors.request.use((config) => {
  36. // 在发送请求之前做些什么--给请求头添加令牌token
  37. (config as any).headers['AdminToken'] = Cookie.get('token')//从cookie中拿token值,
  38. //这里是使用了js-cookie插件。
  39. // console.log(config, "请求拦截器")
  40. return config
  41. }, reeor => {
  42. // 对请求错误做些什么
  43. return Promise.reject(reeor);
  44. });
  45. // 需要无痛刷新的操作页面
  46. const METHOD_TYPE = ["_mt=edit", "_mt=create", "_mt=delete"]
  47. // //响应拦截器
  48. instance.interceptors.response.use(async (response: AxiosResponse) => {
  49. // 对响应数据做点什么
  50. let data = response.data;
  51. let { errno, errmsg } = data;
  52. console.log(response, "响应拦截器");
  53. let path = router.currentRoute.value.fullPath;//当前路由路径
  54. if (10006 === errno) {
  55. const configData = response.config.data || ''
  56. // 判断请求类型是否需要无痛刷新,index !== -1则需要无痛刷新
  57. let index = METHOD_TYPE.findIndex(item => configData.includes(item))
  58. if (-1 === index) {//需要重新登入获取令牌
  59. router.replace({ path: "/login", query: { back: path } })//登入后需要跳回的地址
  60. return
  61. } else {//需要无痛刷新令牌
  62. const store = useUserInfoStore();
  63. const { username, password } = store.LoginInfo//在状态管理里面定义一个loginInfo
  64. // 1.重新获取令牌
  65. let loginData = { _gp: 'admin', _mt: 'login', username, password };
  66. const { errno, errmsg, data } = await post(loginData)//这里是通过async 将异步序列化改为同步
  67. if (200 == errno) {
  68. Cookie.set('token', data)//保存令牌
  69. } else {
  70. router.replace({ path: "/login", query: { back: path } })//登入后需要跳回的地址
  71. return Promise.reject({ errno, errmsg, data })
  72. }
  73. return instance.request(response.config)
  74. }
  75. // ElMessage.error(errmsg);//错误信息
  76. }
  77. return data;
  78. }, reeor => {
  79. console.log(reeor);
  80. return Promise.reject(reeor);
  81. })
  82. function get(params?: object): Promise<TypeResponse> {
  83. return instance.get('', { params });
  84. };
  85. function post(data: object, params?: object): Promise<TypeResponse> {
  86. return instance.post('', qs.stringify(data), { params });
  87. };
  88. //暴露实列
  89. export {
  90. post, get,
  91. }

3.qs.stringify(data)是将请求的数据转成表单格式,如果不需要直接去掉就可以了;

4.重新登录后跳转路由需要设置,不需要可以去掉

5。状态管理--数据

下载持久化工具

npm install pinia-plugin-persistedstate --s

 在main.js中配置持久化

  1. //引入数据持久化插件
  2. import piniaPluginPersistedstate from 'pinia-plugin-persistedstate';
  3. const pinia = createPinia()
  4. pinia.use(piniaPluginPersistedstate);
  5. app.use(pinia)
  1. import { defineStore } from 'pinia'
  2. export const useUserInfoStore = defineStore('UserInfo', {
  3. state:() => ({
  4. LoginInfo:{
  5. username:'',
  6. password:''
  7. }
  8. }),
  9. persist:true;//状态存储持久化
  10. })

6.登录页面--存储表单数据,也就是用户名和密码

npm i lodash --s
  1. import Cookies from 'js-cookie';//引入cookie
  2. import * as _ from 'lodash';//防抖节流插件
  3. import {post} from '@/util';
  4. import {useUserInfoStore} from '@/stores/modules/UserInfo' ;//用户信息
  5. import { useRouter,useRoute } from 'vue-router' ;//引入路由
  6. //这里是表单输入的数据
  7. const ruleForm = reactive({
  8. password: '123456',
  9. username: 'admin'
  10. });
  11. //请求接口数据
  12. let data = {
  13. _gp: "admin",
  14. _mt: 'login',
  15. ...ruleForm
  16. };
  17. let LoginInfo = useUserInfoStore().LoginInfo;//状态管理定义的数据
  18. async function init() {
  19. await post(data).then((res:any) => {
  20. let { data: token, errno, errmsg } = res
  21. if (200 === errno) {
  22. let time = new Date() //设置过期时间
  23. time.setTime(time.getTime() + 1000 * 60 * 30)
  24. Cookies.set('token', token, { expires: time });
  25. Object.assign(LoginInfo,ruleForm)
  26. if (route.query.back) { //如果存在参数
  27. let paths = route.query.back+''//拼接字符串
  28. console.log(paths);
  29. if (paths=='/') {
  30. //因为我的home是'/',所有需要判断
  31. router.replace('/Surface')//跳转至主页
  32. return
  33. }else{
  34. router.replace(paths)//则跳转至进入登录页前的路由
  35. }
  36. } else {
  37. router.replace('/Surface')//否则跳转至首页
  38. }
  39. } else {
  40. ElMessage.error(errmsg)
  41. }
  42. }).catch((err:any) => {
  43. ElMessage.error('登录异常!')
  44. })
  45. let info = {//用户信息请求信息接口数据
  46. _gp: "admin",
  47. _mt: 'info',
  48. }
  49. //下面这个函数是请求用户信息的,不需要可以不写
  50. await post(info).then((res:any) => {
  51. let {data} = res
  52. console.log(data);
  53. infos(data)
  54. }).catch((err:any)=>{
  55. ElMessage.error('登录异常!')
  56. })
  57. }
  58. //防抖节流
  59. const fangdou = _.debounce(init, 1500, {
  60. leading: true, // 延长开始后调用
  61. trailing: false // 延长结束前调用
  62. })
  63. //移除组件时,取消防抖
  64. onUnmounted(() => {
  65. fangdou.cancel()
  66. })

7.main.js设置路由守卫

  1. import Cookie from 'js-cookie'
  2. import router from './router'//引入路由
  3. //路由守卫
  4. router.beforeEach(async (to, from ) => {
  5. let tokent:string|undefined = Cookie.get('token')
  6. if (!tokent && to.path == '/login') {
  7. return true
  8. }
  9. // 没有登录,强制跳转登录页
  10. if (!tokent && to.path !== '/login') {
  11. router.replace({path:'/login',query:{back:to.path}});
  12. }
  13. // 防止重复登录
  14. if (tokent && to.path === '/login') {
  15. return {
  16. path: from.path ? from.path : '/Surface'
  17. }
  18. }
  19. return true
  20. })

大概就是这么多,有什么问题可以直接问

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/218988
推荐阅读
相关标签
  

闽ICP备14008679号