目录

  • 路由安装及配置
  • 传参
    • query
    • params
  • 导航
    • this.$router
  • 嵌套路由
  • 路由守卫
  • 前端路由模式hash和history
    • 两种模式的实现原理
    • 两种模式的区别
    • 关于history模式下404的解决方案
  • vue-router原理剖析

路由安装及配置

总结插件使用:

  1. 安装 vue add router

  2. 选项配置 new VueRouter({ routes: [ { path: '/', name: 'home', component: Home } ] })

  3. 关联路由和Vue实例

  4. 留坑 <router-view />

  5. 导航 <router-link />

// 选项配置
import Vue from 'vue'
import Router from 'vue-router'Vue.use(Router);var router = new Router({//路由配置routes:[{path: '/login', component: Login},{path: '/register',component: Register}]
});export default router//关联
import router from './router'
new Vue({el:'#app',router
})// 导航及留坑
<div><h1>我是主页</h1><router-link to="/login">去登录页</router-link><router-link to="/register">去注册页</router-link><router-view></router-view>
</div>

传参

两种传参方式:

  1. query
 http://www.xxx.com/login?id=1 <router-link :to="{ name: 'login',query:{ id:'abc' } }">登录页</router-link>
  1. params (路由配置path:"/register/:sex")
 http://www.xxx.com/register/woman<router-link :to="{ name: 'register',params:{ sex:'woman' } }">注册页</router-link>

参数访问

可以通过this.$route获取路由信息中的参数

常用属性:

  1. this.$route.name
  2. this.$route.path
  3. this.$route.params
  4. this.$route.query
  5. this.$route.hash
  6. this.$route.meta(是否需要权限控制)
  7. this.$route.children(子路由)

或者可以通过在路由配置中添加 props:ture 来便捷访问

{ path: "detail/:id", component: Detail, props: true }在组件中声明props: ['id']

则可以直接使用 this.id

导航

  1. 编程导航:this.router.push()、this.router.push()、this.router.push()、this.router.replace()

常用的函数:

  1. this.$router.push()
  2. this.$router.replace()
  3. this.$router.go(-1 | 1)
  4. this.$router.forward()

嵌套路由

总结:

多个组件,按不同的锚点值部分填入不同的坑

  1. 中包含
  2. 路由规则中包含子路由,children属性
{name:'login',path: '/login', component: Login,//当嵌套路由中有多个router-view时,使用components进行指定各自对应的组件children:[{name:'woman', path:'woman',components: {"something": Woman,"music": Music}}]
},
{name:'register',path: '/register',component: Register,//嵌套路由配置children:[{name:'info', path:'info',component: Info}]
}

路由守卫

