[Vue] watch 监听路由切换页面报错

描述

watch 函数监听路由变化,当路由参数发生变化之后,重新调用 fetchData 获取数据渲染页面。

A 页面切换到 B 页面时,A 页面的 watch 会被触发,导致报错。这是因为进入其他页面之前,已经捕捉到了路由变化,而又没有清除这个 watch 监听。

清除 watch

你可以在进入其他路由组件之前清除它,vue-router 提供了函数:onBeforeRouteLeave

file:[结合 onBeforeRouteLeave 清除 watch]
const route = useRoute();

const clearWatcher = watch(route, async (to, from) => {
  await fetchData(to.params.id);
});

onBeforeRouteLeave(() => {
  clearWatcher();
});

onUnmounted(() => {
  clearWatcher();
});

await fetchData(route.params.id);

根据官方文档的说法,watch 默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数。如果我没理解错的话,这就是如上诉所描述中那样,进入 B 页面之后,由于 route 数据源发生变化,里面的回调函数被执行,但是 watch 本身确实被清除,但是回调函数还在。

文档中也提供了如何清除副作用的方法,过程可能比较麻烦,但下面还有更简单的做法。

取消 watch 监听路由变化

调用 onBeforeRouteUpdate 函数,这个是可以知道路由参数变化的函数,里面传递回调执行我们重新获取数据的异步就行。这个我测试过,进入其他页面,不会执行它的回调,也就不会报错了,而且这种方式简单。

file:[使用 onBeforeRouteUpdate 监听路由参数变化]
const route = useRoute();

onBeforeRouteUpdate(async updateGuard => {
  await fetchData(updateGuard.params.id);
});

await fetchData(route.params.id);
posted @ 2023-10-13 17:43  Himmelbleu  阅读(217)  评论(0编辑  收藏  举报