Vue-Router
认识路由
路由就是通过互联的网络把信息从源地址传输到目的地址的活动
两种机制(路由和转送)
- 路由时决定数据包从来源到目的地的路径
- 转送将输入端的数据转移到合适的输出端
路由表
路由表本质上就是一个映射表,决定了数据包的指向
发展
后端路由阶段
后端渲染
当访问一个网站或是跳转到其他页面,url都会被传送给服务器,服务器根据你所访问的url在后台自动生成渲染好的页面,这个页面包含html+css+java代码,java代码的作用是从数据库中读取数据,并且将它动态的放在页面中,最后传回给网站显示,所以页面只包含html+css
后端路由(有利于SEO优化)
后端处理url和页面之间的映射关系,服务器会通过正则对url进行匹配,最后交给一个Controller进行处理
前后端分离阶段
- ajax的出现,有了前后端分离的开发模式
- 后端只提供api来返回数据,前端通过ajax获取数据,再通过js渲染到页面。(后端只负责提供数据,不负责任何阶段的内容)
- 当有移动端出现后,后端不需要进行任何处理,一套api就可
- 用户访问一个页面,先从静态资源服务器中获取html+css+js,js代码由浏览器执行
- 然后执行的js代码(如$.ajax)会再向提供API接口的服务器发送请求,获取需要的数据,
- 再通过其他的js代码创建标签,最终再将js相关的东西渲染到页面
前端渲染
浏览器中显示的网页中的大部分内容,都是由前端写的js代码在浏览器中执行,最终渲染出来的。
前端路由阶段
单页面富应用阶段SPA
- 在前后端分离的基础上加上一层前端路由
- 由前端来维护一套路由
单页Web应用(single page web application,SPA),就是只有一张Web页面的应用。单页应用程序 (SPA) 是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序。
浏览器一开始会加载必需的HTML、CSS和JavaScript,所有的操作都在这张页面上完成,都由JavaScript来控制。因此,对单页应用来说模块化的开发和设计显得相当重要。
前端路由
配置映射关系,在一个页面内当点击一个按钮时,会生成一个url(不会向服务器请求资源),根据js代码从获取到的全部资源里抽取需要的资源生成页面(在vue中就是一个一个的组件)。
- 由前端管理url和页面的映射关系(一个url对应一个组件),利用vue-router自动映射
与前后端分离的区别
- 在前后端分离中,静态资源服务器中的每一个url对应一个html+css+js,
所以里面有很多套html+css+js
- 在单页面富应用里,静态资源服务器中只有一个html+css+js
- 单页面富应用中,请求一个url会从静态资源服务器中请求到html+css+js(全部资源),虽然资源全部获取,但并不是立马全部执行渲染
- 然后根据执行的js或者url的变化(并不会向服务器请求数据,即改变url,但是页面不进行整体的刷新),而是从已经获取到的html+css+js数据里抽离一部分所需的数据(在编译时所有的.vue文件已经全部打包到一个bundle.js文件里,所以在执行js或改变url时会根据bundle.js生成对应不同的页面即组件)
- 最后将页面渲染
如何做到不刷新
url的hash
loaction.hash = 'foo'
html5的history :pushState和back
history.pushState({},'','home')
// http://localhost:8080/home
history.pushState({},'','me')
// http://localhost:8080/me
history.back()
// http://localhost:8080/home#/
html5的history :replaceState
history.replaceState({},'','home')
//无法返回
html5的history:go(-1)
安装和使用
npm install vue-router --save
-
导入路由对象,并且调用Vue.use
// 配置路由相关的信息 import VueRouter from 'vue-router' import Vue from 'vue' // 1.通过Vue.use(插件),安装插件 Vue.use(VueRouter) -
创建路由实例,传入路由映射配置
const routes = [] // 2.创建路由对象 const router = new VueRouter({ //配置路由和组件之间的应用关系 routes }) -
在实例中挂载创建的路由实例
// 3.将router对象传入到Vue实例中 export default router //main.js import router from './router' new Vue({ el: '#app', router, render: h => h(App) }) -
创建路由组件
import Home from '../components/Home' import About from '../components/About' -
配置路由映射
const routes = [ { path:'/home', component: Home }, { path:'/about', component: About } ] -
使用路由:通过和
其实是一个组件,最终会被渲染成a标签
<template> <div id="app"> <router-link to="/home">首页</router-link> <router-link to="/about">关于</router-link> <router-view></router-view> </div> </template>相当于一个占位符,之后路径一旦改变,就会用组件替代掉该位置。
动态传递数据
-
路由映射中的路径设置为动态路径
path:'/user/:userId' -
通过v-bind动态绑定数据
<router-link :to="'/user/'+userId">用户</router-link>data(){ return { userId : 'lisi' } }, -
通过route获取当前活跃路由下的userId
computed:{ userId(){ return this.$route.params.userId; } }
嵌套路由(二级路由)
- 创建对应的子组件,并且在路由映射中配置对应的子路由
- 在组件内部使用标签
懒加载
- 当打包构建应用时,javascript包会变得非常大,影响页面加载
- 通过把不同的路由对应的组件分割成不同的代码,当路由被访问时才加载,就更加高效了
app.js表示当前应用程序开发的所有业务代码
vender(第三方).js 引用的第三方代码和框架所存的地方
manifest.js 为我们的打包的代码作底层支撑
使用
在es6中
component: () => import('../components/User.vue')
传递参数
-
params的类型
-
配置路由格式:/router/:id
-
传递的方式:在path后面跟上对应的值
-
传递后形成的路径:/router/123
-
-
query的类型
- 配置路由格式: /router
- 传递方式:对象中使用query的key作为传递方式
- 传递后形成的路径: /router?id=123
导航守卫
作用:用于监听来回跳转过程
//前置钩子 在路由跳转之前进行的回调
router.beforeEach((to,from,next) => {
//从from跳转到to
console.log(to)
document.title = to.matched[0].meta.title;
next()
})