路由守卫也叫路由钩子函数,它是在路由跳转过程中调用的函数,通过路由守卫可获取路由信息和阻止路由跳转。
beforeRouteEnter()、beforeRouteLeave()、beforeUpdate()
export default {
name: "About",
data() {
return {
keyword: ""
}
},
methods: {
search() {
// 点击搜索按钮时,跳转到搜索页(当前页)
this.$router.push("/search");
// 如果当前页直接跳转当前页会报错
// 原因:原路由url和新路由url完全一致,会报错,路由避免重复跳转
// 解决方案:在路由跳转时传入一个参数,参数不同就不会报错
this.$router.push("/search?key=" + this.keyword)
}
},
// 在组件中有三个路由首位函数
beforeRouteEnter(to, from, next) {
// 在路由跳转到到这一页之前,执行这个函数
console.log("路由即将进入about");
// 默认,这个守卫函数会阻止路由跳转到这一页
console.log(from.path, to.path);
next();
},
beforeRouteLeave(to, from, next) {
// 在路由将要从这一页离开之前,执行这个函数
// 默认,这个守卫函数会阻止路由离开
next(); //允许路由离开
},
beforeEouteUpdate(to, from, next) {
// 当路由更新之前,执行这个函数,当前页跳转到当前页表示路由更新
console.log("路由更新");
},
}
beforeEach()、afterEach()
全局路由守卫是通过路由配置对象router调用
// 全局路由守卫通过路由配置对象router调用
router.beforeEach(function(to, from, next) {
console.log("全局守卫:路由跳转之前");
next()
})
router.afterEach(function() {
console.log("全局守卫:路由跳转之后");
// 路由跳转后调用此函数,不需要next,无法拦截路由
})
beforeEnter()
单个路由守卫是在作为路由的配置对象中,只对当前路由起效
const routes = [{
path: '/',
name: 'home',
component: HomeView,
// 单个路由守卫写在路由的配置对象中,只能对当前路由起效,是对象中函数
beforeEnter: (to, from, next) => {
console.log("主页守卫:", from.path, to.path);
next()
}
}
]
next( vm=>{ console.log(vm) })
报错:NavigationDuplicated: Avoided redundant navigation to current location: “/about?page=5”.
报错原因:原路由url和新路由url完全一致,会报错,路由避免重复跳转
解决方案1:在/src/router/index.js中添加如下代码:原理是捕获push函数报错,不抛出错误
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => {
//throw(err) // 抛出错误,控制台会显示错误信息, 如果不抛出,控制台不会报错
return err;
})
}
解决方案2:在路由跳转时传入一个参数,参数不同就不会报错
this.$router.push("/search?key=" + this.keyword)
在vue项目中不能直接发送ajax请求,会被同源请求策略拦截,需要使用跨域代理器
ajax请求需要跨域的话,需要在vue.config.js中添加代理配置。以下是脚手架5.x版本的配置代码:
onst { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
publicPath: '/', // 启动页地址
outputDir: 'dist', // 打包的目录
lintOnSave: true, // 在保存时校验格式
productionSourceMap: false, // 生产环境是否生成 SourceMap
devServer: {
open: true,
host: 'localhost',
port: 8080,
proxy: {
"/myDouyu": {
target: "http://open.douyucdn.cn",
changeOrigin: true,
pathRewrite: {
"^/myDouyu": ""
}
}
}
}
})
在组件中的created钩子函数中使用ajax请求。
<script>
export default {
name: 'HomeView',
created() {
fetch("/myDouyu/api/RoomApi/live?page=1").then(res => {
res.json().then(res => {
console.log(res.data);
})
})
},
}
</script>
cnpm i axios --save
import axios from ‘axios’;
2.3.1.3 在当前组件的函数发起ajax请求
axios.get("/myDouyu/api/RoomApi/live", {
params: {
page: 1
}
}).then(res => {
console.log(res.data);
})
cnpm i axios --save
import axios from ‘axios’;
Vue.prototype.$axios = axios;
this.$axios.get("/myDouyu/api/RoomApi/live", {
params: {
page: 1
}
}).then(res => {
console.log(res.data.data);
})
props属性验证写法,props的值是一个对象,对象中的键是属性名,值是属性的限制条件。组件标签自定义属性传值时要根据属性验证的数据类型传值,不然会报错。
export default {
name: 'HelloWorld',
props: {
msg: String
}
}