手撕Vue中的RouterLink和RouterView,深入理解其底层原理(一)

news2024/9/25 15:25:36

RouterLink和RouterView的作用

我们可以通过RouterLink绑定好指向的路径

点击就能够实现在RouterView中将页面显示出来

我们首先使用官方的vue-router展示一下效果

请添加图片描述

  • App.vue
<template>
  <div>
    <router-link to="/">Home</router-link>
    <router-link to="/about">About</router-link>
    <router-view />
  </div>
</template>

<script setup></script>

这其中有没有发现一个问题,我们根本就没有去引入RouterLink和RouterView,但是却可以正常的使用它们

其中就是因为

  • mian.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'

const app = createApp(App)
app.use(router)
app.mount('#app')

我们在app中use了router,也就是说我们通过这个方式已经全局的引入了这两个组件,并且他们能够实现一个路由跳转的功能

接下来我们逐一分析一下RouterLink和RouterView

手撕RouterLink,原理全解!!!!

我们知道,RouterLink是可以实现路由跳转的,接下来我们去手撕一下它的源码

RouterView手撕在下一篇文章

手撕Vue中的RouterLink和RouterView,深入理解其底层原理(二) - 掘金 (juejin.cn)

就可以知道他的里面是肯定有一个a标签用于做路由跳转的

所有我们可以把代码写成这样,这里采用hash的方式去做,所以才有#号

在模板中创建了一个链接 <a> 元素,链接的 href 属性值为 '#' + props.to

# 加上传入的 to 属性值作为链接地址

  • RouterLink.vue
<template>
    <a :href="'#' + props.to">
    <slot/>
    </a>
</template>

<script setup>
import { defineProps } from "vue";

const props = defineProps({
    to: {
        type: String,
        required: true
    }
})
</script>

我们首先将vue自带的vue-router给取消引入

  • main.js
import { createApp } from 'vue'
import App from './App.vue'
// import router from './router'

const app = createApp(App)

// app.use(router)

app.mount('#app')

接下来我们去修改app.vue的代码,引入我们自己的routerlink

  • App.vue
<template>
  <div>
    <RouterLink to="/">Home</RouterLink>
    <RouterLink to="/about">About</RouterLink>
    <router-view />
  </div>
</template>

<script setup>
import RouterLink from './router/grouter/RouterLink.vue'

</script>

<style lang="scss" scoped></style>

可以看到在组件树中已经将我们自己的组件渲染了

在这里插入图片描述

目前就是实现了简单的路由的切换了

但是我们这里是通过引入的方式才能使用,而官方的却不需要,说明什么?

这两个组件是全局组件,在任何一个地方都是可以使用的

接下来我们就需要创建一个js文件

  • @/router/grouter/index.js
import { createRouter } from "vue-router";

class Router {
  constructor() {}
}

const createRouter = function () {
  return new Router();
};

export { createRouter };

定义了一个 Router 类和一个 createRouter 函数。

在这个 createRouter 函数中,它的作用是创建并返回一个 Router 类的实例。通过 export { createRouter }; 语句,使得 createRouter 函数可以在其他模块中被导入和使用。

继续创建一个js文件引入这个createRouter,并创建router

  • @/router/index.js
import { createRouter } from '@/router/grouter/index';

const router = createRouter();

export default router;

然后在main.js中去使用这个文件

import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router/index'

const app = createApp(App)

app.use(router)

app.mount('#app')

接下来我们在效果中可以看到

在这里插入图片描述

这代码警告诉我们一个插件必须实现"install"方法才可以被use

接下来我们就需要前言修改代码了

  • @/router/grouter/index.js
class Router {
  constructor() {
  }
  install(){
    console.log('vue对接router')
  }
}

const createRouter = function () {
  return new Router();
};

export { createRouter };

我们就能看到效果了

接下来我们就可以在install里面完成全局组件的声明

因为在使用use的时候,会给install方法传入一个app,使用app.component就可以注册一个全局的组件

修改install方法

install(app) {
    console.log(app);
    console.log("vue对接router");
    app.component("RouterLink", RouterLink);
  }

我们就可以看到打印的效果为

请添加图片描述

