Vue router原理

Vue router原理总结:vue-router是vue项目的重要组成部分,用于构建单页应用。单页应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。路由的本质就是建立url和页面之间的映射关系router模式hash/historyhash模式是vue-router的默认模式。hash指的是url锚点,当锚点发生变化的时候,浏览器只会修改访问历史记录,不会访问服务器重新获取页面。因此可以监听描点值的变化,根据描点值渲染指定dom。hash监听方法:window.addEventListene

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

总结:

vue-router是vue项目的重要组成部分,用于构建单页应用。单页应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。路由的本质就是建立url和页面之间的映射关系

router 模式

hash / history

hash模式是vue-router的默认模式。hash指的是url锚点,当锚点发生变化的时候,浏览器只会修改访问历史记录,不会访问服务器重新获取页面。因此可以监听描点值的变化,根据描点值渲染指定dom。

hash监听方法:

window.addEventListener('hashchange', () => { 
   
   const hash = window.location.hash.substr(1)
   // 根据hash值渲染不同的dom
})

hash模式下,url可能为以下形式:
http://localhost:8080/index.html#/book?bookid=1

history模式,url会如下面所示:
http://localhost:8080/book/1

history模式
H5的history对象提供了pushState和replaceState两个方法,当调用这两个方法的时候,url会发生变化,浏览器访问历史也会发生变化,但是浏览器不会向后台发送请求。

// 第一个参数:data对象,在监听变化的事件中能够获取到
// 第二个参数:title标题
// 第三个参数:跳转地址
history.pushState({}, "", '/a')

history监听方法:
通过监听popstate事件监听history变化,也就是点击浏览器的前进或者后退功能时触发。

window.addEventListener("popstate", () => { 
   
    const path = window.location.pathname
    // 根据path不同可渲染不同的dom
})

once more
总体来讲就是 利用hash 或者history 模式修改部分 url,不会向后端发送请求,并且能监听到url变化,根据不同url 映射到不同页面

Vue中实现原理
VueRouter核心是,通过Vue.use注册插件,在插件的install方法中获取用户配置的router对象。当浏览器地址发生变化的时候,根据router对象匹配相应路由,获取组件,并将组件渲染到视图上。

1.url改变
2.触发事件监听
3.改变vue-router中的current变量
4.监视current变量的监视者
5.获取新的组件
6.render

// 存储全局使用的Vue对象
let _Vue = null
class VueRouter { 
   
  // vue.use要求plugin具备一个install方法
  static install (Vue) { 
   
    // 判断插件是否已经安装过
    if (VueRouter.install.installed) { 
   
      return
    }
    VueRouter.install.installed = true
    _Vue = Vue

    // 将main文件中实例化Vue对象时传入的router对象添加到Vue的原型链上。
    _Vue.mixin({ 
   
      beforeCreate () { 
   
        if (this.$options.router) { 
   
          _Vue.prototype.$router = this.$options.router
        }
      }
    })
  }

  constructor (options) { 
   
    this.options = options
    // 用于快速查找route
    this.routeMap = { 
   }
    this.data = _Vue.observable({ 
   
      current: window.location.hash.substr(1)
    })
    this.init()
  }

  init () { 
   
    this.createRouteMap()
    this.initComponents(_Vue)
    this.initEvent()
  }

  createRouteMap () { 
   
    // 遍历所有的路由规则 吧路由规则解析成键值对的形式存储到routeMap中
    this.options.routes.forEach(route => { 
   
      this.routeMap[route.path] = route.component
    })
  }

  initComponents (Vue) { 
   
    // 注册router-link组件
    Vue.component('router-link', { 
   
      props: { 
   
        to: String
      },
      methods: { 
   
        clickHandler (e) { 
   
          // 修改hash
          location.hash = this.to
          // 修改current,触发视图更新
          this.$router.data.current = this.to
          e.preventDefault()
        }
      },
      render (h) { 
   
        return h('a', { 
   
          attrs: { 
   
            href: this.to
          },
          on: { 
   
            click: this.clickHandler
          }
        }, [this.$slots.default])
      }
    })
    const that = this
    // 注册router-view插件
    Vue.component('router-view', { 
   
      render (h) { 
   
        const component = that.routeMap[that.data.current]
        return h(component)
      }
    })
  }

