vue-router原理简单实现

news2024/9/29 17:28:06

vue-router简单实现

初步预习

动态路由
在这里插入图片描述

获取id方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RCsWeouT-1673227747315)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230106160357372.png)]

第一种强依赖路由

第二种父传子方式(推荐)

嵌套路由

相同的头和尾,默认index,替换为detail

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9fSuxr4P-1673227747316)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230106160606733.png)]

编程时导航

this.$router.push()

this.$router.repleace()

this.$router.go()

this.$router.back()

hash和history

在这里插入图片描述

简单实现vue-router

1,判断是否安装了当前插件
2,把Vue构造函数记录到全局变量
3,把创建Vue实例时候传入的router对象注入到Vue实例上
再创建router-link组件的时候,template无法编译
请添加图片描述
原因是因为
请添加图片描述
所以我们有两种版本第一种就是template,再vue.config.js中配置如下

runtimeCompiler: true,

另一种是根据render函数传来的h函数进行编译渲染

大家看注释,每一部都有注释

let _Vue = null;
export default class VueRouter {
  static install(Vue) {
    // 1,判断是否安装了当前插件
    if (VueRouter.install.installed) return;
    VueRouter.install.installed = true;

    // 2,把Vue构造函数记录到全局变量
    _Vue = Vue;

    // 3,把创建Vue实例时候传入的router对象注入到Vue实例上

    //混入
    _Vue.mixin({
      beforeCreate() {
        if (this.$options.router) {
          _Vue.prototype.$router = this.$options.router;
          this.$options.router.init();
        }
      },
    });
  }
  constructor(options) {
    // 记录传入的选项
    this.options = options;
    // 把options里面的路由规则记录到routerMap里面
    this.routeMap = {};
    // vue提供的observable可以创建响应式的对象
    this.data = _Vue.observable({
      current: '/',
    });
  }

  init() {
    this.initCreateRouteMap();
    this.initComponents(_Vue);
    this.initEvent();
  }

  initCreateRouteMap() {
    // 遍历所有的路由规则以键值对的形式存储到routeMap里面
    this.options.routes.forEach((route) => {
      // 键是路径,值是对应组件
      this.routeMap[route.path] = route.component;
    });
  }