接下来我们就能在全局使用RouterLink了

将App.vue中的import RouterLink from './router/grouter/RouterLink.vue'注释以后

原来的路由变更效果一样可以实现!!

这样我们的RouterLink的基本原理就已经被我们手撕出来了!!!

由于篇幅过长,RouterView的手撕就放在下一节文章来讲述,RouterView的手撕更加的精彩!!!

手撕Vue中的RouterLink和RouterView,深入理解其底层原理(二) - 掘金 (juejin.cn)

总结

本文我们手撕了RouterLink,对于全局引入组件也有了一个更加深刻的理解

相信看到这里的你也一定会有所收获的!!!

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

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

相关文章

Real User ID 和 Effective User ID 的区别

在 Unix 和 Linux 系统中&#xff0c;每个进程都有多个用户标识符&#xff08;UID&#xff09;&#xff0c;其中最重要的是“真实用户 ID”&#xff08;real UID&#xff09;和“有效用户 ID”&#xff08;effective UID&#xff09;。 它们的区别和用途如下&#xff1a; 真实…

STM32入门开发操作记录(一)——新建工程

目录 一、课程准备1. 课程资料2. 配件清单3. 根目录 二、环境搭建三、新建工程1. 载入器件支持包2. 添加模块3. ST配置4. 外观设置5. 主函数文件 一、课程准备 1. 课程资料 本记录操作流程参考自b站视频BV1th411z7snSTM32入门教程-2023版 细致讲解 中文字幕&#xff0c;课程资…

五. TensorRT API的基本使用-MNIST-model-build-infer

目录 前言0. 简述1. 案例运行2. 代码分析2.1 main函数2.2 build接口2.3 infer接口2.4 其他 总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习课程第五章—TensorRT API 的基…

7.13实训日志

上午 学习网络安全的过程中&#xff0c;我们深入了解了网络的不同层面和技术&#xff0c;从表层网络到深网再到暗网&#xff0c;以及涉及的产业分类和技术工具。这些知识不仅帮助我们理解网络的复杂性&#xff0c;还揭示了如何应对和防范各种网络威胁。 首先&#xff0c;我们…

滞后序列分析案例详解

一个半小时 超出30分钟 日期&#xff1a;2024-07-13 19:14:33 回放 摘要 Python在行为分析中的应用 主要讲述了如何使用Python处理序列数据&#xff0c;以及如何结合定性分析和定量分析来全面分析课程内容。讲者提到了一种叫做分层法的分类方法&#xff0c;该方法使用了布鲁…

记录vite项目中Cornerstone的兼容问题(持续更新)

&#x1f50e; 在vite项目中打包提示错误 ESM integration proposal for Wasm" is not supported currently. ⛳️ 问题描述 Error: Could not load /home/xxx/xxx/node_modules/icr/polyseg-wasm/dist/ICRPolySeg.wasm (imported by node_modules/icr/polyseg-wasm/di…

【软件建模与设计】-02-UML图

目录 摘要 1、用例图&#xff08;use case diagram&#xff09; 2、类与对象 3、类图 3.1、四种关系 3.2、可见性 4、交互图 4.1、通信图 4.2、顺序图 5、状态机图 6、包图 7、并发通信图 8、部署图 9、UML扩展机制 9.1、构造型 9.2、标记值 9.3、约束 摘要 用…

log4j2的日志框架(详细,springboot和异步日志的实现)

目录 log4j2的介绍 Log4j2的性能 SpringBoot中的使用Log4j2 log4j2的进阶--异步日志 AsyncAppender方式 AsyncLogger方式 log4j2的介绍 Apache Log4j 2是对Log4j的升级版&#xff0c;参考了logback的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带 来…

韦东山嵌入式linux系列-驱动进化之路:总线设备驱动模型

1 驱动编写的 3 种方法 以 LED 驱动为例 1.1 传统写法 使用哪个引脚&#xff0c;怎么操作引脚&#xff0c;都写死在代码中。 最简单&#xff0c;不考虑扩展性&#xff0c;可以快速实现功能。 修改引脚时&#xff0c;需要重新编译。 应用程序调用open等函数最简单的方法是驱动…

