vue中watch监听路由传来的参数变化
一个组件内写了个编程路由,通过交互触发
1 2 3 4 5 6 | this .$router.push({ name: "Result" , query: { // 发送搜索词给result title: this .inputVal, }, |
在接收参数的路由组件中watch内
1 2 3 4 5 6 7 8 9 | watch: { // 监视搜索词变化 "$route.query.title" : { immediate: true , handler() { this .search(); }, }, }, |
这样直接监视传来的参数有效
如果用data接收参数,在监视就没效在data内
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | data() { return { searchVal: this .$route.query.title, } } watch: { // 监视搜索词变化 searchVal: { immediate: true , deep: true , handler() { console.log( "a" ); this .search(); }, }, }, |
深度监视也无效
vue-router如何响应路由参数的变化(watch监听|导航守卫)
什么是路由参数的变化
当使用路由参数时,例如从 /user/foo
导航到 /user/bar
,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。
监测路由参数变化的方法(watch监听|导航守卫)
方法一watch监听
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | watch: { // watch的第一种写法 $route (to, from) { console.log(to) console.log(from) } }, watch: { // watch的第二种写法 $route: { handler (to, from){ console.log(to) console.log(from) }, // 深度观察监听 deep: true } }, watch: { // watch的第三种写法 '$route' : 'getPath' }, methods: { getPath(to, from){ console.log( this .$route.path); } }, ---------------------------------------------------------------- 举例: watch: { // 方法1 //监听路由是否变化 '$route' (to, from) { if (to.query.id !== from.query.id){ this .id = to.query.id; this .init(); //重新加载数据 } } } //方法 2 设置路径变化时的处理函数 watch: { '$route' : { handler: 'init' , immediate: true } 为了实现这样的效果可以给router-view添加一个不同的key,这样即使是公用组件,只要url变化了,就一定会重新创建这个组件。 |
方法二:导航守卫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | beforeRouteEnter (to, from, next) { console.log( 'beforeRouteEnter被调用:在渲染该组件的对应路由被 confirm 前调用' ) // 在渲染该组件的对应路由被 confirm 前调用 // 不!能!获取组件实例 `this` 因为当守卫执行前,组件实例还没被创建 // 可以通过传一个回调给 next来访问组件实例。在导航被确认的时候执行回调,并且把组件实例作为回调方法的参数。 next(vm => { // 通过 `vm` 访问组件实例 console.log(vm) }) }, // beforeRouteEnter 是支持给 next 传递回调的唯一守卫。 // 对于 beforeRouteUpdate 和 beforeRouteLeave 来说,this 已经可用了,所以不支持传递回调,因为没有必要了。 beforeRouteUpdate (to, from, next) { // 在当前路由改变,但是该组件被复用时调用 // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候, // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。 // 可以访问组件实例 `this` console.log( 'beforeRouteUpdate被调用:在当前路由改变,但是该组件被复用时调用' ) next() }, beforeRouteLeave (to, from, next) { // 导航离开该组件的对应路由时调用 // 可以访问组件实例 `this` const answer = window.confirm( '是否确认离开当前页面' ) if (answer) { console.log( 'beforeRouteLeave被调用:导航离开该组件的对应路由时调用' ) next() } else { next( false ) } }, |
到此这篇关于vue中watch监听路由传来的参数变化的文章就介绍到这了,更多相关vue watch监听路由内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!