<template> <div class="home"> <h2>首页</h2> </div> </template> <script lang="ts"> import Vue from ‘vue‘; import {Component} from "vue-property-decorator"; @Component({}) export default class Home extends Vue{ } </script>
import Vue from "vue"; import VueRouter from "vue-router"; Vue.use(VueRouter);// 安装插件 import Home from "../pages/Home.vue"; import Goods from "../pages/Goods.vue"; import User from "../pages/User.vue"; import Login from "../pages/Login.vue"; import NoPage from "../pages/NoPage.vue"; let routes=[ {path:"/home",component:Home}, {path:"/goods",component:Goods}, {path:"/user",component:User}, {path:"/login",component:Login}, {path:"/reg",component:()=>import("../pages/Reg.vue")}, {path:"/detail",component:(resolve:any)=>{require(["../pages/Detail.vue"],resolve)}}, {path:"*",component:NoPage}, {path:"/",redirect:"/home"}, ]; let router=new VueRouter({ mode:"history", routes }); export default router;
import router from "./plugins/router" new Vue({ render: h => h(App), router }).$mount(‘#app‘)
<router-view></router-view>
/* 全局守卫 */ router.beforeEach((to,from,next)=>{ console.log("全局前置守卫") next(); }) router.afterEach((to,from)=>{ console.log("全局后置守卫") }) // 路由独享守卫 {path:"/user",component:User,beforeEnter: (to:Route, from:Route, next:Function) => { console.log("路由独享前置守卫") next(); }},
import {Route} from "vue-router"; @Component({ /* 这里写自定义指令、过滤器、守卫钩子函数 */ beforeRouteEnter (to:Route, from:Route, next:Function) { // 由于写在装饰器中,钩子函数可以自动推测出to、from、next的类型,所以可以加类型也可以不加 console.log("组件内前置守卫") next(); } })
import {Route} from "vue-router"; @Component({ beforeRouteLeave (to:Route, from:Route, next:Function) { console.log("组件内后置守卫") next(); } })
{ "data":[ {"username":"wxm"} ] }
import axios from "axios"; export default class Home extends Vue{ mounted():void { axios({ url:"/data/user.json" // public中的数据可以直接访问 }).then( res=>console.log(res.data) ) } }
module.exports={ devServer:{ proxy:{ "/v3":{ target:"http://localhost:3000", changeOrigin:true } } } }
url:"/v3/homepage"
import axios, { AxiosRequestConfig, AxiosResponse } from "axios"; import router from ‘./router‘; import { TUser } from ‘@/types‘; //请求拦截器 axios.interceptors.request.use((config:AxiosRequestConfig):AxiosRequestConfig=>{ /* 抓取token,携带到响应头 显示loading */ let user:TUser=window.localStorage.getItem("user"); user=user?JSON.parse(user):""; config.headers={token:user?.token}// 携带到请求头 return config; },(error)=>{ return Promise.reject(error) }) //响应拦截器 axios.interceptors.response.use((response:AxiosResponse<any>):AxiosResponse<any>=>{ /* token过期,跳转login,保留当前地址 关闭loading */ // 判断如果有错误(token过期),并且当前路径不是login,则跳转到login页面,并且将当前的全路径带过去 if(response.data.err==2 && !router.currentRoute.fullPath.includes("/login")){ router.push({path:"/login",query:{path:router.currentRoute.fullPath}}); } return response; },(error)=>{ return Promise.reject(error) }) // 对外暴露 export default axios;
import axios from "../plugins/axios";
// 定义全局变量,重定义了Window接口 declare global{ interface Window{ axios(config:AxiosRequestConfig):AxiosPromise<any> } }
window.axios=axios;
import "./plugins/axios"
mounted():void { window.axios({ url:"/v3/homepage" }).then( res=>console.log(res.data) ) }
// 判断如果有错误(token过期),并且当前路径不是login,则跳转到login页面,并且将当前的全路径带过去 if(response.data.err==2 && !router.currentRoute.fullPath.includes("/login")){ router.push({path:"/login",query:{path:router.currentRoute.fullPath}}); }
<button @click="login">登录</button>
export default class Login extends Vue{ public login():void { window.axios({ url:"/api/login", method:"post", data:{username:"chenghao",password:"chenghao123"} }).then( res=>{ if(res.data.err==0){ // 种token到localStorage中 window.localStorage.setItem("user",JSON.stringify(res.data)) // 跳转到之前的页面 this.$router.replace(this.$route.query.path as string) } } ) } }