路由配置属性meta 配合路由守卫钩子来控制页面的权限访问。

  1. 全局前置守卫 beforeEach(to,from,next)
{path: '/about',name: 'about',meta: { requiresAuth: true },component: About
}router.$router.beforeEach(function(to, from, next){if(to.meta.requiresAuth){//放行next();} else {next({path:'/login'});}})
  1. 路由独享beforeEnter(to,from,next)
{path: '/about',name: 'about',meta: { requiresAuth: true },component: About,beforeEnter(to,from,next){// dosomething}
}
  1. 组件beforeRouteEnter(to,from,next)

试用场景:

路由复用,参数变化的请求(即params或者query改变)

对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候

完整的导航解析流程:

  1. 导航被触发
  2. 调用全局的beforeEach守卫
  3. 在重用的组件里调用beforeRouterUpdate守卫
  4. 在路由配置里调用beforeEnter
  5. 在被激活的组件里调用beforeRouteEnter
  6. 调用全局的beforeResolve守卫
  7. 导航被确认。
  8. 调用全局的 afterEach 钩子。
  9. 触发 DOM 更新。

前端路由模式hash和history

前端路由原理:
锚点值页面不跳转,局部页面innerHTML的替换

  1. 两种模式的实现原理
  • hash 模式:
    url上的部分锚点数据(#xxx)改变,不会导致浏览器向服务器发出请求,就不会刷新页面。hash值的改变会触发 hashchange() 事件,根据 hash 变化来实现更新页面部分内容的操作。
http://www.xxx.com/#/homewindow.addEventListener('hanshchange', function(){console.log(location.hash);
})
  • history 模式:
    history 模式的实现,主要是 HTML5 标准发布的两个API,pushState和replaceState。通过这两个 API 可以改变 url 地址且不会发送请求.同时还有popstate事件。这样就可以监听url变化来实现更新页面部分内容的操作。
http://www.xxx.com/homewindow.addEventListener('popstate', function(){console.log(location.url);
})
  1. 两种模式的区别
  • url显示上,hash模式会有“#”,history模式没有
  • 兼容性,hash可以兼容低版本浏览器和IE
  • history模式在刷新页面或者直接输入url回车时,还是会给服务器发送请求。如果没有处理会返回404.一般的解决方式是由后端配合将页面重定向到某个具体的页面,如首页。
  1. 关于history模式下404的解决方案
    这里使用Nginx代理
    步骤:
    (1)发布 npm run build
    (2)下载nginx
    (3)配置conf/nginx.conf
#前端设置了baseUrl的对应配置
server {listen 80;server_name localhost;#charset koi8 - r;#access_log logs / host.access.log main;root C:\Users\yuanz\Desktop\Webfullstack\Vue\01_vue_component\dist; #单页面项目的打包后的dist目录# http://localhost/detail/1# http://localhost/js/about.8187b66d.js# 若是静态文件请求则直接返回,否则直接重定向到index.htmllocation / {try_files $uri /index.html;}#nginx反向代理,实现接口转发location ^ ~ /api/ {proxy_pass http://localhost:3000; #注意路径后边不要加/
}

(4)起服务器 start nginx

vue-router原理剖析

通过源码来分析路由是如何通过URL的改变通知页面更新的。

实质上是借助了Vue的响应式数据,current通过new Vue()定义为响应式数据,它涵盖了当前路由的元信息,如:path、params、query、name等。所以只需要监听current的变化来触发页面render即可。

使用Vue.component定义全局组件router-link 和router-view

下面是一个简写版的vueRouter,帮助理解。

class VueRouter {constructor(Vue, options) {this.$options = optionsthis.routeMap = {}// 通过new一个Vue实例,将当前路由变为响应式this.app = new Vue({data: {current: '#/'}})this.init()this.createRouteMap(this.$options)this.initComponent(Vue)}// 初始化 hashchangeinit() {window.addEventListener('load', this.onHashChange.bind(this), false)window.addEventListener('hashchange', this.onHashChange.bind(this),false)}createRouteMap(options) {options.routes.forEach(item => {this.routeMap[item.path] = item.component})}// 注册组件initComponent(Vue) {Vue.component('router-link', {props: {to: String},render: function (h) {// h <==> createElement// <a :href="to"><slot></slot></a>return h("a",{ attrs: { href: this.to } },this.$slots.default);}})const _this = thisVue.component('router-view', {render(h) {var component = _this.routeMap[_this.app.current]return h(component)}})}// 获取当前 hash 串getHash() {return window.location.hash.slice(1) || '/'}// 设置当前路径onHashChange() {this.app.current = this.getHash()}
}

Vue全家桶之vue-router相关推荐

  1. Vue全家桶(Vue基础看这篇就够了)

    目录 第一章:vue核心 1.1.Vue 简介 1.1.1 官网 1.1.2 Vue是什么? 1.1.3 Vue的特点 1.1.4 Vue周边库 1.2 初识Vue 1.3 模板语法 1.4 数据绑定 ...

  2. Vue全家桶 之 Vue基础

    目录 1. Vue 概述 2. Vue 基本使用 2.1 Vue安装 2.1.1 直接用 script 标签 引入 2.1.2 NPM 2.1.3 其它安装方式(略...) 2.2 与传统开发模式对比 ...

  3. 浅谈VUE全家桶(Vue、VueX、Vue-Router、axios、Vue-cli)的理解与认识

    1.Vue veu是一个渐进式的 .专注于视图层的前端开发框架,通过数据驱动和组件化的方式实现了高效的前端开发 ,既可以通过文件引入的方式在普通页面中被引入使用,也可以基于webpack等构建系统 结 ...

  4. Vue 全家桶之 vue cli (脚手架)

    一.Vue cli 简介 cli --------------------- c : command (命令) l : line ( 行 ) i : interface ( 接口 ) 命令行接口 命令 ...

  5. 【面试Vue全家桶】vue前端交互模式-es7的​语法结构?async/await​

    作者 |  Jeskson 掘金 |  https://juejin.im/user/5a16e1f3f265da43128096cb 2020.1.12 前端发请求,调用后端接口,来获取特定格式的数 ...

  6. vue取div当前宽度_【前端大神面考面试官系列】入门Vue全家桶

    (给达达前端加星标,提升前端技能) 面试官问:Vue如何安装的呢? 达达回答:Vue的安装可以从两个方面进行安装,第一种是CDN引入,第二种是NPM安装. CDN引入 <script src=& ...

  7. Vue开发入门(二) | 说说Vue全家桶有哪些~

    全家桶,顾名思义,就是一个系列,可以组合开发成完整强大的Vue项目 前言: *Vue两大核心思想:组件化和数据驱动. 组件化:把整体拆分为各个可以复用的个体 数据驱动:通过数据变化直接影响bom展示, ...

  8. 【前端大神面考面试官系列】入门Vue全家桶

    (给达达前端加星标,提升前端技能) 面试官问:Vue如何安装的呢? 达达回答:Vue的安装可以从两个方面进行安装,第一种是CDN引入,第二种是NPM安装. CDN引入 <script src=& ...

  9. 使用vue全家桶制作博客网站

    前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue.vue-router.vuex.v ...

  10. 转载: 使用vue全家桶制作博客网站 HTML5 移动网站制作的好教程

    使用vue全家桶制作博客网站 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue.vu ...

最新文章

  1. 实时检测神经振荡可实现行为相关的神经反馈
  2. 获取标签的src属性兼容性
  3. 寒假与春节终归,新学期和新任务又至
  4. go ssh 执行多个命令_每天一个 Linux 命令(92): dirname 命令
  5. exe打包工具哪个最好_为你的 Python 程序写个启动工具箱
  6. 【计算机组成原理 数字逻辑 Verilog】32位加法器的实现:支持整数的加减运算
  7. hive避免MR的情况
  8. 问题解决:java.sql.SQLException:Value '0000-00-00' can not be represented as java.sql.Date
  9. 关于js的引用类型和基本类型
  10. 关于银行,有哪些有趣的冷知识
  11. 「代码随想录」474.一和零【动态规划】力扣详解!
  12. 在Visualforce页面中使用Visual Flow
  13. ansible自动运维
  14. css translate 坐标,CSS3 位移转换 translate3d()translatez()应用实例
  15. yarn.lock、package-lock.json、npm-shrinkwrap.json的理解
  16. IDEA 设置代码提示或自动补全的快捷键
  17. Unity 之 关于停止协程的五种方式解析
  18. weibo4j中用到的mysql2bean的java工具
  19. 我的为人处事真的有问题吗?
  20. 抽象函数的对称性验证

热门文章

  1. python中格式化字符串的使用_Python中的格式化字符串
  2. HCIP考试-华为证书安全方向已取得
  3. foo/bar/baz/qux
  4. java se运行环境_Java运行环境Java SE Runtime Environment (JRE) 下载
  5. SparkSteaming使用
  6. 摘抄部分经典励志语录: 送给所有心怀梦想的人们
  7. <input>:1: UserWarning: The .grad attribute of a Tensor that is not a leaf Tensor is being accessed.
  8. c#对使用US7ASCII的oracle存取中文的问题
  9. pwnable.kr第五题:passcode
  10. ISCC -MISC-Retrieve_the_passcode