什么是路由?
后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源;
前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现;
在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由);
vue路由的基本使用
1. 导入 vue-router 组件类库:
<!-- 导入 vue-router 组件类库 -->
<script src="./lib/vue-router-2.7.0.js"></script>
2. 使用 router-link 组件来导航
<!-- 使用 router-link 组件来导航 -->
<router-link to="/login" tag='span'>登录</router-link>
<router-link to="/register">注册</router-link>
3. 使用 router-view 组件来显示匹配到的组件
<!-- 使用 router-view 组件来显示匹配到的组件 -->
<router-view></router-view>
4. 创建使用`Vue.extend`创建组件
// 4.1 使用 Vue.extend 来创建登录组件
var login = Vue.extend({
template: '<h1>登录组件</h1>'
});
// 4.2 使用 Vue.extend 来创建注册组件
var register = Vue.extend({
template: '<h1>注册组件</h1>'
});
5. 创建一个路由 router 实例,通过 routers 属性来定义路由匹配规则
// 创建一个路由 router 实例,通过 routers 属性来定义路由匹配规则
var router = new VueRouter({
routes: [
{ path: '/login', component: login },
{ path: '/register', component: register }
]
});
6. 使用 router 属性来使用路由规则
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
router: router // 使用 router 属性来使用路由规则
});
在路由组件传参
<!-- router-link 默认渲染为一个a 标签,可以使用tag指定标签 ,查询字符串?之后的,给路由传递参数,则 不需要修改 路由规则的 path 属性 -->
<router-link to="/user/1?name=Bob" tag='span'></router-link>
<router-view></router-view>
//在规则中定义参数:
{ path: '/user/:id', component: user }
//通过 `this.$route.params`来获取路由中的参数:
var user= Vue.extend({
template: '<h1>注册组件 --- {{this.$route.params.id}}</h1>'
});
但是,上面的写法在组件中使用$router.*,会使组件与该组件使用的路由之间有高度的耦合,这样该组件只能在特点的url上才能使用,严重降低了代码的复用性,因此我们在下面使用props进行解耦
<router-link to="/user/1?name=Bob" tag='span'></router-link>
<router-view></router-view>
// 在规则中定义参数,props 设置为true, $route.params 将会被设置为组件属性
{ path: '/user/:id', component: user ,props: true}
// 如果 props 是一个对象,它会被按原样设置为组件属性。当 props 是静态的时候有用
{ path: '/A', component: componentA ,props: {obj: 'obj'}}
// props是一个函数。这样你便可以将参数转换成另一种类型,将静态值与基于路由的值结合等等
{ path: '/B', component: componentB ,props: (arg)=>({query: $route.query});}
var user= Vue.extend({
props: ['id'],
template: '<h1>注册组件 --- {{id}}</h1>'
});
使用Children实现路由嵌套
<div id="app">
<router-link to="/account">Account</router-link>
<router-view></router-view>
</div>
<script>
// 父路由中的组件
const account = Vue.extend({
template: `<div>
这是account组件
<router-link to="/account/login">login</router-link> |
<router-link to="/account/register">register</router-link>
<router-view></router-view>
</div>`
});
// 子路由中的 login 组件
const login = Vue.extend({
template: '<div>登录组件</div>'
});
// 子路由中的 register 组件
const register = Vue.extend({
template: '<div>注册组件</div>'
});
// 路由实例
var router = new VueRouter({
routes: [
{ path: '/', redirect: '/account/login' }, // 使用 redirect 实现路由重定向
{
path: '/account',
component: account,
children: [ // 通过 children 数组属性,来实现路由的嵌套
{ path: 'login', component: login }, // 注意,子路由的开头位置,不要加 / 路径符
{ path: 'register', component: register }
]
}
]
});
// 创建 Vue 实例,得到 ViewModel
var vm = new Vue({
el: '#app',
data: {},
methods: {},
components: {
account
},
router: router
});
</script>
命名路由
<router-link to="{name: 'user', params: { userId: 123 }}">User</router-link>
var router = new VueRouter({
routes:[
{
path: '/user',
name: 'user',
component: user
}
]
})
命名视图: 同级展示多个视图,而不是嵌套展示
<router-view name="a"></router-view>
<router-view name="b"></router-view>
<script>
var router = new VueRouter({
routes: [
{
path: '/', components: {
default: header,
a: componentA,
b: componentB
}
}
]
});
</script>