Vue Router
1.简介
用 Vue + Vue Router 创建单页应用非常简单:通过 Vue.js,我们已经用组件组成了我们的应用。当加入 Vue Router 时,我们需要做的就是将我们的组件映射到路由上,让 Vue Router 知道在哪里渲染它们。下面是一个基本的例子:
1 | <script src="https://unpkg.com/vue@3"></script> |
2.动态路由匹配
匹配模式 | 匹配路径 | $route.params |
---|---|---|
/users/:username | /users/eduardo | { username: 'eduardo' } |
/users/:username/posts/:postId | /users/eduardo/posts/123 | { username: 'eduardo', postId: '123' } |
响应路由参数变化
使用带有参数的路由时需要注意的是,当用户从 /users/johnny 导航到 /users/jolyne 时,相同的组件实例将被重复使用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会被调用。
方式一:使用watch监控参数
方式二:使用导航守卫beforeRouteUpdate
捕获所有路由(用于404)
1 | const routes = [ |
在参数中自定义正则
1 | const routes = [ |
确保**转义反斜杠(
\
)**,就像我们对\d
(变成\\d
)所做的那样,在 JavaScript 中实际传递字符串中的反斜杠字符。
可重复的参数
如果你需要匹配具有多个部分的路由,如 /first/second/third,你应该用 *(0 个或多个)和 +(1 个或多个)将参数标记为可重复:
1 | const routes = [ |
Sensitive 与 strict 路由配置
1 | const router = createRouter({ |
可选参数
你也可以通过使用 ? 修饰符(0 个或 1 个)将一个参数标记为可选:
1 | const routes = [ |
3.嵌套路由
这里的
<router-view>
是一个顶层的router-view
。它渲染顶层路由匹配的组件。同样地,一个被渲染的组件也可以包含自己嵌套的<router-view>
。例如,如果我们在User
组件的模板内添加一个<router-view>
:
1 | const routes = [ |
这里子路由中一定不要加/,如/profile
4.编程式导航
导航
声明式 | 编程式 |
---|---|
<router-link :to="..."> |
router.push(...) |
1 | // 字符串路径 |
注意:如果提供了 path,params 会被忽略,上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path :
当指定
params
时,可提供string
或number
参数(或者对于可重复的参数可提供一个数组)。任何其他类型(如undefined
、false
等)都将被自动字符串化。对于可选参数,你可以提供一个空字符串(""
)来跳过它。
替换
它的作用类似于
router.push
,唯一不同的是,它在导航时不会向 history 添加新记录,正如它的名字所暗示的那样——它取代了当前的条目。此时点击浏览器的返回按钮,不可以返回到先前的网页,因为被替换了
声明式 | 编程式 |
---|---|
<router-link :to="..." replace> |
router.replace(...) |
也可以直接在传递给 router.push
的 routeLocation
中增加一个属性 replace: true
:
1 | router.push({ path: '/home', replace: true }) |
前进
该方法采用一个整数作为参数,表示在历史堆栈中前进或后退多少步,类似于
window.history.go(n)
。
1 | // 向前移动一条记录,与 router.forward() 相同 |
5.命名视图
有时候想同时 (同级) 展示多个视图,而不是嵌套展示,例如创建一个布局,有
sidebar
(侧导航) 和main
(主内容) 两个视图,这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果router-view
没有设置名字,那么默认为default
。其实就是一个组件里展示多个路由组件
1 | <router-view class="view left-sidebar" name="LeftSidebar"></router-view> |
一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件。确保正确使用
components
配置 (带上 s):
1 | const router = createRouter({ |
6.重定向
重定向也是通过
routes
配置来完成,下面例子是从 `` 重定向到/index
:这样用户打开首页时,就会自动跳转到/index
1 | const routes = [{ path: '', redirect: '/index' }] |
重定向的目标也可以是一个命名的路由:
1 | const routes = [{ path: '/home', redirect: { name: 'homepage' } }] |
甚至是一个方法,动态返回重定向目标:
1 | const routes = [ |
相对重定向
也可以重定向到相对位置:
1 | const routes = [ |
别名
重定向是指当用户访问 /home 时,URL 会被 / 替换,然后匹配成 /。那么什么是别名呢?将 / 别名为 /home,意味着当用户访问 /home 时,URL 仍然是 /home,但会被匹配为用户正在访问 /。
1 | const routes = [{ path: '/', component: Homepage, alias: '/home' }] |
通过别名,你可以自由地将 UI 结构映射到一个任意的 URL,而不受配置的嵌套结构的限制。使别名以
/
开头,以使嵌套路径中的路径成为绝对路径。你甚至可以将两者结合起来,用一个数组提供多个别名:
1 | const routes = [ |
7.路由组件传参
在你的组件中使用
$route
会与路由紧密耦合,这限制了组件的灵活性,因为它只能用于特定的 URL。虽然这不一定是件坏事,但我们可以通过props
配置来解除这种行为:
我们可以将下面的代码
1 | const User = { |
替换成
1 | const User = { |
布尔模式
当 props 设置为 true 时,route.params 将被设置为组件的 props。
命名视图
对于有命名视图的路由,你必须为每个命名视图定义 props 配置:
1 | const routes = [ |
对象模式
当 props 是一个对象时,它将原样设置为组件 props。当 props 是静态的时候很有用。
1 | const routes = [ |
1 | //User组件声明属性 |
函数模式
你可以创建一个返回 props 的函数。这允许你将参数转换为其他类型,将静态值与基于路由的值相结合等等。
1 | { |
1 | //User组件 |
URL
/users/1?name=jyc&age=16
将传递{name: 'jyc',age:'16'}
作为 props 传给User
组件。
高级篇
(todo)