路由是一个比较广义和抽象的概念, 路由的本质就是对应关系;
在开发中, 路由分为:
<!-- 导入vue文件, 为全局window对象挂载Vue构造函数 -->
<script src="../vue.js"></script>
<!-- 导入vue-router文件, 为全局windows对象挂载VueRouter构造函数 -->
<script src="../vue-router.js"></script>
<div id="app">
<router-link to="/user">Userrouter-link>
<router-link to="/register">Registerrouter-link>
div>
<router-view>router-view>
const user_com = {
template: `
User组件
`
};
const register_com = {
template: `
Register组件
`
};
// 创建路由实例对象
var router = new VueRouter({
// routes是路由规则数组
routes: [
// 每个路由规则都是一个配置对象, 其中至少包含path和component两个属性
// path 表示当前路由规则匹配的hash地址
// component 表示当前路由规则对应展示的组件
(path: '/user', component: user_com),
(path: '/register', component:register_com),
],
});
var vm = new Vue({
el: "#app",
data: {
},
// 挂载路由对象
// router: router
// es6中属性名和挂载对象名相同时,可省略写
router,
});
<html lang="en">
<head>
<title>vue router的基本使用步骤title>
<script src="../vue.js">script>
<script src="../vue-router.js">script>
head>
<body>
<div id="app">
<router-link to="/user">Userrouter-link>
<router-link to="/register">Registerrouter-link>
<router-view>router-view>
div>
<script>
const user_com = {
template: 'User组件
'
};
const register_com = {
template: `
Register组件
`
};
// 创建路由实例对象
var router = new VueRouter({
// routes是路由规则数组
routes: [
// 每个路由规则都是一个配置对象, 其中至少包含path和component两个属性
// path 表示当前路由规则匹配的hash地址
// component 表示当前路由规则对应展示的组件
{path: '/user', component: user_com},
{path: '/register', component:register_com},
],
});
var vm = new Vue({
el: "#app",
data: {
},
// 挂载路由对象
router: router,
// es6中属性名和挂载对象名相同时,可省略写
// router,
});
script>
body>
路由重定向指的是: 用户在访问地址A的时候, 强制用户跳转到地址C, 从而展示特定的组件页面;
通过路由规则的redirect 属性, 指定一个新的路由地址, 可以很方便的设置路由的重定向:
var router = new VueRouter({
// routes是路由规则数组
routes: [
// 其中, path表示需要被重定向的原地址, redirect表示将要重定向到的新地址
{path: '/', redirect: '/user'},
{path: '/user', component: user_com},
{path: '/register', component:register_com},
],
});
<div id="app">
<p>
<router-link to="/user">Userrouter-link>
<router-link to="/register">Registerrouter-link>
p>
<div>
<router-view>router-view>
div>
div>
const register_com = {
template: `
Register组件
Tab1
Tab2
`
};
const register_tab1 = {
template: 'register_tab1组件
'
};
const uregister_tab2 = {
template: 'register_tab2组件
'
};
// 创建路由实例对象
var router = new VueRouter({
// routes是路由规则数组
routes: [
// 其中, path表示需要被重定向的原地址, redirect表示将要重定向到的新地址
{path: '/', redirect: '/user'},
{path: '/user', component: user_com},
{
path: '/register',
component:register_com,
children: [
{path: '/register/tab1', component: register_tab1},
{path: '/register/tab2', component: uregister_tab2},
]
},
],
});
<head>
<title>vue router的路由嵌套title>
<script src="../vue.js">script>
<script src="../vue-router.js">script>
head>
<body>
<div id="app">
<p>
<router-link to="/user">Userrouter-link>
<router-link to="/register">Registerrouter-link>
p>
<div>
<router-view>router-view>
div>
div>
<script>
const user_com = {
template: 'User组件
'
};
const register_com = {
template: `
Register组件
Tab1
Tab2
`
};
const register_tab1 = {
template: 'register_tab1组件
'
};
const uregister_tab2 = {
template: 'register_tab2组件
'
};
// 创建路由实例对象
var router = new VueRouter({
// routes是路由规则数组
routes: [
// 其中, path表示需要被重定向的原地址, redirect表示将要重定向到的新地址
{path: '/', redirect: '/user'},
{path: '/user', component: user_com},
{
path: '/register',
component:register_com,
children: [
{path: '/register/tab1', component: register_tab1},
{path: '/register/tab2', component: uregister_tab2},
]
},
],
});
var vm = new Vue({
el: "#app",
data: {
},
// 挂载路由对象
router: router,
});
script>
body>
<head>
<title>动态路由匹配title>
<script src="../vue.js">script>
<script src="../vue-router.js">script>
head>
<body>
<div id="app">
<router-link to="/user/1">User1router-link>
<router-link to="/user/2">User2router-link>
<router-link to="/user/3">User3router-link>
<router-view>router-view>
div>
<script>
const user_com = {
// 路由组件通过$route.params获取路由参数
template: 'User {{ $route.params.id }}组件
'
};
var router = new VueRouter({
routes: [
// 动态参数, 以冒号开头
{path: '/user/:id', component: user_com},
],
});
var vm = new Vue({
el: "#app",
data: {
},
router: router,
});
script>
body>
$route与对应路由形成高度耦合, 不够灵活, 所以可以使用props将组件和路由解耦
const user_com = {
// 使用props接收路由参数
props: ["id"],
template: '< h1>User {{ id }}组件'
};
var router = new VueRouter({
routes: [
// 动态参数, 以冒号开头
{
path: '/user/:id',
component: user_com,
// 如果props被设置为true, route.params将会被设置为组件属性
props: true,
},
],
});
const user_com = {
// 使用props接收路由参数
props: ["id", "name", "age"],
template: `
User {{ id }}组件
{{name}} ======= {{age}}
`
};
var router = new VueRouter({
routes: [
{
path: '/user/:id',
component: user_com,
props: {
name: "张三",
age: 18
},
},
],
});
const user_com = {
// 使用props接收路由参数
props: ["id", "name", "age"],
template: `
User {{ id }}组件
{{name}} ======= {{age}}
`
};
var router = new VueRouter({
routes: [
{
path: '/user/:id',
component: user_com,
// 给props定义一个箭头函数
props: route => ({
name: "张三",
age: 18,
// 获取id值
id: route.params.id
})
},
],
});
为了方便的表示路由的路径, 可以给路由规则起一个别名, 即为"命名路由";
var router = new VueRouter({
routes: [
{
path: '/user/:id',
component: user_com,
// 命名路由
name: 'user',
props: true,
},
],
});
<router-link :to="{name: 'user', params: {id: 123}}">User3router-link>
router.push({
name: 'user',
params: {
id: 123
},
});
常用的编程式导航API如下:
<head>
<title>编程式导航title>
<script src="../vue.js">script>
<script src="../vue-router.js">script>
head>
<body>
<div id="app">
<router-link to="/user/1">User1router-link>
<button @click="jump">跳转Registerbutton>
<button @click="goBack">后退button>
<router-view>router-view>
div>
<script>
const user_com = {
// 使用props接收路由参数
props: ["id"],
template: 'User {{ id }}组件
'
};
const register_com = {
template: `
Register组件
`
};
var router = new VueRouter({
routes: [
{
path: '/user/:id',
component: user_com,
// 命名路由
name: 'user',
props: true,
},
{
path: '/register',
component: register_com,
// 命名路由
name: 'register',
}
],
});
var vm = new Vue({
el: "#app",
data: {
},
router: router,
methods: {
jump: function() {
this.$router.push({
name: 'register',
});
},
goBack: function() {
this.$router.go(-1);
},
},
});
script>
body>
// 字符串(路径名称)
router.push('/home')
// 对象
router.push({path: '/home'})
// 命名的路由(传递参数)
router.push({name: 'user', params: {id: 123}})
// 带查询参数, 变成/user?name=zhangsan
router.push({path: '/user', query: {name: 'zhangsan'}})