Vue Router 基础
- $route 这里面放的是路由规则
- $router 路由对象,跟路由相关的方法、模式等
- this.$router.replace(‘/login’) replace不会记录本次历史,跳转后,没有后退前前进
- this.$router.go(-2) 回到上上次记录
表现形式的区别
原理的区别
Hash 模式是基于锚点,以及onhashchange事件
History 模式是基于HTML5中的History API
- history.pushState() IE10 以后才支持
- history.replaceState()
History模式的使用
- History需要服务器的支持
- 单页应用中,服务端不存在http://www.testurl.com/login这样的地址会返回找不到该页面
- 在服务端应该除了静态资源外都返回单面应用的index.html
白话:
- 在nodejs环境中,如果没有注册history模式的中间件: app.use(history())
- 则在访问 localhost:3000/about 时,会先请求服务器,服务器端没有配置/about,会返回服务端的404页面,即 Cannot GET /about
- 如果注册了 app.use(history()),服务器端找不到/about,就会返回应用的index.html,而单面应用index会根据/about,返回about.html页面
nginx服务器配置
- 从官网下载nginx的压缩包
- 把压缩包解压到C盘根目录,c:\nginx-1.18.0文件夹
- 打开命令行,切换到目录 c:\nginx-1.180
- 启动 start nginx
- 重启 nginx -s reload
- 停止 nginx -s stop
- 把打包好的dist里面文件放到nginx的html文件夹下,刷新能用
- 但点击其他路由的时候,再刷新,请求这个地址的时候,服务器找不到请求的文件,就会返回404错误,这是因为nginx没有处理router的history模式
- 找到C:\nginx-1.18.0\conf下nginx.conf配置文件
- 在server 下 location里,添加一行配置: try_files $uri $uri/ /index.html; 找不到时,尝试访问,访问不到,就默认返回index.html
VueRouter 实现原理
Hash 模式
- URL中#后面的内容作为路径地址,如果只改变了#后面的url,浏览器不会向服务器请求这个地址,但会把这个地址记录到访问历史中
- 监听hashchange事件,当hash改变后,会调用hashchange事件
- 当hash改变后,会记录相应地址,并找到该路径的对应组件重新渲染
History 模式
- 就是一个普通的url,通过调用 history.pushState() 来改变地址栏,仅仅是改变地址栏,并把地址记录到访问历史中,浏览器也不会发送服务器请求
- 通过监听popstate事件,可以监听到浏览器操作的历史变化,在popstate处理函数中,可以记录改变后的地址,值得注意的是调用pushState和replaceState时,并不会触发该事件,浏览器前进或后退,或者调用history的back或forword的时候,该事件才会被触发
- 根据当前路由地址找到对应组件重新渲染
Vue的构建版本
- 运行时版:不支持template模板,需要打包的时候提前编译
- 完整版:包含运行时和编译器,体积比运行时版大10K左右,程序运行的时候把模板转换成render函数
- vue cli默认创建的是运行时版本
方法一: 改变为完整版
在项目根目录下创建 vue.config.js 配置文件
- 导出的配置选项添加: runtimeCompiler: true 添加编译器,即为完整版
- 方法二: 运行时版本,组件中直接写render函数```javascript
render(h){
//render函数参数 h,h用来帮助创建虚拟dom
return h(“a”,{ //h里面三个参数 标签、Dom对象属性、内容
attrs:{
}, on:{href:this.to
} },[this.$slots.default]) }, // template:”click:this.clickhander
<>” ```
