失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > vue中watch监听路由传来的参数变化问题

vue中watch监听路由传来的参数变化问题

时间:2019-03-23 14:54:48

相关推荐

vue中watch监听路由传来的参数变化问题

vue中watch监听路由传来的参数变化

一个组件内写了个编程路由,通过交互触发

this.$router.push({

name: "Result",

query: {

// 发送搜索词给result

title: this.inputVal,

},

在接收参数的路由组件中watch内

watch: {

// 监视搜索词变化

"$route.query.title": {

immediate: true,

handler() {

this.search();

},

},

},

这样直接监视传来的参数有效

如果用data接收参数,在监视就没效在data内

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监听

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变化了,就一定会重新创建这个组件。

<router-view :key="$route.fullpath"></router-view>

方法二:导航守卫

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)

}

},

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监听路由传来的参数变化问题》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。