通过上一篇文章已经通过vue-cli4.0创建好了vue项目,首先项目默认router配置文件和组件中使用及main.js中挂载如下
在src/router/index.js
路由配置文件中,首先通过import
引入vue
和vue-router
,然后创建路由列表routes
。然后通过Vue.use(VueRouter)
加载,通过const router = new VueRouter({ routes })
创建路由实例,最后导出router
。
然后在main.js
中引用router
,在vue实例中注册路由实例。
最后在组件中使用 router-link
组件来导航,通过传入 to
属性指定链接,
默认会被渲染成一个 标签。路由匹配到的组件将渲染在
中。
项目首页点击切换Home和About,注意浏览器地址栏中url变化。
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: () => import('../views/About.vue')
}
]
路由列表为一个数组,里面包含路由对象,一个基本路由对象包含:
path
:路径,在url输入的路径。
component
:组件,对应路径所需要渲染的组件。
// 此写法起到懒加载作用,当访问到这个页面时,才会加载此组件,起到优化作用。
component: () => import('../views/About.vue')
在src/router/index.js
路由列表中添加一个路由对象
const routes = [
...
{
// 动态路径参数 以冒号开头
path: '/page1/:param',
component: () => import('../views/page1.vue')
},
]
在src/views
中添加对应vue组件,page1.vue代码:
<template>
<div>
{{ $route.params.param }}
</div>
</template>
浏览器访问http://localhost:8080/#/page1/xixi
组件中$route
代表当前加载页面路由对象,里面包含一个params
参数,params
为一个对象,里面的para
就是路由对象path: '/page1/:param'
中的:param
。
增加路由对象
...
{
path: '/page2',
component: () => import('../views/page2.vue'),
children: [
{
path: 'page3',
component: () => import('../views/page3.vue')
}
]
},
...
children
为一个数组,里面包含着嵌套在page2
里面的子集页面。注意:children
中的path
最前面不需要写/
。
page2.vue
组件:
<template>
<div>
page2
<!-- /page2子集页面所对应的组件视图将渲染到<router-view>中。 -->
<router-view/>
</div>
</template>
page3.vue
组件:
<template>
<div>page3</div>
</template>
访问http://localhost:8080/#/page2/page3
路由列表
...
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: () => import('../views/About.vue')
},
...
App.vue
...
<router-link :to="{ name: 'Home' }">Home</router-link>
<router-link :to="{ name: 'About' }">About</router-link>
...
name
属性为路由到别名,
中to
属性变为绑定属性,值为一个object,name
值为路由对象中到name
值(别名)。
如果想在一个页面显示多个视图(比如:侧导航和主内容),并且每个视图显示在指定位置,就需要用到六命名视图。
App.vue
<template>
<div id="app">
<div id="nav">
<router-link :to="{ name: 'Home' }">Home</router-link> |
<router-link :to="{ name: 'About', params: { userID: 213 } }">About</router-link>
</div>
<router-view/>
<router-view name="main" />
</div>
</template>
...
在组件中建立多个
,指定name
属性用来区别,不指定默认为default
。
增加路由对象
{
path: '/name_page',
components: {
default: () => import('../views/page2.vue'),
main: () => import('../views/page3.vue')
}
},
一个视图使用一个组件渲染,因此对于同个路由,多个视图就需要多个组件。确保正确使用 components
配置 (带上 s
)
访问http://localhost:8080/#/name_page
增加路由对象
{
path: '/reset',
redirect: '/'
},
访问http://localhost:8080/#/reset
时,会跳转回http://localhost:8080/#/
重定向目标可以为别名和方法
{
path: '/reset',
redirect: { name: Home }
},
{
path: '/reset',
redirect: to => '/'
},
{
path: '/reset',
redirect: to => { name: Home }
},
“重定向”的意思是,当用户访问/a
时,URL 将会被替换成 /b
,然后匹配路由为 /b
,那么“别名”又是什么呢?
/a
的别名是 /b
,意味着,当用户访问 /b
时,URL 会保持为 /b
,但是路由匹配则为 /a
,就像用户访问 /a
一样。
给/
增加别名
{
path: '/',
name: 'Home',
component: Home,
alias: '/home'
},
访问http://localhost:8080/#/home
时,显示的为http://localhost:8080/#/
所对应的视图。
除了使用
创建a
标签来定义导航链接,我们还可以借助 router
的实例方法,通过编写代码来实现,也就是通过js跳转页面。
About.vue
组件增加一个button
按钮绑定back
事件
<template>
<div class="about">
<h1>This is an about page</h1>
<button @click="back">返回上一页</button>
</div>
</template>
<script>
export default {
methods: {
back () {
this.$router.go(-1);
}
}
}
</script>
this.$router
为main.js
中所注册的路由实例,go(-1)
代表后退一页,go(1)
表示前进一页,this.$router.back()
同样表示后退。
除此,还可以通过$router
跳转到指定路由:
// 跳转到/page2页面。
// push的值可以为字符串。
this.$router.push('/page2');
// 对象
this.$router.push({ path: '/page2' });
// 命名的路由(事先在/page路由设置name)
this.$router.push({ name: 'page2' });
如果我们到初始页面为home
页面,然后跳转到about
页面,在about
页面中通过push
跳转到page2
页面,那么当我们在page2
页面回退时则回退到about
页面。这时,介绍$router
的另一个方法replace
。
this.$router.replace('/page2');
push
的功能是在浏览历史中新增一个记录,而replace
则是把当前记录替换成目标记录,所以,当从about
页面执行replace
方法跳转到page2
页面后,再回退时当结果则是回退到home
页而不是about
页。
跳转页面中传递参数:
// 带查询参数,变成 /page2?param=123
this.$router.push({ path: '/page2', query: { param: 123 }})
跳转到之前配置的动态匹配路由,先给page1
添加一个name
属性
...
{
path: '/page1/:param',
name: 'page1',
component: () => import('../views/page1.vue')
},
...
// 跳转后到路由为 /page1/123
this.$router.push({ name: 'page1', params: { param: 123 }})
// es6模板语法
const param = 123;
this.$router.push({ path: `/page1/${name}` })
// 错误写法
this.$router.push({ path: '/page1', params: { param: 123 }}) ❌