VueRouter v4.x基础

377 阅读2分钟

让我们按照文档顺序来整理这份基础知识。

1. 入门

我们先将 <script src="https://unpkg.com/vue@next"></script> <script src="https://unpkg.com/vue-router@4"></script>放入html文件头部,这样我们就可以愉快的使用Vue和VueRouter。

创建Vue实例 Vue.createApp({})赋给常量const app,这样就行了,将其挂载到我们的htmldom中去,html部分<div id='app'></div>,然后挂载,app.mount('#app'),注意像挂载这行代码一定要放到最后。

创建一个VueRouter实例const router = VueRouter.craeterRouter({}),接着我们要将这个路由实例导入Vue中去,app.use(router)。我们开始配置路由,配置对象中:

{history: VueRouter.createWebHash(),routes:[{path:'xx路径',component:xx组件}]},history后面第10我们再来说是什么,routes路由配置的数据都在这,像是路径,映射的组件,命名,参数等都是写在这里。

到此我们的配置都已经完成了,那么比如说我们上面写了xx路径,xx组件,实际场景是怎么用?

首先,我们用 组件导航<router-link to='xx路径'/>(与a标签相似,其可以在不重新加载页面下更改url),然后我们使用 组件视图<router-view>(就像一个占位符)来作为组件导航的出口 他所映射的组件模板里写了什么就会显示在组件视图中去。

对于setup函数访问路由(暂时忽略)。

如果有点模糊,可以对照这张图找到相应代码,不一样的地方可以先忽略,不用在意。

image.png

2. 动态路由匹配

什么是动态路由匹配呢?

在许多用户中,每个用户的id是不一样的,这时候路径相同部分为静态,而不一样的部分就是动态的,我们要用方法来使得这不一样的部分变为动态。正确说法就是路径参数

在路由配置当中,路径节点即path下,可以在最后添加:xx表示这部分为路径参数。 { path: '/users/:id', component: User }

响应路由参数的变化?

当我们跳转路由,我们是可以监测其变化的以及做出响应,使用this.$watch要在created钩子函数中调用。

还可以使用beforeRouteUpdate导航守卫,来对路由变化做出响应。

捕获所有路由或404 Not found路由为路由的匹配的语法(忽略)

3. 路由的匹配语法(暂时忽略)

4. 嵌套路由

顾名思义,路由中嵌套着路由,我们在router-view中渲染一个组件,而这个组件模板中不仅可以渲染元素其他内容,还可以再放置router-view,而这个嵌套的路由视图,就是这个组件的路由配置中对应的children属性

{
    path: '/user/:id',
    component: User,
    children: [
      {
        // 当 /user/:id/profile 匹配成功
        // UserProfile 将被渲染到 User 的 <router-view> 内部
        path: 'profile',
        component: UserProfile,
      },
      {
        // 当 /user/:id/posts 匹配成功
        // UserPosts 将被渲染到 User 的 <router-view> 内部
        path: 'posts',
        component: UserPosts,
      },
    ],
  },

根据你的需要你可以不断嵌套,它跟routes本身一样,是一个数组。

5. 编程式导航

像router-link这种组件导航是声明式, 而直接使用router的方法,例如.push这种是编程式。

.push和组件导航一致, .replace替换当前历史记录,不会添加新记录, .go(num)你可以跳转一个数字,匹配相应的次数,当次数超过不匹配,静默失败。

编程式要使用我们需要在方法中去调用它。例如我们有一个按钮<button @click='usepush'>点我</button>,在对应的组件使用methods节点,即const xx组件 = {template:'<div>xx组件</div>',methods:{usepush(){router.push('xx路径')}}}

6. 命名路由

前面提到我们在配置路由时,可以给路由一个名字,

{ path: '/user/:username', name: 'user', component: User }其中name属性就是命名路由了,它的作用就是当我们路由导航时不是又重复了写path,有了它我们可以使用name,但是得先将其变为能够识别js表达式的方式,使用:to,这样就可以传一个对象了,对象中就可以使用name这个属性,以及参数等其他

<router-link :to="{ name: 'user', params: { username: 'erina' }}">

7. 命名视图

当有多个组件视图,我们的组件就不知道对应哪个,要准确对应,就要使用命名视图。 <router-view name='xx'>这个name对应路由配置中的components属性(注意是多了s),其为一个对象,对于使用default即为默认属性,将匹配没有名字name的路由出口,当名:组件一致的化,可以简写。

8. 重定向和别名

我们有这样一个路由 { path: '/home', component:home }

使用重定向redirect { path: '/home', redirect: '/' }

也就是说当路径为/home时,它会跳转为根/路径,然后匹配的组件为home

别名alias

增加一个alias属性, { path: '/about', component:about, alias:'/abme' },当我们输入/abme和/about是一样的。

9. 路由组件传参

我们想要呈现路由的数据时,使用$route,但这样会使得与路由紧密耦合。于是使用props来解决,在组件中加入prop属性节点,它将传递对应的参数例如id就会传入$route.params.id,我们还要在路由配置中开启props为true

这就是布尔模式,当props设置为true时,route.params将被设置为组件的props。

如果我们命名了视图,那么相对应的props也要匹配,也就是说命名多少组件,就多少个props。

{
    path: '/user/:id',
    components: { default: User, sidebar: Sidebar },
    props: { default: true, sidebar: false }
  }

对象模式,props是一个对象时,它的设置是组件的propsprops: { newsletterPopup: false }说的是组件的props为newsletterPopup,值为false

函数模式,将会将route作为参数传入,这样之前$route能使用的,在这里也可以直接使用。

10. 不同的历史模式

history:createWebHashHistory()使用的是,Hash模式,它会在地址栏上出现#,createWebHistory()使用的是,H5模式,则不会有#但需要我们对于服务器配置