Python私教张大鹏 Vue Router 快速入门教程

2024-06-13 1433阅读

介绍

https://router.vuejs.org/zh/introduction

Python私教张大鹏 Vue Router 快速入门教程
(图片来源网络,侵删)

Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。功能包括:

  • 嵌套路由映射
  • 动态路由选择
  • 模块化、基于组件的路由配置
  • 路由参数、查询、通配符
  • 展示由 Vue.js 的过渡系统提供的过渡效果
  • 细致的导航控制
  • 自动激活 CSS 类的链接
  • HTML5 history 模式或 hash 模式
  • 可定制的滚动行为
  • URL 的正确编码

    安装

    pnpm add vue-router@4
    

    入门案例

    App.vue

      

    Hello App!

    Current route path: {{ $route.fullPath }}

    Go to Home Go to About

    在这个 template 中使用了两个由 Vue Router 提供的组件: RouterLink 和 RouterView。

    不同于常规的 标签,我们使用组件 RouterLink 来创建链接。这使得 Vue Router 能够在不重新加载页面的情况下改变 URL,处理 URL 的生成、编码和其他功能。我们将会在之后的部分深入了解 RouterLink 组件。

    RouterView 组件可以使 Vue Router 知道你想要在哪里渲染当前 URL 路径对应的路由组件。它不一定要在 App.vue 中,你可以把它放在任何地方,但它需要在某处被导入,否则 Vue Router 就不会渲染任何东西。

    上述示例还使用了 {{ $route.fullPath }} 。你可以在组件模板中使用 $route 来访问当前的路由对象。

    准备页面

    index.vue

      index
    
    

    about.vue

      about
    
    

    创建路由器实例

    路由器实例是通过调用 createRouter() 函数创建的:

    import { createMemoryHistory, createRouter } from 'vue-router'
    import HomeView from './HomeView.vue'
    import AboutView from './AboutView.vue'
    const routes = [
      { path: '/', component: HomeView },
      { path: '/about', component: AboutView },
    ]
    const router = createRouter({
      history: createMemoryHistory(),
      routes,
    })
    

    这里的 routes 选项定义了一组路由,把 URL 路径映射到组件。其中,由 component 参数指定的组件就是先前在 App.vue 中被 渲染的组件。这些路由组件通常被称为视图,但本质上它们只是普通的 Vue 组件。

    其他可以设置的路由选项我们会在之后介绍,目前我们只需要 path 和 component。

    这里的 history 选项控制了路由和 URL 路径是如何双向映射的。在演练场的示例里,我们使用了 createMemoryHistory(),它会完全忽略浏览器的 URL 而使用其自己内部的 URL。 这在演练场中可以正常工作,但是未必是你想要在实际应用中使用的。通常,你应该使用 createWebHistory() 或 createWebHashHistory()。我们将在不同的历史记录模式的部分详细介绍这个主题。

    注册路由器插件

    一旦创建了我们的路由器实例,我们就需要将其注册为插件,这一步骤可以通过调用 use() 来完成。

    createApp(App)
      .use(router)
      .mount('#app')
    

    或等价地:

    const app = createApp(App)
    app.use(router)
    app.mount('#app')
    

    和大多数的 Vue 插件一样,use() 需要在 mount() 之前调用。

    如果你好奇这个插件做了什么,它的职责包括:

    1. 全局注册 RouterView 和 RouterLink 组件。
    2. 添加全局 $router 和 $route 属性。
    3. 启用 useRouter() 和 useRoute() 组合式函数。
    4. 触发路由器解析初始路由。

    动态路由匹配

    带参数的动态路由匹配

    很多时候,我们需要将给定匹配模式的路由映射到同一个组件。例如,我们可能有一个 User 组件,它应该对所有用户进行渲染,但用户 ID 不同。在 Vue Router 中,我们可以在路径中使用一个动态字段来实现,我们称之为 路径参数

    const User = {
      template: 'User',
    }
    // 这些都会传递给 `createRouter`
    const routes = [
      // 动态字段以冒号开始
      { path: '/users/:id', component: User },
    ]
    

    现在像 /users/johnny 和 /users/jolyne 这样的 URL 都会映射到同一个路由。

    路径参数 用冒号 : 表示。当一个路由被匹配时,它的 params 的值将在每个组件中以 this.$route.params 的形式暴露出来。因此,我们可以通过更新 User 的模板来呈现当前的用户 ID:

    const User = {
      template: 'User {{ $route.params.id }}',
    }
    

    多个路径参数

    你可以在同一个路由中设置有多个 路径参数,它们会映射到 $route.params 上的相应字段。例如:

    匹配模式匹配路径$route.params
    /users/:username/users/eduardo{ username: 'eduardo' }
    /users/:username/posts/:postId/users/eduardo/posts/123{ username: 'eduardo', postId: '123' }

    除了 $route.params 之外,$route 对象还公开了其他有用的信息,如 $route.query(如果 URL 中存在参数)、$route.hash 等。你可以在 API 参考中查看完整的细节。

    捕获所有路由或 404 Not found 路由

    常规参数只匹配 url 片段之间的字符,用 / 分隔。如果我们想匹配任意路径,我们可以使用自定义的 路径参数 正则表达式,在 路径参数 后面的括号中加入 正则表达式 :

    const routes = [
      // 将匹配所有内容并将其放在 `$route.params.pathMatch` 下
      { path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound },
      // 将匹配以 `/user-` 开头的所有内容,并将其放在 `$route.params.afterUser` 下
      { path: '/user-:afterUser(.*)', component: UserGeneric },
    ]
    

    在参数中自定义正则

    当定义像 :userId 这样的参数时,我们内部使用以下的正则 ([^/]+) (至少一个不是斜杠 / 的字符)来从 URL 中提取参数。这很好用,除非你需要根据参数的内容来区分两个路由。想象一下,两个路由 /:orderId 和 /:productName,两者会匹配完全相同的 URL,所以我们需要一种方法来区分它们。最简单的方法就是在路径中添加一个静态部分来区分它们:

    const routes = [
      // 匹配 /o/3549
      { path: '/o/:orderId' },
      // 匹配 /p/books
      { path: '/p/:productName' },
    ]
    

    但在某些情况下,我们并不想添加静态的 /o /p 部分。由于,orderId 总是一个数字,而 productName 可以是任何东西,所以我们可以在括号中为参数指定一个自定义的正则:

    const routes = [
      // /:orderId -> 仅匹配数字
      { path: '/:orderId(\\d+)' },
      // /:productName -> 匹配其他任何内容
      { path: '/:productName' },
    ]
    

    现在,转到 /25 将匹配 /:orderId,其他情况将会匹配 /:productName。routes 数组的顺序并不重要!

    可重复的参数

    如果你需要匹配具有多个部分的路由,如 /first/second/third,你应该用 *(0 个或多个)和 +(1 个或多个)将参数标记为可重复:

    const routes = [
      // /:chapters ->  匹配 /one, /one/two, /one/two/three, 等
      { path: '/:chapters+' },
      // /:chapters -> 匹配 /, /one, /one/two, /one/two/three, 等
      { path: '/:chapters*' },
    ]
    

    这将为你提供一个参数数组,而不是一个字符串,并且在使用命名路由时也需要你传递一个数组:

    // 给定 { path: '/:chapters*', name: 'chapters' },
    router.resolve({ name: 'chapters', params: { chapters: [] } }).href
    // 产生 /
    router.resolve({ name: 'chapters', params: { chapters: ['a', 'b'] } }).href
    // 产生 /a/b
    // 给定 { path: '/:chapters+', name: 'chapters' },
    router.resolve({ name: 'chapters', params: { chapters: [] } }).href
    // 抛出错误,因为 `chapters` 为空
    

    这些也可以通过在右括号后添加它们与自定义正则结合使用:

    const routes = [
      // 仅匹配数字
      // 匹配 /1, /1/2, 等
      { path: '/:chapters(\\d+)+' },
      // 匹配 /, /1, /1/2, 等
      { path: '/:chapters(\\d+)*' },
    ]
    

    Sensitive 与 strict 路由配置

    默认情况下,所有路由是不区分大小写的,并且能匹配带有或不带有尾部斜线的路由。例如,路由 /users 将匹配 /users、/users/、甚至 /Users/。这种行为可以通过 strict 和 sensitive 选项来修改,它们既可以应用在整个全局路由上,又可以应用于当前路由上:

    const router = createRouter({
      history: createWebHistory(),
      routes: [
        // 将匹配 /users/posva 而非:
        // - /users/posva/ 当 strict: true
        // - /Users/posva 当 sensitive: true
        { path: '/users/:id', sensitive: true },
        // 将匹配 /users, /Users, 以及 /users/42 而非 /users/ 或 /users/42/
        { path: '/users/:id?' },
      ],
      strict: true, // applies to all routes
    })
    
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]