1. 后端路由
SPA
2. 前端路由
前端出现spa单应用程序
3. SPA
后端渲染(存在性能问题)=》Ajax前端渲染(前端渲染提高性能,但是不支持浏览器的前后退操作)=》
如何监听到hash值的变化?
监听 window 的 onhashchange事件
实现简单前端路由:
<html>
<head>
<meta charset="utf-8">
<title>title>
<script src="./lib/vue_2.5.22.js">script>
head>
<body>
<div id="app">
<a href="#/zhuye">主页a>
<a href="#/keji">科技a>
<a href="#/caijing">财经a>
<a href="#/yule">娱乐a>
<component :is="comName">component>
div>
<script type="text/javascript">
var zhuye ={
template:'zhuye
',
}
var keji ={
template:'科技
',
}
var caijing ={
template:'caijing
',
}
var yule ={
template:'yule
',
}
var vm = new Vue({
el:'#app',
data:{
comName:'zhuye',
},
components:{
'zhuye':zhuye,
'keji':keji,
'caijing':caijing,
'yule':yule,
}
})
window.onhashchange =function(){
console.log(location.hash);
switch (location.hash.slice(1)){
case '/zhuye':
vm.comName = 'zhuye'
break
case '/keji':
vm.comName = 'keji'
break
case '/caijing':
vm.comName = 'caijing'
break
case '/yule':
vm.comName = 'yule'
break
}
}
script>
body>
html>
<router-link to="/user">Userrouter-link>
< router-view>< /router-view>
//创建路由实例
const router = new VueRouter({
//所有的路由规则
routes:[
{path:'/User',component:User},
{path:'/register',component:Register},
]
})
routes是路由规则组数
每个路由规则都是一个配置对象,其中至少包含 path 和 component 两个属性:
path 表示当前路由规则匹配的 hash 地址
component 表示当前路由规则对应要展示的组件
路由实例的路由规则中:
Component 只接受组件对象不接字符串
//创建 vm 实例对象
const vm = new Vue({
el:'#app',
//挂载
//在es6中,如果属性名和属性值的变量名字是一致的,可以简写成为一个
router:router,
data:{}
})
路由重定向: 用户在访问地址A的时候,强制用户跳转到地址C,从而展示特定的组件页面
{ path: ’ / ', redirect: ’ /user ’ }
path:表示需要被重定向的原地址
redirect:表示将要被重定向的新地址
确定谁是父组件、谁是子组件
然后在父组件中把要填写的路由链接、路由占位符都填充完毕
填充完之后发现还需要对应的子路由组件,所以创建两个路由组件
现在有组件、有对应链接,但是链接和组件对应关系暂时还没有,所以在routes路由规则中,在父组件路由规则之下,通过children子路由规则创建子路由的
子路由规则:children数组
// children 数组表示子路由规则
{ path: '/register', component: Register, children: [
{ path: '/register/tab1', component: Tab1 },
{ path: '/register/tab2', component: Tab2 }
] }
应用场景:通过动态路由参数的模式进行路由匹配
1. 基本用法
{ path:’ /user/: id ',component:User }
template:’< h1>User 组件 用户id为: {{$route.params.id}}< /h1>’
2. 路由组件传递参数
{path:'/User/:id',component:User,props:true},
{path:'/User/:id',component:User,props:{uname:'xingxing',age:12}},
当props指定对象后,对象里面有什么样的属性,那么在组件中才可以接收到,
而 /user/:id的这个id就不能访问到了
//定义路由组件
const User = {
props:['id','uname','age'],
template:'User 组件 用户id为--- {{id}}---姓名:{{uname}}---年龄:{{age}}
'
}
//创建路由实例
const router = new VueRouter({
//所有的路由规则
routes:[
{path:'/',redirect:'/User'},
{path:'/User/:id',component:User,props:route=>({uname:'zz',age:24,id:route.params.id})},
{path:'/register',component:Register,children:[
{path:'/register/tab1',component:Tab1},
{path:'/register/tab2',component:Tab2}
]},
]
})
为了更加方便的表示路由的路径,可以给路由规则起一个别名,即为“命名路由”
const router = new VueRouter({
routes:[
{
path:'/user/:id',
name:'user',
component:User
}
]
})
那如何使用呢?
需要属性绑定 to,根据名字跳转到对应路由,params传递参数
<router-link :to="{ name:'user', params:{id:3}}">User</router-link>
1. 页面导航的两种方式
2. vue 中编程式导航基本用法
常用的编程式导航API如下:
// 字符串(路径名称)
router.push( ‘/home’ )
// 对象
router.push({ path: ’ /home ‘})
//命名的路由(参数传递)
router.push({ name: ‘/user’ , params: {userId:1})
// 带查询参数,变成 /register?uname=lisi
router.push({ path:’ /register ', query: { uname: ’ lisi '}})
const User = {
props:['id','uname','age'],
template:`
User 组件 用户id为--- {{id}}---姓名:{{uname}}---年龄:{{age}}
`,
methods:{
goRegister:function(){
this.$router.push('/register');
}
}
}
const Register = {
template:`
Register 组件
Tab1
Tab2
`,
methods:{
goBack:function(){
this.$router.go(-1);
}
}
}