vue-router的使用教程
路由
路由就是,根据地址栏的路径,返回对应的页面
后端路由
node.js写法
前端路由
vue-router写法
router-link
默认渲染成带有正确链接的a标签,可以通过配置 tag 属性生成别的标签.。参考文档
|
|
例子2
|
|
|
|
路由传递参数(动态路由匹配)
路径参数params
path:'/user/:username'
,则this.$route.params.username
就是user/
后面的值
地址栏显示为:localhost:8080/#/user/王花花
直接传递参数
或者通过name
和params
传递路径参数
“路径参数”使用冒号 :
标记。当匹配到一个路由时,参数值会被设置到 this.$route.params
,可以在每个组件内使用。
查询参数query
/xxx?a=1&b=2
,则this.$route.query
就是问号后面的内容
地址栏显示为:localhost:8080/#/user/王花花?age=20
直接传递参数
或者通过name / path
和 query
传递参数
通过$route.query.xxx
获取查询参数
嵌套路由(子路由)
在配置routes时添加 children
!注意:children里path
前不要加/
可以使用append
在路径后面追加more,但是append
每次点击会重复追加
!注意:记得给父路由里router-view,否则子路由没有出口展示
通过命名路由可以简化路径的写法
原本的路径是/user/王花花
通过命名路由
可以将router-link
简写成
编程式导航
除了使用 <router-link>
创建 a 标签来定义导航链接,有时我们想点击一个按钮来切换页面,这时可以给按钮绑定@click=$router.push('/xxx')
,借助 router 的实例方法,通过编写代码来实现。$router.push(location, onComplete?, onAbort?)
注意:在 Vue 实例内部,你可以通过 $router
访问路由实例。因此你可以调用 this.$router.push
。$router
的相关方法:https://router.vuejs.org/zh/api/#router-aftereach
|
|
可以使用$router.push('/index')
,如果有参数的话,可以使用 $router.push({name:'index',params:{userId:12345}})
或者$router.push(\
/index/${userId}`)`
|
|
编程式导航 vs router-link
|
|
等同于
命名路由(给routes取名字name)
有时候,通过一个名称来标识一个路由显得更方便一些,特别是在链接一个路由,或者是执行一些跳转的时候。你可以在创建 Router 实例的时候,在 routes 配置中给某个路由设置名称。
要链接到一个命名路由,可以给 router-link 的 to 属性传一个对象:
这跟代码调用 router.push() 是一回事:
这两种方式都会把路由导航到 /user/123 路径。
命名视图(多个出口取名字)
有时候想在同一个页面上同时 (同级) 展示多个视图,而不是嵌套展示,例如创建一个布局,有 sidebar (侧边栏) 和 content (主内容) 两个视图,这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果 router-view 没有设置名字,那么默认为 default所对应的组件。
|
|
|
|
重定向(跳转)
当访问 /a时, 重定向到 /b
重定向的目标也可以是一个命名的路由:
路由按顺序从上到下,依次匹配。最后一个*
能匹配全部,因此要放在最后面!!!
响应路由参数的变化
当使用路由参数时,例如从
/user/王花花
导航到/user/李栓蛋
,由于路径都是/user/:username
,因此页面不会更新数据。想对路由参数的变化作出响应的话,你可以在组件中通过 watch (监测变化) $route 对象
|
|
导航守卫/导航钩子(路由改变时进行验证)
“导航”表示路由正在发生改变。
全局守卫文档:全局守卫
|
|
|
|
router.beforeEach
:当路由改变之前
to、from都是路由对象,相关api参考路由对象API
next()
:正常导航next(false)
:禁止导航next('/xxx')
:中断当前导航,跳转到/xxx
路由元信息及匹配
导航守卫里,验证方式太过单一
如何在未登录状态下,/admin
及/admin
下面的所有内容都无法访问?
我们可以在定义路由的时候可以配置 meta 字段
那么如何访问这个 meta 字段呢?
通过路由对象(to、from都是路由对象)的matched
属性,得到路由配置routes里的路由记录(是个数组);再通过.some()
方法遍历这个数组下的meta字段
meta的详细用法
|
|
如果是异步操作,可能还未获取到状态,就已经跳转了,因此异步验证异步状态需要改写成这样:
然后在登录页设置一下,让它登录后跳转回原来的页面
懒加载
路由懒加载
默认情况下,会将所有路由下的组件都打包在一个js文件下,文件体积太大。懒加载的作用是,将每个路由对应的组件分开打包成独立的js文件,只有当你跳转到该路由时,才加载相应的组件。
|
|
这样,Home组件会被打包成独立的js文件,只有跳转到/home
时才加载
把组件按组分块
|
|
这3个组件会被打包到同一个js文件里,当跳转到相应路由时,这3个组件一起加载
webpackChunkName用来指定生成的js文件的文件名,否则 `chunkFilename: “[name].[chunkhash:8].chunk.js” 中的 [name] 是一个自动分配的、可读性很差的id
最后,配置一下webpack,使其打包的js文件名不是随机乱码
router-view配合过渡动画/动态组件
确保使用顺序,最外层过渡动画,然后动态组件,最后router-view
!!主要,<router-view></router-view>
不能写成 <router-view />
$router vs $route
$router用于设置路由【$router里面是方法】
https://router.vuejs.org/zh/api/#router-%E5%AE%9E%E4%BE%8B%E5%B1%9E%E6%80%A7
- $router.push
- $router.replace
- $router.go
- $router.back
- $router.forward
- $router.beforeEach
路由对象$route,用于获取路由信息【$route里面是属性】
https://router.vuejs.org/zh/api/#%E8%B7%AF%E7%94%B1%E5%AF%B9%E8%B1%A1
- $route.path
- $route.params
- $route.query
- $route.fullPath
- $route.name
- $route.meta