目录
一. 路由监听方式: 通过 watch 进行监听
1. 监听路由从哪儿来到哪儿去
2. 监听路由变化获取新老路由信息
3. 监听路由变化触发方法
4. 监听路由的 path 变化
5. 监听路由的 path 变化, 使用handler函数
6. 监听路由的 path 变化,触发methods里的方法
二. 路由监听方式:key是用来阻止“复用”的
三. 路由监听方式:通过vue-router的钩子函数
1. 组件内监听
2. 全局监听路由
🔽 参考资料
vue页面开发中,我们经常需要根据路由的变化去实现一些操作,那么vue.js中如何监听路由的变化呢?监听路由变化的方法都有哪些?这篇文章主要介绍了vue监听路由变化的几种方式小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
——👇 vue中路由参数的变化监听,这里总结了常用的几种方式 👇——
一. 路由监听方式: 通过 watch 进行监听
1. 监听路由从哪儿来到哪儿去
返回 “从哪里来” 和 “哪里去” 的路由信息
// 方式1、监听路由 $route 变化 export default{ watch: { // 监听,当路由发生变化的时候执行 $route(to, from){ console.log('路由变化了') console.log('当前页面路由:' + to); console.log('上一个路由:' + from); // console.log(from.path); // 从哪来 // console.log(to.path); // 到哪去 }, } }
复制
2. 监听路由变化获取新老路由信息
返回 “新” “老” 路由信息
// 方式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时,常规用法,只有值发生改变才会监听。
参考:Vue中watch(监听器)的用法详解(通俗易懂,简单明了)
3. 监听路由变化触发方法
// 方式3、监听路由 $route 变化,触发methods里的方法 export default{ watch: { // 监听,当路由发生变化的时候执行 '$route':'getPath' }, methods: { getPath(){ console.log(this.$route.path); } } }
复制
4. 监听路由的 path 变化
// 方式4、监听路由的 path 变化 export default{ watch: { // 监听,当路由发生变化的时候执行 '$route.path'(toPath, fromPath){ console.log('路由变化了') console.log('当前页面路由地址:' + toPath) console.log('上一个路由地址:' + fromPath) }, } }
复制
5. 监听路由的 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, // 第一次初始化渲染就可以监听到 } } }
复制
6. 监听路由的 path 变化,触发methods里的方法
// 方式6、监听路由的 path 变化,触发methods里的方法 export default{ watch: { // 监听,当路由发生变化的时候执行 '$route.path': 'getpath' }, methods: { getpath(){ console.log('路由变化了') } } }
复制
二. 路由监听方式:key是用来阻止“复用”的
Vue 为你提供了一种方式来声明“这两个元素是完全独立的——不要复用它们”。只需添加一个具有唯一值的 key 属性即可(Vue文档原话)
<router-view :key="key"></router-view> computed: { key(){ return this.$route.name !== undefined? this.$route.name +new Date(): this.$route +new Date() } }
复制
使用computed属性和Date()
可以保证每一次的key都是不同的,这样就可以如愿刷新数据了。
三. 路由监听方式:通过vue-router的钩子函数
1. 组件内监听
❓ 如何在组件中监听路由参数的变化?❓
当使用路由参数时,例如从 /user/foo 导航到 /user/bar,原来的组件实例会被复用。
因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。
那如果我们要在组件中监听路由参数的变化,就只能通过watch (监测变化) $route 对象,或使用 beforeRouteUpdate 的组件内守卫。
方式一: 通过watch 监听 $route
复制
const User = { template: '...', watch: { $route(to, from) { // 对路由变化作出响应... } } } 方式二:通过组件内的导航守卫
beforeRouteUpdate ,(和created(){}生命周期函数同级别)
复制
const User = { template: '...', beforeRouteUpdate(to, from, next) { // react to route changes... // don't forget to call next() } }
⏬ 通过vue-router的组件内钩子函数beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave进行监听
示例1:
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() }, }
复制
示例2:
<script> // 引入 Tabbar组件 import mTabbar from './components/Tabbar' import mTabbarItem from './components/TabbarItem' // 引入 vuex 的两个方法 import {mapGetters, mapActions} from 'vuex' export default { name: 'app', // 计算属性 computed:mapGetters([ // 从 getters 中获取值 'tabbarShow' ]), // 监听,当路由发生变化的时候执行 watch:{ $route(to,from){ if(to.path == '/' || to.path == '/Prisoner' || to.path == '/Goods' || to.path == '/Time' || to.path == '/Mine'){ /** * $store来自Store对象 * dispatch 向 actions 发起请求 */ this.$store.dispatch('showTabBar'); }else{ this.$store.dispatch('hideTabBar'); } } }, beforeRouteEnter (to, from, next) { // 在渲染该组件的对应路由被 confirm 前调用 // 不!能!获取组件实例 `this` // 因为当钩子执行前,组件实例还没被创建 }, beforeRouteUpdate (to, from, next) { // 在当前路由改变,但是该组件被复用时调用 // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候, // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。 // 可以访问组件实例 `this` }, beforeRouteLeave (to, from, next) { // 导航离开该组件的对应路由时调用 // 可以访问组件实例 `this` }, components:{ mTabbar, mTabbarItem }, data() { return { select:"Building" } } } </script>
复制
2. 全局监听路由
⏬ 通过vue-router的全局钩子函数beforeEach——this.$router.beforeEach
// 方式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 }
复制
🔽 参考资料
- Vue监听路由变化的几种方式小结
- Vue.js怎么监听路由变化
- Vue路由监听的方式
- Vue几种监听路由变化的方式