路由,对于大多数单页面应用,都推荐使用官方支持的 vue-router 库。更多细节可以看 vue-router 文档https://router.vuejs.org/。以下为简单实现路由的代码:
写html
import Vue from 'vue'//引入vue
import VueRouter from 'vue-router'//引入vue路由组件
import one from 'one.vue'
import two from 'two.vue'
import three from 'three.vue'
Vue.use(VueRouter)//使用路由组件
export default new VueRouter ({
routes: [
{
path: '/one',//对应html中的to="/one"路径
component: one//跳转到one组件下
},
{
path: '/tow',
component: tow
},
{
path: '/three',
component: three
},
{
path: '/',//重定向路由,即当打开页面时,重定向到哪个路径下
redirect: '/one'
}
]
})
动态路由匹配
我们经常需要把某种模式匹配到的所有路由,全都映射到同个组件。例如,我们有一个 User 组件,对于所有 ID 各不相同的用户,都要使用这个组件来渲染。那么,我们可以在 vue-router 的路由路径中使用“动态路径参数”(dynamic segment) 来达到这个效果:
html:
一个“路径参数”使用冒号 : 标记。当匹配到一个路由时,参数值会被设置到 this.$route.params,可以在每个组件内使用。于是,我们可以更新 User 的模板,输出当前用户的 ID:
const User = {
template: '
嵌套路由
我们经常将动态路由和嵌套路由共同使用,嵌套路由即是在原路由的基础上增加一个 children ,children 是一个数组.并且我们还需要在原来的组件上添加< router-view >来渲染 chlidren 里面的路由。实例:
html
js
定义模板
const User = {
template: `
const UserHome = { template: '
const router = new VueRouter({
routes: [
{ path: '/user/:id', component: User,
children: [
{ path: '', component: UserHome },//默认匹配的路径
{ path: 'profile', component: UserProfile },//当点击/user/foo/profile。匹配到id为profile时,跳转UserProfile模板
{ path: 'posts', component: UserPosts }//当点击/user/foo/posts。匹配到id为profile时,跳转UserPosts模板
]
}
]
})
const app = new Vue({ router }).$mount('#app')
编程式的导航
除了使用
#router.push(location, onComplete?, onAbort?)
注意:在 Vue 实例内部,你可以通过 $router 访问路由实例。因此你可以调用 this.$router.push。
想要导航到不同的 URL,则使用 router.push 方法。这个方法会向 history 栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的 URL。
当你点击
声明式:
该方法的参数可以是一个字符串路径,或者一个描述地址的对象。例如:
// 字符串
router.push('home')
// 对象
router.push({ path: 'home' })
// 命名的路由
router.push({ name: 'user', params: { userId: 123 }})
// 带查询参数,变成 /register?plan=private
router.push({ path: 'register', query: { plan: 'private' }})
注意:如果提供了 path,params 会被忽略,上述例子中的 query 并不属于这种情况。取而代之的是下面例子的做法,你需要提供路由的 name 或手写完整的带有参数的 path:
const userId = 123
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user
同样的规则也适用于 router-link 组件的 to 属性。实例:
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
const Home = { template: '
const router = new VueRouter({
mode: 'history',
base: __dirname,
routes: [
{ path: '/', name: 'home', component: Home },
{ path: '/foo', name: 'foo', component: Foo },
{ path: '/bar/:id', name: 'bar', component: Bar }
]
})
new Vue({
router,
template: `
Current route name: {{ $route.name }}
路由介绍就告一段落了,来看看视图
命名视图,有时候想同时(同级)展示多个视图,而不是嵌套展示,例如创建一个布局,有 sidebar(侧导航) 和 main(主内容) 两个视图,这个时候命名视图就派上用场了。你可以在界面中拥有多个单独命名的视图,而不是只有一个单独的出口。如果 router-view 没有设置名字,那么默认为 default。
当我们的视图如上时,我们会发现每一个路由被渲染了两次,所以我们需要为视图命名
var Foo = { template: '