iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >如何实现vue-router
  • 284
分享到

如何实现vue-router

2024-04-02 19:04:59 284人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关如何实现Vue-router,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。开始实现想象一下,如果自己实现了一个 vue-router,会怎么去

这篇文章将为大家详细讲解有关如何实现Vue-router,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

开始实现

想象一下,如果自己实现了一个 vue-router,会怎么去使用呢?参考 vue-router 官方的使用方式,看看 html 的使用:

<div id="app">
 <p>
  <router-link to="#/">home</router-link>
  <router-link to="#/book">book</router-link>
  <router-link to="#/movie">movie</router-link>
 </p>
 <router-view></router-view>
</div>

这里会有 router-link 和 router-view 两个组件需要我们来实现。再来看 js 的:

const Home = { template: '<div>home</div>' };
const Book = { template: '<div>book</div>' };
const Movie = { template: '<div>movie</div>' };

const routes = [
 { path: '/', component: Home },
 { path: '/book', component: Book },
 { path: '/movie', component: Movie }
];

const router = new VueRouter(Vue, {
 routes
});

new Vue({
 el: '#app'
});

这里会有我们自己定义的组件 Home、Book 和 Movie,并且有它们各自对应的路由。我们实现的 VueRouter 跟官方的有些区别,在 VueRouter 被 new 时是将 Vue 作为参数传入,而不是注入挂载到根实例下。

接下来就是 VueRouter 的实现了。

VueRouter

要怎么来实现 VueRouter 呢,先提供一下实现的思路:

  1. 绑定 hashchange 事件,实现前端路由;

  2. 将传入的路由和组件做一个路由映射,切换哪个路由即可找到对应的组件显示;

  3. 需要 new 一个 Vue 实例还做响应式通信,当路由改变的时候,router-view 会响应更新;

  4. 注册 router-link 和 router-view 组件。

先创建一个 VueRouter:

class VueRouter {
 constructor (Vue, options) {
  this.$options = options;
 }
}

绑定事件

给 VueRouter 添加一个绑定事件的方法,一旦路由发生改变,会触发 onHashChange 方法。

constructor (Vue, options) {
 this.init();
}

// 绑定事件
init () {
 window.addEventListener('load', this.onHashChange.bind(this), false);
 window.addEventListener('hashchange', this.onHashChange.bind(this), false);
}

路由映射表

将传入的 options 设置成一张路由映射表,以便于通过路由查找到对应的组件。

constructor (Vue, options) {
 this.$options = options;
 this.routeMap = {};
 this.createRouteMap(this.$options);
}

// 路由映射表
createRouteMap (options) {
 options.routes.forEach(item => {
  this.routeMap[item.path] = item.component;
 });
}

options 之中,路由与组件的关系:

const routes = [
 { path: '/', component: Home },
 { path: '/book', component: Book },
 { path: '/movie', component: Movie }
];

生成的路由映射表:

this.routeMap = {
 '/': Home,
 '/book': Book,
 '/movie': Movie
};

响应

我们需要 new 一个新的 Vue 实例,将当前路由 current 储存在其 data 之中,当修改了 current 时,router-view 就会自己去更新视图。

constructor (Vue, options) {
 this.app = new Vue({
  data: {
   current: '#/'
  }
 });
}

// 获取当前 hash 串
getHash () {
 return window.location.hash.slice(1) || '/';
}


// 设置当前路径
onHashChange () {
 this.app.current = this.getHash();
}

只要在 router-view 里使用到了 this.app.current,一旦更新它,便会更新。

注册组件

router-link 实际上就是一个 <a> 标签,点击它便能触发 hashchangerouter-view 会实现一个 render 方法,将当前路由对应的组件取出,进行渲染。

constructor (Vue, options) {
 this.initComponent(Vue);
}

// 注册组件
initComponent (Vue) {
 Vue.component('router-link', {
  props: {
   to: String
  },
  template: '<a :href="to" rel="external nofollow" rel="external nofollow" ><slot></slot></a>'
 });

 const _this = this;
 Vue.component('router-view', {
  render (h) {
   var component = _this.routeMap[_this.app.current];
   return h(component);
  }
 });
}

完整代码

至此,一个简单的 vue-router 就出来了,全部代码是这样的:

class VueRouter {
 constructor (Vue, options) {
  this.$options = options;
  this.routeMap = {};
  this.app = new Vue({
   data: {
    current: '#/'
   }
  });

  this.init();
  this.createRouteMap(this.$options);
  this.initComponent(Vue);
 }

 // 绑定事件
 init () {
  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
   },
   template: '<a :href="to" rel="external nofollow" rel="external nofollow" ><slot></slot></a>'
  });

  const _this = this;
  Vue.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 与 Hash 路由结合,监听了 hashchange 事件,再通过 Vue 的 响应机制 和 组件,便有了上面实现好了一个 vue-router。

