Vue中Vue router和axios的封装使用教程

 更新时间:2023年11月22日 15:05:51   作者:爱吃奶酪的松鼠丶  
当用户登录后,后台会返回一个token给前端,前端下次进入首页后,会先判断token是否过期,如果过期自动进入登录页面,本文给大家介绍Vue中Vue router和axios的封装使用教程,感兴趣的朋友一起看看吧

模拟场景:

当用户登录后,后台会返回一个token给前端,前端下次进入首页后,会先判断token是否过期,如果过期自动进入登录页面。

配置路由:

1.安装

npm install vue-router@4

2.安装后在src目录下创建router文件夹,并创建index.js 代码如下:

// vue-router中提供3种的路由模式
import { createWebHistory, createRouter } from 'vue-router'
import { checktoken } from '../request/api';
const routes = [
  {
    path: '/',
    name: "home",
    component: () => import('../components/Pages/Home.vue'),
  },
  {
    path: '/login',
    name: 'login',
    component: () => import('../components/Pages/Login.vue'),
  }
]
const router = createRouter({
  // 路由的模式
  history: createWebHistory(),
  // 路由规则
  routes
})
//导航守卫 导航前做点操作
router.beforeEach(async (to, from, next) => {
  // 编写一个函数来检查 token 是否有效
  if (to.name == 'home' && await checkTokenValidity()) {
    // 如果进入首页且未认证,则重定向到登录页
    next({ name: 'login' });
  } else {
    // 其他情况允许通过
    next();
  }
});
async function checkTokenValidity() {
  // 获取 token
  const token = localStorage.getItem('token');
  if (token) {
    // 使用 ' ' 分割字符串
    const arr = token.split(' ');
    let tokenstr = arr[1];
    return await checktoken({ token: tokenstr })
  }
  return true
}
export default router

配置axios:

1.安装

npm install axios

2.在src中创建request文件夹,并创建http.js和api.js

3.http.js用于封装axios实例 代码如下:

// 在http.js中引入axios
import axios from 'axios'; // 引入axios
import { ElMessage } from 'element-plus'
const config={
    // `url` 是用于请求的服务器 URL
   url: '/api',
   // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
   // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
   baseURL: 'http://localhost:56030/api',
   // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
   // 如果请求话费了超过 `timeout` 的时间,请求将被中断
   timeout: 10000,
 }
const requests = axios.create(config);
//请求拦截器(可以在请求发出去之前,做一些事情)
requests.interceptors.request.use((config) => {
    return config;
  });
  //响应拦截器(在数据返回之后,做一些事情)
  requests.interceptors.response.use(
    (res) => {
      return res.data;
    },
    (err) => {
        console.log(err);
        ElMessage.error(err.response.data)
    }
    )
export default requests;

4.api.js用于对接口的统一管理 代码如下:

import requests from "./http";  //引入二次封装的axios
export const login = (params)=>requests({url:'/Account/login ',method:'post',data:params});
export const checktoken = (params)=>requests({url:'/Account/checktoken ',method:'post',data:params});

对路由和封装接口的使用

1.登录login.vue组件,这里只看用法即可。 代码如下:

<template>
  <el-card class="box-card">
    <el-text class="title" type="warning" size="large">Metadata科技屋</el-text>
    <div style="margin: 40px;"></div>
    <el-form label-position="top" label-width="100px" :model="formLabelAlign" style="max-width: 460px">
      <el-form-item label="账号">
        <el-input v-model="formLabelAlign.accountNumber" />
      </el-form-item>
      <el-form-item label="密码">
        <el-input v-model="formLabelAlign.password" type="password" />
      </el-form-item>
      <el-button class="loginbut" type="primary" @click="onSubmit">登录</el-button>
    </el-form>
  </el-card>
