watch监听vue-router路由变化的方法
普通方式
直接在组件中使用
// 方式1、监听路由 $route 变化
export default{
watch: { // 监听,当路由发生变化的时候执行
$route(to, from){
console.log('路由变化了')
console.log('当前页面路由:' + to);
console.log('上一个路由:' + from);
// console.log(from.path); // 从哪来
// console.log(to.path); // 到哪去
},
}
}
或者使用handler函数
// 方式2、监听路由 $route 变化, 使用handler函数
export default{
watch: { // 监听,当路由发生变化的时候执行
'$route': { // $route可以用引号,也可以不用引号
handler(to, from){
console.log('路由变化了')
console.log('当前页面路由:' + to); //新路由信息
console.log('上一个路由:' + from); //老路由信息
},
deep: true, // 深度观察监听
immediate: true, // 第一次初始化渲染就可以监听到
}
}
}
如果我们需要在最初绑定值的时侯,也执行监听函数,则就需要用到immediate属性。
当设置immediate属性为true时,无论值是否发生改变,时刻都会监听;
当设置immediate属性为false时,常规用法,只有值发生改变才会监听。
或者将监听变化赋予一个方法:
// 方式3、监听路由 $route 变化,触发methods里的方法
export default{
watch: { // 监听,当路由发生变化的时候执行
'$route':'getPath'
},
methods: {
getPath(){
console.log(this.$route.path);
}
}
}
监听路由中path的变化
// 方式4、监听路由的 path 变化
export default{
watch: { // 监听,当路由发生变化的时候执行
'$route.path'(toPath, fromPath){
console.log('路由变化了')
console.log('当前页面路由地址:' + toPath)
console.log('上一个路由地址:' + fromPath)
},
}
}
监听路由的 path 变化, 使用handler函数
// 方式5、监听路由的 path 变化, 使用handler函数
export default{
watch: { // 监听,当路由发生变化的时候执行
'$route.path': {
handler(toPath, fromPath){
console.log('路由变化了')
console.log('当前页面路由地址:' + toPath)
console.log('上一个路由地址:' + fromPath)
},
deep: true, // 深度监听
immediate: true, // 第一次初始化渲染就可以监听到
}
}
}
监听路由的 path 变化,触发methods里的方法
// 方式6、监听路由的 path 变化,触发methods里的方法
export default{
watch: { // 监听,当路由发生变化的时候执行
'$route.path': 'getpath'
},
methods: {
getpath(){
console.log('路由变化了')
}
}
}
setup
在组合API中的外部文件里面,我们一般这么操作
import {useRoute} from 'vue-router';
export default function useSomeFn() {
const route = useRoute();
// 监听路由name
watch(
() => route.name,
(newVal, oldVal) => {
console.log(newVal, oldVal);
}
);
}
通过vue-router的钩子函数
通过组件内的导航守卫
const User = {
template: '...',
beforeRouteUpdate(to, from, next) {
// react to route changes...
// don't forget to call next()
}
}
通过vue-router的组件内钩子函数beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave进行监听
export default{
// 监听,当路由发生变化的时候执行
beforeRouteEnter(to, from, next){
// 在渲染该组件的对应路由被确认前调用这个钩子,
// 不!能!获取组件实例 `this`
// 因为当钩子执行前(也就是说,我们使用的是进入路由之前的钩子),那时组件实例还没被创建,所以不能获取this,自然这里就不能使用this
console.log(this) // 结果为:undefined
console.log('beforeRouteEnter')
next()
},
// 监听,当路由发生变化的时候执行
beforeRouteUpdate(to, from, next){
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
// 可以访问组件实例 `this`
console.log(this) // 可以访问this
console.log('beforeRouteUpdate')
next()
},
// 监听,当路由发生变化的时候执行
beforeRouteLeave(to, from, next){
// 导航离开当前路由的时候被调用,this可以被访问到
console.log(this) // 可以访问组件实例 `this`
console.log('beforeRouteLeave')
next()
},
}
全局监听路由
// 方式1、在App.vue的create中进行全局路由监听
export default {
name: 'App',
created() {
this.$router.beforeEach((to, from, next) => {
console.log(to);
console.log(from);
next()
})
}
}
// 方式2、在路由文件(/router/index.js)中进行全局路由监听
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
let routes = [
{
path: '/login',
component: resolve => require(['@/views/login'], resolve),
},
]
let router = new Router({
mode: 'history', // 去掉 url 中的 #
scrollBehavior: () => ({ y: 0 }),
base: process.env.VUE_APP_BASE_DOMAIN,
routes,
})
router.beforeEach((to, from, next) => {
console.log(to);
console.log(from);
next()
})
export {
routes
router
}