在 Vue 3 中,如果你想在 setup 函数中监听 URL 的变化,可以使用 Vue Router 的导航守卫(Navigation Guards)或者 Vue 的响应式 API 来实现。以下是两种常见的方法:

方法 1: 使用 Vue Router 的导航守卫

如果你的 Vue 3 应用使用了 Vue Router,你可以利用 Vue Router 提供的导航守卫来监听 URL 的变化。

  1. 全局守卫: 你可以在应用的入口文件中(通常是 main.jsmain.ts)设置全局守卫。

    javascript
    import { createRouter, createWebHistory } from 'vue-router'; const router = createRouter({ history: createWebHistory(), routes: [ // 定义路由 ] }); router.beforeEach((to, from, next) => { // 监听 URL 变化 console.log('路由变化:', from.path, '->', to.path); next(); }); export default router;
  2. 组件内守卫: 如果你只想在特定组件中监听 URL 变化,可以在该组件内使用 beforeRouteEnterbeforeRouteUpdate 守卫。

    javascript
    export default { beforeRouteEnter(to, from, next) { console.log('路由变化:', from.path, '->', to.path); next(); }, beforeRouteUpdate(to, from, next) { console.log('路由变化:', from.path, '->', to.path); next(); }, };

方法 2: 使用 Vue 的响应式 API 监听 window.location

如果你的应用没有使用 Vue Router,或者你只是想监听浏览器地址栏的变化,可以使用 Vue 的响应式 API 来监听 window.location 的变化。

  1. 使用 watchEffectwatch:

    javascript
    import { watchEffect, ref } from 'vue'; export default { setup() { const url = ref(window.location.href); watchEffect(() => { // 监听 URL 变化 console.log('URL 变化:', url.value); }); // 监听 window 的 popstate 事件(如用户点击浏览器的前进或后退按钮) window.addEventListener('popstate', () => { url.value = window.location.href; }); // 返回响应式数据 return { url }; } };

请注意,使用 watchEffectwatch 来监听 window.location 的变化可能需要手动处理一些特殊情况,比如用户使用浏览器的前进或后退按钮时,并不会触发 popstate 事件。此外,这种方法可能不如使用 Vue Router 的导航守卫那样方便和强大,特别是在复杂的单页应用中。

总的来说,选择哪种方法取决于你的应用是否使用了 Vue Router,以及你希望监听 URL 变化的具体场景。