• vue-router4之组合式API


    专栏目录请点击

    访问当前路由

    我们在setup函数中我们用useRouter来访问this.$router,使用useRoute来访问this.$route

    import { useRouter, useRoute } from 'vue-router'
    
    export default {
      setup() {
        const router = useRouter()
        const route = useRoute()
    
        function pushWithQuery(query) {
          router.push({
            name: 'search',
            query: {
              ...route.query,
            },
          })
        }
      },
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    其中route 是一个响应式的对象,所以我们可以对他的任何属性进行监听,但是应该尽量避免监听整个对象,应该直接监听希望改变的参数

    import { useRoute } from 'vue-router'
    import { ref, watch } from 'vue'
    
    export default {
      setup() {
        const route = useRoute()
        const userData = ref()
    
        // 当参数更改时获取用户信息
        watch(
          () => route.params.id,
          async newId => {
            userData.value = await fetchUser(newId)
          }
        )
      },
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    导航守卫

    在组合式api中只有离开守卫和更新守卫

    import { onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
    import { ref } from 'vue'
    
    export default {
      setup() {
        // 与 beforeRouteLeave 相同,无法访问 `this`
        onBeforeRouteLeave((to, from) => {
          const answer = window.confirm(
            'Do you really want to leave? you have unsaved changes!'
          )
          // 取消导航并停留在同一页面上
          if (!answer) return false
        })
    
        const userData = ref()
    
        // 与 beforeRouteUpdate 相同,无法访问 `this`
        onBeforeRouteUpdate(async (to, from) => {
          //仅当 id 更改时才获取用户,例如仅 query 或 hash 值已更改
          if (to.params.id !== from.params.id) {
            userData.value = await fetchUser(to.params.id)
          }
        })
      },
    }
    
    • 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

    useLink

    import { RouterLink, useLink } from 'vue-router'
    import { computed } from 'vue'
    
    export default {
      name: 'AppLink',
    
      props: {
        // 如果使用 TypeScript,请添加 @ts-ignore
        ...RouterLink.props,
        inactiveClass: String,
      },
    
      setup(props) {
        const { route, href, isActive, isExactActive, navigate } = useLink(props)
    
        const isExternalLink = computed(
          () => typeof props.to === 'string' && props.to.startsWith('http')
        )
    
        return { isExternalLink, href, navigate, isActive }
      },
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    postgresql源码学习(37)—— 备份还原① - do_pg_start_backup函数
    虚拟机的创建
    在 vue-cli 构建的项目中配置使用资源CDN,加速我们的项目
    Yapi 1.10.3迁移踩坑记
    C++算法前缀和的应用:得分最高的最小轮调的原理、源码及测试用例
    DAY06_瑞吉外卖——用户地址簿功能&菜品展示&购物车&下单
    vue3事务管理案例、组件基础总结案例
    windows下安装IntelliJIDEA
    C++提高编程:05 STL- 常用算法
    vue2个人博客项目遇到的问题
  • 原文地址:https://blog.csdn.net/youhebuke225/article/details/125548917