前端的路由,对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换(单页面之中的锚链接也是#号),同时hash有个特点.HTTP请求的中不会包含hash的相关内容。
http://127.0.0.1:8899/#/login
1,上面地址中的#号就是hash是实现单页面跳转的主要方式。
2,当项目引入vue-router.js后就会默认加上这个#号。
3,vue-route也是通过监听#后面的url来实现页面跳转切换的。
一,路由的基本使用
<script src= "path/vue-2.4.0.js"></script>
<!-- 1.安装 vue-router 路由模块,注意当已引入这个标签浏览器的网址栏就会加上一个hash 即#号-->
<script src= "path/vue-router-3.0.1.js"></script>
<div id="app">
//注意a标签的url要带#号,不然会跳转到一个不存在的地址
<a href = "#/login">登录</a>
<a href = "#/register">注册</a>
//4.通过router就是提供的router-view标签进行页面的渲染
<router-view></router-view>
</div>
<script>
//1,组件的模板对象
var login = {
template:"<h1>登录组件</h1>"
}
var register = {
template:"<h1>注册组件</h1>"
}
// 2.创建一个路由对象,当 导入vue-router包之后,在window全局对象中,就有了一个路由的构造函数,叫做VueRouter
//在new路由对象的时候,可以为构造函数,传递一个配置对象
var routerObg = new VueRouter({
// route //这个配置对象中的route表示 【路由匹配规则】的意思
routes: [ //路由匹配规则
//每个路由规则,都是一个对象,这个规则对象,身上,有两个必须的属性:
//属性1是path ,表示监听哪个路由链接地址;
//属性2是component ,表示,如果路由是前面匹配到的path ,则展示component属性对应的那个组件
//属性3是name这个不是必须的
//注意:component的属性值,必须是一 组件的模板对象,不能是 组件的引用名称;
{ path: '/login', component: login },
{ path: '/register', component: register }
]
})
//创建Vue实例,得到ViewModel
var vm = new Vue ({
el:"#app" ,
data: {},
methods: {},
router: routerObj //3.将路由规则对象,注册到vm实例上,用来监听URL地址的变化,然后展示对应的组件
})
</script>
二,redirect路由的重定向
通过redirect属性可实现#/根路径重定向。
var routerObg = new VueRouter({
//路由匹配规则
routes: [
//当页面输入 http://127.0.0.1:8899#/会重定向到login登录页面;
{ path: '/', redirect: /login },
{ path: '/login', component: login },
{ path: '/register', component: register }
]
})
三,router-link标签代替a标签
router-link标签的作用其实就是上面代码中a
标签的作用,通过to
属性来关联需要跳转的页面。
<router-link to = "/login" tag = "span">登录</router-link>
<router-link to = "/register">注册</router-link>
当使用router-link标签后其实会底层会默认帮忙渲染成一个a
标签, 要想渲染成其他标签需要通过tag
属性来指定,如上面代码 tag = "span"会将登录渲染成一个span的标签。注意当使用router-link标签后无需加#
号了。
3.1 router-link样式的修改
四,路由传参
6.1使用query方式 通过url拼接参数进行传参 this.$route.query
<div id="app">
<router-link to = "/login?id=10">登录</router-link>
<router-link to = "/register">注册</router-link>
//4.通过router就是提供的router-view标签进行页面的渲染
<router-view></router-view>
</div>
<script>
var login = {
template:"<h1>登录组件</h1>"
created(){
//通过this.$route可以获取路由对象
console.log(this.$route)
console.log(this.$route.query.id)
}
}
var register = {
template:"<h1>注册组件</h1>"
}
var routerObg = new VueRouter({
routes: [
{ path: '/', redirect: /login },
{ path: '/login', component: login },
{ path: '/register', component: register }
]
})
var vm = new Vue ({
el:"#app" ,
data: {},
methods: {},
router: routerObj
})
</script>
6.2 通过parmams实现路由传参this.$route.params
<div id="app">
<router-link to = "/login/12/ZhangSan">登录</router-link>
<router-link to = "/register">注册</router-link>
//4.通过router就是提供的router-view标签进行页面的渲染
<router-view></router-view>
</div>
<script>
var login = {
template:"<h1>登录组件</h1>"
created(){
//通过this.$route可以获取路由对象
console.log(this.$route)
console.log(this.$route.params.id)
}
}
var register = {
template:"<h1>注册组件</h1>"
}
var routerObg = new VueRouter({
routes: [
{ path: '/', redirect: /login },
{ path: '/login/:id/:name', component: login },
{ path: '/register', component: register }
]
})
var vm = new Vue ({
el:"#app" ,
data: {},
methods: {},
router: routerObj
})
</script>
五,路由嵌套
一个路由下面又挂载了多个路由时候需要用到路由的嵌套才能够实现
▪ 127.0.0.1:8899/#/account 展示account组件
▪127.0.0.1:8899/#/account/login 展示account组件下的login组件
▪127.0.0.1:8899/#/account/register 展示account组件下的register组件