ISO 45001:提升职业健康与安全管理水平的关键

在现代企业管理中&#xff0c;员工的职业健康与安全&#xff08;OH&S&#xff09;已经成为不可忽视的重要议题。ISO 45001作为国际标准化组织&#xff08;ISO&#xff09;制定的职业健康与安全管理体系标准&#xff0c;为企业提供了科学有效的管理规范和指南。实施这一标准…

C#中的反射

dll和exe文件的区别 用途&#xff1a; .exe&#xff08;可执行文件&#xff09;&#xff1a;是可以直接运行的程序文件。当你双击一个 .exe 文件或在命令行中输入它的名字&#xff0c;操作系统会加载并执行这个程序。 .dll&#xff08;动态链接库&#xff09;&#xff1a;包含…

如何在SpringCloud中使用Kafka Streams实现实时数据处理

使用Kafka Streams在Spring Cloud中实现实时数据处理可以帮助我们构建可扩展、高性能的实时数据处理应用。Kafka Streams是一个基于Kafka的流处理库&#xff0c;它可以用来处理流式数据&#xff0c;进行流式计算和转换操作。 下面将介绍如何在Spring Cloud中使用Kafka Streams实…

从零开学C++:类和对象(中)

引言&#xff1a;在我们学习了类和对象&#xff08;上&#xff09;的基础知识后&#xff0c;我们就需要进入类和对象&#xff08;中&#xff09;的学习。本篇博客将会介绍C的几个默认成员函数&#xff0c;它们的存在虽然难以理解&#xff0c;但也是C如此简单实用的原因之一。相…

C++学习指南(一)——C++入门基础

欢迎来到繁星的CSDN&#xff0c;本期内容主要包括C第一个程序&#xff0c;命名空间&#xff0c;缺省参数&#xff0c;函数重载&#xff0c;引用、inline以及nullptr这些基础概念。 在进入正题之前&#xff0c;我需要先阐述一下。本系列涉及的内容为C部分&#xff0c;可以理解为…

The Open Group 爱丁堡大会高光集锦——企业架构、人工智能和可持续发展的创新交叉点

4月底&#xff0c;The Open Group峰会在英国爱丁堡顺利举办。活动邀请到数十位领域专家、技术、论坛成员、工作组和联合组织等相聚在一起&#xff0c;围绕生态系统架构和人工智能标准、可持续性、企业架构、数字转型等话题进行了对话与探讨。大会吸引了来自30个国家的400位观众…

bi项目笔记

1.bi是什么 bi项目就是商业智能系统&#xff0c;也就是数据可视画、报表可视化系统&#xff0c;如下图的就是bi项目了 2.技术栈

Mysql数据库的备份与恢复以及索引操作

一&#xff0c;备份与恢复操作 1&#xff0c;创建数据库booksDB CREATE DATABASE booksDB; use booksDB; 2&#xff0c;建表 &#xff08;1&#xff09;创建表books CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NUL…

MYSQL--第八次作业

MYSQL–第八次作业 一、备份与恢复 环境搭建&#xff1a; CREATE DATABASE booksDB; use booksDB;CREATE TABLE books ( bk_id INT NOT NULL PRIMARY KEY, bk_title VARCHAR(50) NOT NULL, copyright YEAR NOT NULL );CREATE TABLE authors ( auth_id INT NOT NULL PRI…

SpringCloud第三篇(服务中心与OpenFeign)

p 文章目录 一、服务中心二、Nacos注册中心 一、服务中心 在上一章我们实现了微服务拆分&#xff0c;并且通过Http请求实现了跨微服务的远程调用。不过这种手动发送Http请求的方式存在一些问题。 试想一下&#xff0c;假如商品微服务被调用较多&#xff0c;为了应对更高的并发…

【JavaEE】AOP实现原理

概述 Spring AOP 是基于动态代理来实现AOP的, 此处主要介绍代理模式和Spring AOP的源码剖析 一.代理模式 代理模式是一种常用的设计模式&#xff0c;它允许为其他对象提供代理&#xff0c;以控制对这个对象的访问。这种结构在不改变原始类的基础上&#xff0c;通过引入代理类…