  initEvent () { 
   
    // 在hash发生更改的时候,修改current属性,触发组件更新
    window.addEventListener('hashchange', () => { 
   
      this.data.current = window.location.hash.substr(1)
    })
  }
}

export default VueRouter
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157629.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月27日 下午4:46
下一篇 2022年7月27日 下午4:46


相关推荐

  • springboot的启动_springboot启动加载

    springboot的启动_springboot启动加载总括:@SpringBootApplication包含@Configuration所以启动类是一个xml注解除了有标志作用,还需有复杂类的切面作用可以用@import@Import(EnableAutoConfigurationImportSelector.class)将配置中的类ioc实例化到容器,然后创建上下文,将实例化的bean放入上下文正文说springboot的启动流程当然少不了springboot启动入口类@SpringBootApplicationpub..

    2022年8月20日
    9
  • vs2010sp1安装未成功_c++2005怎么安装

    vs2010sp1安装未成功_c++2005怎么安装vs2005sp1安装失败是经常的事情。当发生这样的时候后,经过如下操作即可成功安装。第一步:1.单击“开始”,单击“运行”,键入secpol.msc,然后单击“确定”。2.双击“本地安全策略”。3.单击“软件限制策略”。注意:如果未列出软件限制,请右击“软件限制策略”,然后单击“新建策略”。4.在“对象类型”下,双击“强制”。5.单击“除本地管理员以外的所有…

    2022年10月6日
    3
  • 对ajax的理解面试题_javascript面试题大全

    对ajax的理解面试题_javascript面试题大全前两天面试的时候,面试官问我,你掌握的技能是Ajax,那你给我讲一下它的基本原理吧!妈呀,瞬间脑子空白。当时在门口背了好久的网络知识点,一时竟然说不吃话,只记得什么异步通信,同步数据,面试官的笑让我不寒而栗…………今天整体的整理一遍Ajax的知识点吧。…

    2022年8月27日
    9
  • 不要再走弯路了,最全的黑客入门学习路线在这[通俗易懂]

    不要再走弯路了,最全的黑客入门学习路线在这[通俗易懂]在大多数的思维里总觉得学习网络安全得先收集资料、学习编程、学习计算机基础,这样不是不可以,但是这样学效率太低了!你要知道网络安全是一门技术,任何技术的学习一定是以实践为主的。也就是说很多的理论知识其实是可以在实践中去验证拓展的,这样学习比起你啃原理、啃书本要好理解很多。所以想要学习网络安全选对正确的学习方法很重要,这可以帮你少走很多弯路。因为如果你选择了一个低效的方法,也许别人都已经彻底学会了,你还停留在入门阶段。对于小白来说,有个人引导会比自学要高效的多,尤其是容易坚持不下去的小伙伴。学姐

    2022年6月3日
    44
  • 怎么开启WAMP环境的cURL扩展

    怎么开启WAMP环境的cURL扩展因为做一些采集的功能 需要用到 curl 扩展 在本地 wamp 环境下并没有默认开启 百度一下开启方式很简单 左键单击绿色 W 图标 移动到 PHP 移动到 php 扩展 在 php curl 前面打勾 wamp 环境会自动重启 重启完成之后 curl 扩展就启用了

    2026年3月17日
    2
  • ASP.NET 如何使用 SqlTransaction

    ASP.NET 如何使用 SqlTransactiontransaction属性: 1.原子性:事务是一个完整的操作,事务的各元素师不可分的。2.一致性:事务开始时和完成时,数据必须处于一致的状态。3.隔离性:对数据进行修改的所有并发事务是彼此隔离的。4.持久性:事务完成后,它对系统的影响是永久的。  ASP.NET使用SqlTransaction处理事务操作 SqlTransaction类是对SQLSe

    2022年5月1日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号