</template>
<script setup>
import { reactive } from 'vue'
import { login } from '../../request/api';
import { ElMessage } from 'element-plus'
import { useRouter } from 'vue-router';
const router = useRouter();
const formLabelAlign = reactive({
  accountNumber: 'admin',
  password: '123456'
})
const onSubmit = async () => {
  var token = await login(formLabelAlign)
  if (token) {
    // 存储 token    [Authorize(AuthenticationSchemes = "Bearer")]
    localStorage.setItem('token',"Bearer "+token);
    ElMessage({
      message: '登录成功',
      type: 'success',
    })
    // 字符串路径
    router.push('/');
  }
}
</script>
<style scoped>
.el-card {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
.box-card {
  width: 480px;
  height: 320px;
}
.title {
  position: absolute;
  left: 50%;
  transform: translate(-50%, -50%);
}
.loginbut {
  float: right;
}
</style>

登录成功后的路由跳转需要引用这句代码:

import { useRouter } from 'vue-router';
const router = useRouter();
 // 字符串路径
router.push('/');

main.js代码如下:

import { createApp } from 'vue'
// 图标和组件需要分开引入
import ElementPlus from 'element-plus';   // 引入 ElementPlus 组件
import 'element-plus/dist/index.css'
// Element Plus
import 'element-plus/theme-chalk/index.css'  // 引入 ElementPlus 组件样式
import 'element-plus/theme-chalk/dark/css-vars.css'
import { Edit } from '@element-plus/icons-vue'  // 按需引入 Icon 图标 
import  router  from './router/index'
import App from './App.vue'
const app =  createApp(App)
app.use(router)
app.component('Edit', Edit)
app.use(ElementPlus)  // 全局挂载 ElementPlus
app.mount('#app')

app.vue代码:

<script>
export default {
};
</script>
<template>
    <router-view></router-view>
</template>
<style scoped>
.common-layout
{
height: 100vh;
}
.el-container
{
  height: 100vh;
}
</style>

给出main.js代码和app.vue代码,可以更方便的看出路由的使用方式。

到此这篇关于Vue中Vue router和axios的封装使用教程的文章就介绍到这了,更多相关Vue router和axios的封装使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 7个适用于Vue 3的高颜值UI组件库

    7个适用于Vue 3的高颜值UI组件库

    这篇文章主要给大家分享介绍了7个适用于Vue 3的高颜值UI组件库,合理利用,又或者学习借鉴都是不错的选择,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • Element中的Cascader(级联列表)动态加载省\市\区数据的方法

    Element中的Cascader(级联列表)动态加载省\市\区数据的方法

    这篇文章主要介绍了Element中的Cascader(级联列表)动态加载省\市\区数据的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • 详解为element-ui的Select和Cascader添加弹层底部操作按钮

    详解为element-ui的Select和Cascader添加弹层底部操作按钮

    这篇文章主要介绍了详解为element-ui的Select和Cascader添加弹层底部操作按钮,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • vue3.0 vant popup渲染不出来问题及解决

    vue3.0 vant popup渲染不出来问题及解决

    这篇文章主要介绍了vue3.0 vant popup渲染不出来问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • vue-router路由参数刷新消失的问题解决方法

    vue-router路由参数刷新消失的问题解决方法

    本篇文章主要介绍了vue-router路由参数刷新消失的问题解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • VUE中常用的4种高级方法

    VUE中常用的4种高级方法

    provide/inject 是 Vue.js 中用于跨组件传递数据的一种高级技术,它可以将数据注入到一个组件中,然后让它的所有子孙组件都可以访问到这个数据,这篇文章主要介绍了VUE中常用的4种高级方法,需要的朋友可以参考下
    2023-05-05
  • Vue3.0 响应式系统源码逐行分析讲解

    Vue3.0 响应式系统源码逐行分析讲解

    这篇文章主要介绍了Vue3.0 响应式系统源码逐行分析讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)

    vue.js内部自定义指令与全局自定义指令的实现详解(利用directive)

    这篇文章主要给大家介绍了关于vue.js内部自定义指令与全局自定义指令的实现方法,vue.js中实现自定义指令的主要是利用directive,directive这个单词是我们写自定义指令的关键字,需要的朋友们下面跟着小编来一起学习学习吧。
    2017-07-07
  • 简单的Vue SSR的示例代码

    简单的Vue SSR的示例代码

    本篇文章主要介绍了简单的 Vue SSR的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • vue中轻量级模糊查询fuse.js使用方法步骤

    vue中轻量级模糊查询fuse.js使用方法步骤

    这篇文章主要给大家介绍了关于vue中轻量级模糊查询fuse.js使用方法的相关资料,Fuse.js是一个功能强大、轻量级的模糊搜索库,通过提供简单的 api 调用,达到强大的模糊搜索效果,需要的朋友可以参考下
    2024-01-01

最新评论