最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

vue-router 源码实现前端路由的两种方式

来源:懂视网 责编:小采 时间:2020-11-27 22:12:12
文档

vue-router 源码实现前端路由的两种方式

vue-router 源码实现前端路由的两种方式:在学习 vue-router 的代码之前,先来简单了解一下前端路由。 前端路由主要有两种实现方法: Hash 路由 History 路由 先来看看这两种方法的实现原理。 接着我们将用它们来简单实现一个自己的前端路由。 前端路由 Hash 路由 url 的 hash 是以
推荐度:
导读vue-router 源码实现前端路由的两种方式:在学习 vue-router 的代码之前,先来简单了解一下前端路由。 前端路由主要有两种实现方法: Hash 路由 History 路由 先来看看这两种方法的实现原理。 接着我们将用它们来简单实现一个自己的前端路由。 前端路由 Hash 路由 url 的 hash 是以

在学习 vue-router 的代码之前,先来简单了解一下前端路由。

前端路由主要有两种实现方法:

  • Hash 路由
  • History 路由
  • 先来看看这两种方法的实现原理。

    接着我们将用它们来简单实现一个自己的前端路由。

    前端路由

    Hash 路由

    url 的 hash 是以 # 开头,原本是用来作为锚点,从而定位到页面的特定区域。当 hash 改变时,页面不会因此刷新,浏览器也不会向服务器发送请求。

    http://www.xxx.com/#/home

    同时, hash 改变时,并会触发相应的 hashchange 事件。所以,hash 很适合被用来做前端路由。当 hash 路由发生了跳转,便会触发 hashchange 回调,回调里可以实现页面更新的操作,从而达到跳转页面的效果。

    window.addEventListener('hashchange', function () {
     console.log('render');
    });

    History 路由

    HTML5 规范中提供了 history.pushStatehistory.replaceState 来进行路由控制。通过这两个方法,可以实现改变 url 且不向服务器发送请求。同时不会像 hash 有一个 # ,更加的美观。但是 History 路由需要服务器的支持,并且需将所有的路由重定向到根页面。

    History 路由的改变不会去触发某个事件,所以我们需要去考虑如何触发路由更新后的回调。

    有以下两种方式会改变 url:

  • 调用 history.pushState 或 history.replaceState;
  • 点击浏览器的前进与后退。
  • 第一个方式可以封装一个方法,在调用 pushState(replaceState)后再调用回调。

    function push (url) {
     window.history.pushState({}, null, url);
     handleHref();
    }
    
    function handleHref () {
     console.log('render');
    }

    第二个方式,浏览器的前进与后退会触发 popstate 事件。

    window.addEventListener('popstate', handleHref);

    路由实现

    我们通过 <a> 标签来进行切换路由,通过一个 <div> 标签来装载各路由对应的页面内容。

    参考 vue-router 的调用,我们会这么地调用一个 Router ,将路由与对应组件作为参数传入:

    const router = new Router([
     {
     path: '/',
     component: 'home'
     },
     {
     path: '/book',
     component: 'book'
     },
     {
     path: '/movie',
     component: 'movie'
     }
    ]);

    数组里是各路由对应的要显示的内容,接下来就来开始实现这个 Router

    Hash 路由实现

    Hash 路由 <a> 标签都需要带上 #

    <div>
     <a href="#/" rel="external nofollow" >home</a>
     <a href="#/book" rel="external nofollow" >book</a>
     <a href="#/movie" rel="external nofollow" >movie</a>
     
     <div id="content"></div>
    </div>

    Router 的代码实现如下:

    class Router {
     constructor (options) {
     this.routes = {};
     
     this.init();
     
     // 遍历,绑定视图更新
     options.forEach(item => {
     this.route(item.path, () => {
     	document.getElementById('content').innerHTML = item.component;
     });
     });
     }
     
     // 绑定监听事件
     init () {
     window.addEventListener('load', this.updateView.bind(this), false);
     window.addEventListener('hashchange', this.updateView.bind(this), false);
     }
     
     // 更新试图
     updateView () {
     const currentUrl = window.location.hash.slice(1) || '/';
     this.routes[currentUrl] && this.routes[currentUrl]();
     }
     
     // 将路由与回调函数关联
     route (path, cb) {
     this.routes[path] = cb;
     }
    }

    实现效果如下:

     

    History 路由实现

    History 路由需要服务器的支持,可以点击这里 的代码参考。

    <div>
     <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" data-href="/" rel="external nofollow" >home</a>
     <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" data-href="/book" rel="external nofollow" >book</a>
     <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" data-href="/movie" rel="external nofollow" >movie</a>
     
     <div id="content"></div>
    </div>

    Router 的代码实现如下:

    class Router {
     constructor (options) {
     this.routes = {};
    
     this.init();
     this.bindEvent();
    
     // 遍历,绑定视图更新
     options.forEach(item => {
     this.route(item.path, () => {
     document.getElementById('content').innerHTML = item.component;
     });
     });
     }
    
     // 绑定点击事件
     bindEvent () {
     const _this = this;
     const links = document.getElementsByTagName('a');
    
     [].forEach.call(links, link => {
     link.addEventListener('click', function () {
     const url = this.getAttribute('data-href');
     _this.push(url);
     });
     });
     }
    
     // 绑定监听事件
     init () {
     window.addEventListener('load', this.updateView.bind(this), false);
     window.addEventListener('popstate', this.updateView.bind(this), false);
     }
    
     push (url) {
     window.history.pushState({}, null, url);
     this.updateView();
     }
    
     // 更新试图
     updateView () {
     const currentUrl = window.location.pathname || '/';
     this.routes[currentUrl] && this.routes[currentUrl]();
     }
    
     // 将路由与回调函数关联
     route (path, cb) {
     this.routes[path] = cb;
     }
    }

    实现效果如下:

    最后

    前端路由实现方式有两种,分别是:

    1. Hash 路由
    2. History 路由

    原理都是修改 url 的同时不刷新页面,不向服务器发送请求,通过监听特殊的事件来更新页面。

    以上实现全部源码参考这里。

    声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文档

    vue-router 源码实现前端路由的两种方式

    vue-router 源码实现前端路由的两种方式:在学习 vue-router 的代码之前,先来简单了解一下前端路由。 前端路由主要有两种实现方法: Hash 路由 History 路由 先来看看这两种方法的实现原理。 接着我们将用它们来简单实现一个自己的前端路由。 前端路由 Hash 路由 url 的 hash 是以
    推荐度:
    标签: VUE 实现 源码
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top