  // 创建router-link组件
  initComponents(Vue) {
    Vue.component('router-link', {
      props: {
        to: String,
      },
      //Vue传来的h函数 选择器,设置属性,a标签之间的内容 运行时
      render(h) {
        return h(
          'a',
          {
            attrs: {
              href: this.to,
            },
            on: {
              click: this.clickHandler,
            },
          },
          [this.$slots.default]
        );
      },
      methods: {
        clickHandler(e) {
          history.pushState({}, '', this.to);
          //把当前路径赋值,它是响应式的 h函数会去渲染dom
          this.$router.data.current = this.to;
          e.preventDefault();
        },
      },
      //完整时
      // template: '<a :href="to"><slot></slot></a>',
    });
    const _this = this;
    Vue.component('router-view', {
      render(h) {
        //拿到当前路径组件放到h函数进行虚拟dom渲染
        const component = _this.routeMap[_this.data.current];
        return h(component);
      },
    });
  }
  //浏览器历史回退
  initEvent() {
    window.addEventListener('popstate', () => {
      this.data.current = window.location.pathname;
    });
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吊炸天,springboot的多环境配置一下搞明白了!

1、 使用springboot的profile命名规则profile用于多环境的激活和配置&#xff0c;用来切换生产&#xff0c;测试&#xff0c;本地等多套不通环境的配置。如果每次去更改配置就非常麻烦&#xff0c;profile就是用来切换多环境配置的。在Spring Boot框架中&#xff0c;使用Profil…

漏洞优先级排序的六大关键因素

当我们谈及开源漏洞时&#xff0c;我们会发现其数量永远处于增长状态。根据安全公司 Mend 研究发现&#xff0c;在 2022 年前九个月发现并添加到其漏洞数据库中的开源漏洞数量比 2021 年增加了 33%。该报告从 2022 年 1 月到 2022 年 9 月对大约 1,000 家北美公司进行了代表性抽…

一篇文章解决C语言操作符

我的主页&#xff1a;一只认真写代码的程序猿本文章是关于C语言操作符的讲解收录于专栏【C语言的学习】 目录 1、算术操作符 2、赋值操作符 3、关系操作符 4、条件操作符&#xff08;三目&#xff09; 5、逻辑操作符 6、单目操作符 7、移位操作符 8、位操作符 9、逗号…

使用Docker+Nignx部署vue项目

文章目录一、前言二、vue项目打包三、nginx基本介绍①nginx常用的功能&#xff1a;②nginx默认的主题配置文件解读③nginx目录解读三、docker内部署nginx①拉取nginx镜像②创建数据持久化目录☆☆☆③创建需要映射进去的文件④运行nginx四、大工告成最近&#xff08;之前&#…

2023年DAMA-CDGA/CDGP数据治理工程师认证(线上班)报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

gcc、g++,linux升级gcc、g++

安装cv-cuda库&#xff0c;要求gcc11&#xff0c;cmake>3.22版本。 Linux distro:Ubuntu x86_64 > 18.04WSL2 with Ubuntu > 20.04 (tested with 20.04) CUDA Driver > 11.7 (Not tested on 12.0) GCC > 11.0 Python > 3.7 cmake > 3.22gcc、g介绍 参考&…

手把手安装GNN必备库 —— pytorch_geometric

0 BackGround GNN&#xff1a;图神经网络&#xff0c;由于传统的CNN网络无法表示顶点和边这种关系型数据&#xff0c;便出现了图神经网络解决这种图数据的表示问题&#xff0c;这属于CNN往图方向的应用扩展。 GCN&#xff1a;图卷积神经网络&#xff0c;GNN在训练过程中&#…

【ONE·R || 两次作业(二):GEO数据处理下载分析】

总言 两次作业汇报其二&#xff1a;GEO数据处理学习汇报。    文章目录总言2、作业二&#xff1a;GEO数据处理下载分析2.1、GEO数据库下载前准备2.2、GEO数据库下载及数据初步处理2.2.1、分阶段解析演示2.2.1.1、编号下载流程2.2.1.2、对gset[ 1 ]初步分析2.2.1.3、对gset[ 2…

基于requests框架实现接口自动化测试项目实战

requests库是一个常用的用于http请求的模块&#xff0c;它使用python语言编写&#xff0c;在当下python系列的接口自动化中应用广泛&#xff0c;本文将带领大家深入学习这个库&#xff0c;Python环境的安装就不在这里赘述了&#xff0c;我们直接开干。 01 requests的安装 win…

销售结束语话术

销售要记住&#xff0c;结束语不代表结束&#xff0c;而是下一次沟通的开始&#xff0c;所以销售要学会通过结束语来为自己争取下次沟通的机会。 前言 不论是哪一行业&#xff0c;对于销售而言&#xff0c;大多数成交的客户都是经过持续有效的跟踪的&#xff0c;还会出现有很多…

Java设计模式-原型模式Prototype

介绍 当我们有一个类的实例&#xff08;Prototype&#xff09;并且我们想通过复制原型来创建新对象时&#xff0c;通常使用Prototype模式。 原型模式是一种创建型设计模式。能够复制已有对象&#xff0c; 而又无需使代码依赖它们所属的类。 场景举例 现在有一只羊 tom&#xf…

iTerm2连接ssh配置

iTerm2连接ssh配置 #首先在/Users目录下按照如下命令创建sh脚本 cd /Users/#创建iterm文件夹 mkdir iterm#进入iterm文件夹 cd iterm#创建myserver.sh文件 touch myserver.sh#编辑myserver.sh文件 vi myserver.sh如果出现没有权限&#xff0c;就命令前面加上sudo 键盘输入i编…

斯皮尔曼相关(spearman)相关性分析一文详解+python实例代码

前言 相关性分析算是很多算法以及建模的基础知识之一了&#xff0c;十分经典。关于许多特征关联关系以及相关趋势都可以利用相关性分析计算表达。其中常见的相关性系数就有三种&#xff1a;person相关系数&#xff0c;spearman相关系数&#xff0c;Kendalls tau-b等级相关系数…

Java + OpenCv 根据PID/VID调用指定摄像头

问题&#xff1a; 主机接入了多个USB摄像头&#xff0c;传统的OpenCv是用摄像头插入usb的下标调取的&#xff0c;如过只接入一个摄像头那直接使用capture.open(0);这种方式调用没有任何问题&#xff0c;多个的话&#xff0c;就会出现问题&#xff0c;因为USB拔插时候对应摄像头…

用原生的方式写vue组件之深度剖析组件内部的原理

目录前言一&#xff0c;对组件的复习及理解二&#xff0c;模块化与组件化三&#xff0c;用原生的方式写vue组件3.1 准备工作3.2 创建组件3.3 组件中的data为什么是函数式写法3.4 组件中的template四&#xff0c;注册组件五&#xff0c;使用组件六&#xff0c;全局组件七&#x…

阿里云服务器ECS购买教程

本文是关于阿里云主机&#xff08;服务器ECS&#xff09;购买流程的一个详细介绍。阿里云服务器&#xff08;Elastic Compute Service&#xff0c;简称 ECS&#xff09;是一种简单高效、处理能力可弹性伸缩的计算服务&#xff0c;帮助您快速构建更稳定、安全的应用&#xff0c;…

机器学习实战教程(十二):线性回归提高篇

一、前言本篇文章讲解线性回归的缩减方法&#xff0c;岭回归以及逐步线性回归&#xff0c;同时熟悉sklearn的岭回归使用方法&#xff0c;对乐高玩具套件的二手价格做出预测。二、岭回归如果数据的特征比样本点还多应该怎么办&#xff1f;很显然&#xff0c;此时我们不能再使用上…

【Elsevier出版社】1区智能物联网类SCIEI,审稿友好~

1区智能物联网类SCI&EI 【出版社】Elsevier 【期刊简介】IF&#xff1a;5.5-6.0&#xff0c;JCR1区&#xff0c;中科院3区 【检索情况】SCI&EI 双检&#xff0c;正刊 【参考周期】3个月左右录用 【截稿日期】2023.2.28 【征稿领域】 ①物联网辅助的智能解决方案…

送给SQL开发者的一份新年礼物!麦聪软件发布一款纯Web化SQL开发工具,免安装还免费!

2023年新年伊始&#xff0c;麦聪软件再次迎来一个好消息&#xff1a;一款100%自主研发的纯Web化SQL开发工具——SQL Studio 1.0正式发布。这款产品让SQL开发者在Navicat、DBeaver之外&#xff0c;又多一款值得信赖的SQL开发工具可用。 图片 目前&#xff0c;SQL Studio 1.0面向…

qt读写xml文件(DOM和SAX两种方式)

一、XML简介&#xff1a; XML, 全称为扩展标记语言, 可用来标记数据、定义数据类型&#xff0c;是一种允许用户对自己的标记语言进行定义的源语言。XML非常适合万维网传输&#xff0c;提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据&#xff0c;是Internet环境…