6-2 vue-router、vue-cli和单文件组件-路由嵌套、参数传递、路由实例的方法、路由结合动画
目录:
- 路由嵌套
- 参数传递
- 路由实例的方法
- 路由结合动画
一、路由嵌套
我们之前讲了vue-router路由的基本使用,但是我们只是一层,那如果现在路由下,还有路由咋办,也就是路由嵌套,或者说 父子路由呐,接下来,我们来说下,路由嵌套是怎么做的。
其实就是一个在配置路由中添加一个children选项,来定义子路由,定义如下:
//2.配置路由
const routes = [
{
path:'/user', //父路由
component: User,
children:[ //children选项 定义 子路由
{
path: "login",
component: Login
},
{
path: "regist",
component: Regist
}
]
}
];
我们接下来看一个完整的实例,当然,里面的代码被我简化了,简化的代码我们在 vue-router 路由基础中都有: vue-router路由的使用
<body> <div id="app"> ....... </div> <template id="user"> <div> <h3>用户信息</h3> <router-link to="/user/login" tag="li">用户登录</router-link> <router-link to="/user/regist" tag="li">用户注册</router-link> </ul> <router-view></router-view> </div> </template> .... <script> //1.定义组件 var User = { template: '#user' //引用user模板 }; var Login = { template: '<h4>用户登录....</h4>' }; var Regist = { template: '<h4>用户注册....</h4>' }; //2.配置路由(包含子路由的配置) const routes = [ ......., { path:'/user', component: User, children:[ //children选项用来定义子路由 { path: "login", component: Login }, { path: "regist", component: Regist } ] } ]; //3.创建路由实例 ..... //4.创建根实例并将路由挂载到Vue实例上 ..... </script> </body>
上述的例子中有一个知识点要提一下,我们先看上述有一行HTML代码是写成这样的:
<!--传统写法--> <li><router-link to="/user/login">用户登录</router-link></li> <!--改进后的写法--> <router-link to="/user/login" tag="li">用户登录</router-link>
其实传统写法也没有问题,但是在Vue-router 官方api提供一个 属性 tag,官方API文档地址:API参考
tag:
-
类型:
string -
默认值:
"a"有时候想要
<router-link>渲染成某种标签,例如<li>。 于是我们使用tagprop 类指定何种标签,同样它还是会监听点击,触发导航。
<router-link to="/foo" tag="li">foo</router-link> <!-- 渲染结果 --> <li>foo</li>
你看看,现在理解了吧。<router-link>还有很多属性,你同样可以可以看API文档:router-link API参考。
二、参数传递
路由在访问的时候,需要传递参数,我们经常使用的,传参有两种方式:路由对象属性($route获取路由对象的方法说明)
- a.查询字符串: login?username=tom&password=123 => path名?参数1=值1&参数2=值2 => 获取值:{{$route.query}}
- b.rest风格url: regist/tom/123=> path名/值1/值2 => 获取值:{{$route.params}}
2.1、查询字符串参数传递
<!--查询字符串方式-->
<router-link to="/user/login?username=tom&password=123" tag="li">用户登录</router-link>
//通过$route.query获取{ "username": "tom", "password": "123" }
var Login = {
template: '<h4>用户登录....{{$route.query}}</h4>'
};
2.2、rest风格url参数传递
<!--rest风格url-->
<router-link to="/user/regist/tom/123" tag="li">用户注册</router-link>
//通过$route.params 获取 { "username": "tom", "password": "123" }对象
var Regist = {
template: '<h4>用户注册....{{$route.params}}</h4>' //{{$route.params.username}},{{$route.path}}获取url路径
};
//配置路由
const routes = [
{
......
children:[
.......,
{
path: "regist/:username/:password", //告诉后面两个值,是参数,而不是路由
component: Regist
}
]
}
];
至于这个 $route 是哪里来的,那么请你看看 路由对象 吧,官方说的很详细了。
上面是我提取的核心代码,如果还不知道怎么办,完整的代码如下:
<head> <meta charset="UTF-8"> <title>路由嵌套和参数传递</title> <style> .active { font-size: 20px; color:#ff7300; text-decoration: none; } </style> </head> <body> <div id="app"> <div> <router-link to="/home">主页</router-link> <router-link to="/user">用户</router-link> </div> <div> <router-view></router-view> </div> </div> <template id="user"> <div> <h3>用户信息</h3> <ul> <router-link to="/user/login?username=tom&password=123" tag="li">用户登录</router-link> <router-link to="/user/regist/tom/123" tag="li">用户注册</router-link> </ul> <router-view></router-view> </div> </template> <script type="text/javascript" src="../vue.js"></script> <script src="../vue-router.js"></script> <script> //1.定义组件 var Home = { template: '<h3>我是主页</h3>' }; var User = { template: '#user' }; var Login = { template: '<h4>用户登录....{{$route.query}}</h4>' }; var Regist = { template: '<h4>用户注册....{{$route.params}}</h4>' }; //2.配置路由 const routes = [ {path:'/home',component: Home}, { path:'/user', component: User, children:[ //children选项用来定义子路由 { path: "login", component: Login }, { path: "regist/:username/:password", component: Regist } ] } ]; //3.创建路由实例 const router = new VueRouter({ routes: routes, linkActiveClass: 'active' }); //4.创建根实例并将路由挂载到Vue实例上 new Vue({ router }).$mount("#app") </script> </body>
参数传递,就学到这里吧....
三、路由实例的方法
路由实例的方法有很多,官方API 给我们提供了若干个 实例的方法:Router 实例方法。
今天我们就先来介绍经常用的两个方法:
router.push() //添加路由,功能上与<router-link>相同 => 传递参数:1.字符串传递 this.$router.push({path:'/home',query:{name:'jack'}}) 2.rest风格url传参 this.$router.push({path:'/home',params:{id: 1}})
router.replace() //替换路由,不产生历史记录
具体使用如下:
<!--触发事件测试-->
<button @click="push">添加路由</button>
<button @click="replace">替换路由</button>
//vue实例中定义methods去调用
new Vue({
router,
methods:{
push(){
router.push({path:'home'}); //push是router实例提供的方法,目的:添加路由,切换路由
},
replace(){
router.push({path:'user'}); //替换路由,没有历史记录
}
}
}).$mount("#app")
完整的代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>路由嵌套和参数传递</title> <style> .active { font-size: 20px; color:#ff7300; text-decoration: none; } </style> </head> <body> <div id="app"> <div> <router-link to="/home">主页</router-link> <router-link to="/user">用户</router-link> </div> <div> <router-view></router-view> </div> <hr> <button @click="push">添加路由</button> <button @click="replace">替换路由</button> </div> <template id="user"> <div> <h3>用户信息</h3> <ul> <router-link to="/user/login?username=tom&password=123" tag="li">用户登录</router-link> <router-link to="/user/regist/tom/123" tag="li">用户注册</router-link> </ul> <router-view></router-view> </div> </template> <script type="text/javascript" src="../vue.js"></script> <script src="../vue-router.js"></script> <script> //1.定义组件 var Home = { template: '<h3>我是主页</h3>' }; var User = { template: '#user' }; var Login = { template: '<h4>用户登录....{{$route.query}}</h4>' }; var Regist = { template: '<h4>用户注册....{{$route.params}}</h4>' }; //2.配置路由 const routes = [ {path:'/home',component: Home}, { path:'/user', component: User, children:[ //children选项用来定义子路由 { path: "login", component: Login }, { path: "regist/:username/:password", component: Regist } ] } ]; //3.创建路由实例 const router = new VueRouter({ routes: routes, linkActiveClass: 'active' }); //4.创建根实例并将路由挂载到Vue实例上 new Vue({ router, methods:{ push(){ router.push({path:'home'}); //push是router实例提供的方法,目的:添加路由,切换路由 }, replace(){ router.push({path:'user'}); //替换路由,没有历史记录 } } }).$mount("#app") </script> </body> </html>
四、路由结合动画
之前我们学过 过渡动画 结合第三方的第三方 CSS 动画库 Animate.css,那我们也结合一下使用,看看我们在切换路由的时候,也可以自定义自己的一些动画效果:
<head>
.....
<!--animated是基础样式,必须要有-->
<link rel="stylesheet" href="css/animate.css">
.....
</head>
//容器app
<div id="app">
<div>
......
</div>
<div>
<!--只需要在<router-view>加上transition就可以了,因为router-view显示的内容-->
<transition enter-active-class="animated bounceInLeft" leave-active-class="animated bounceOouRight">
<router-view></router-view>
</transition>
</div>
.....
</div>
完整的代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>路由嵌套和参数传递</title> <!--animated是基础样式,必须要有--> <link rel="stylesheet" href="css/animate.css"> <style> .active { font-size: 20px; color:#ff7300; text-decoration: none; } </style> </head> <body> <div id="app"> <div> <router-link to="/home">主页</router-link> <router-link to="/user">用户</router-link> </div> <div> <!--只需要在<router-view>加上transition就可以了,因为router-view显示的内容--> <transition enter-active-class="animated bounceInLeft" leave-active-class="animated bounceOouRight"> <router-view></router-view> </transition> </div> <hr> <button @click="push">添加路由</button> <button @click="replace">替换路由</button> </div> <template id="user"> <div> <h3>用户信息</h3> <ul> <router-link to="/user/login?username=tom&password=123" tag="li">用户登录</router-link> <router-link to="/user/regist/tom/123" tag="li">用户注册</router-link> </ul> <router-view></router-view> </div> </template> <script type="text/javascript" src="../vue.js"></script> <script src="../vue-router.js"></script> <script> //1.定义组件 var Home = { template: '<h3>我是主页</h3>' }; var User = { template: '#user' }; var Login = { template: '<h4>用户登录....{{$route.query}}</h4>' }; var Regist = { template: '<h4>用户注册....{{$route.params}}</h4>' }; //2.配置路由 const routes = [ {path:'/home',component: Home}, { path:'/user', component: User, children:[ //children选项用来定义子路由 { path: "login", component: Login }, { path: "regist/:username/:password", component: Regist } ] } ]; //3.创建路由实例 const router = new VueRouter({ routes: routes, linkActiveClass: 'active' }); //4.创建根实例并将路由挂载到Vue实例上 new Vue({ router, methods:{ push(){ router.push({path:'home'}); //push是router实例提供的方法,目的:添加路由,切换路由 }, replace(){ router.push({path:'user'}); //替换路由,没有历史记录 } } }).$mount("#app") </script> </body> </html>

浙公网安备 33010602011771号