关于“如何实现vue-router”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: 如何实现vue-router

本文链接: https://www.lsjlt.com/news/76244.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何实现vue-router
    这篇文章将为大家详细讲解有关如何实现vue-router,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。开始实现想象一下,如果自己实现了一个 vue-router,会怎么去...
    99+
    2022-10-19
  • Vue如何实现router传参
    本文小编为大家详细介绍“Vue如何实现router传参”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue如何实现router传参”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue-router 参数传递的方...
    99+
    2023-07-04
  • vue router如何实现tab切换
    目录router实现tab切换router类似tab切换的使用router实现tab切换 实现的效果:path路径发生改变,tab切换的颜色也会到相对应的地方,并且进首页,默认推荐为...
    99+
    2022-11-13
  • Vue router动态路由如何实现
    本文小编为大家详细介绍“Vue router动态路由如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue router动态路由如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。实...
    99+
    2023-07-05
  • vue-router如何实现tab标签页
    这篇文章主要介绍了vue-router如何实现tab标签页,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue-router 是 Vue.j...
    99+
    2022-10-19
  • vue-router如何实现权限控制
    这篇文章主要讲解了“vue-router如何实现权限控制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue-router如何实现权限控制”吧!在vue-router控制前端权限是常见需求:...
    99+
    2023-07-04
  • vue-router配合ElementUI如何实现导航
    这篇文章将为大家详细讲解有关vue-router配合ElementUI如何实现导航,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在每个项目中路由是不可或缺的,最近学习vu...
    99+
    2022-10-19
  • vue-router如何实现路由懒加载
    这篇文章主要为大家展示了“vue-router如何实现路由懒加载”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue-router如何实现路由懒加载”这篇文章吧...
    99+
    2022-10-19
  • vue-router如何实现history模式配置
    目录vue-router history模式配置一:概述二、实现history模式需要怎样配置mode:“history“的作用vue-router hist...
    99+
    2022-11-13
  • vue如何使用router-link实现路由跳转
    这篇文章主要介绍vue如何使用router-link实现路由跳转,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!router-link 【实现跳转最简单的方法】<router-link to='...
    99+
    2023-06-18
  • vue-router如何使用
    这篇文章将为大家详细讲解有关vue-router如何使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、引子要学习vue-router就要先知道这里的路由是什么?为什么...
    99+
    2022-10-19
  • 如何使用vue-router实现动态权限控制
    本篇内容介绍了“如何使用vue-router实现动态权限控制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用vue开发带权限管理系统,尤其...
    99+
    2023-07-04
  • vue-router如何实现跳转时打开新页面
    小编给大家分享一下vue-router如何实现跳转时打开新页面,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、<vue-...
    99+
    2022-10-19
  • Vue-router类似Vuex如何实现组件化开发
    这篇文章主要介绍了Vue-router类似Vuex如何实现组件化开发,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:随着项目越来越大...
    99+
    2022-10-19
  • vue中如何使用router-link实现跳转页面
    这篇文章主要介绍了vue中如何使用router-link实现跳转页面,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。router-link跳转...
    99+
    2022-10-19
  • Vue+Router+Element实现简易导航栏
    本项目为大家分享了Vue+Router+Element实现简易导航栏的具体代码,供大家参考,具体内容如下 项目结构: 直接上代码:主要就是引入配置路由Router  ①:...
    99+
    2022-11-12
  • vue router-view的嵌套显示实现
    目录一、路由配置二、vue页面嵌套三、嵌套联系一、路由配置 const routes = [ { path: '/', name: '导航1', co...
    99+
    2022-11-12
  • vue-router子路由的实现方式
    目录实验目的创建Admin页面创建子页面修改router/index.js代码总结在应用界面开发中通常由多层嵌套的组件组合而成。 但随着页面的增多,如果把所有的页面都塞到一个 rou...
    99+
    2023-02-06
    vue-router子路由 vue-router路由 vue-router实现子路由
  • vue-router后台鉴权流程实现
    目录前言:路由拦截鉴权常用的两种方法比较:与动态路由相关的通常有以下几个文件:router.jspermission.jsstore.js退出登录:结尾:前言: 最近项目遇到一个管理...
    99+
    2022-11-13
    vue-router后台鉴权 vue-router 鉴权
  • Vue-Router的实现原理是什么
    这篇文章主要介绍“Vue-Router的实现原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue-Router的实现原理是什么”文章能帮助大家解决问题。路由既然我们在分析路由,我们首先来说...
    99+
    2023-07-04
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作