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

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.mfbz.cn/a/797004.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51单片机STC89C52RC——17.2 红外遥控数字加减、电机调速

目的/效果 1&#xff1a;按VOL-键数字减、按VOL加数字加 2&#xff1a;按键 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4 电机调速 一&#xff0c;STC单片机模块 二&#xff0c;红外遥控 详细了解红外遥控控制原理请参考《51单片机STC89C52RC——17.1 红外线遥控…

UE4 解决创建布料报错:三角形退化

**【问题】**创建创建布料时报错&#xff1a;三角形退化 【方法】 1.要重新绑定&#xff1a;导入到ue4为静态网格体&#xff0c;勾选“移除退化”&#xff0c;再导出fbx&#xff0c;再重新绑定 2.不用重新绑定&#xff1a;使用排除法&#xff08;费时&#xff09;&#xff0c…

Spring Boot快速上手

一&#xff0c;什么是spring 首先登陆Spring官网&#xff0c;看一下官网如何形容的&#xff0c; 可以看出Spring是为了使java程序更加快速&#xff0c;方便&#xff0c;安全所做出的java框架。 1.Spring Boot Spring Boot的诞生就是为了简化Spring的开发&#xff0c;也就是更…

【Quart 框架——来源于Flask的强大且灵活的异步Web框架】

目录 前言一、Quart简介1-1、简介1-2、与flask的区别 二、快速开始2-1、安装2-2、基本用法 三、核心功能3-1、异步路由3-2、WebSockets 支持3-3、中间件3-4、蓝图 (Blueprints) 四、部署4-1、使用uvicorn部署4-2、使用hypercorn部署 五、案例分析总结 前言 Quart 是一个基于 Py…

taocms 3.0.1 本地文件泄露漏洞(CVE-2021-44983)

前言 CVE-2021-44983 是一个影响 taoCMS 3.0.1 的远程代码执行&#xff08;RCE&#xff09;漏洞。该漏洞允许攻击者通过上传恶意文件并在服务器上执行任意代码来利用这一安全缺陷。 漏洞描述 taoCMS 是一个内容管理系统&#xff08;CMS&#xff09;&#xff0c;用于创建和管…

用Qwt进行图表和数据可视化开发

目录 Qwt介绍 示例应用场景 典型QWT开发流程 举一些Qwt的例子&#xff0c;多绘制几种类型的图像 1. 绘制折线图 (Line Plot) 2. 绘制散点图 (Scatter Plot) 3. 绘制柱状图 (Bar Plot) 4. 绘制直方图 (Histogram) Qwt介绍 QWT开发主要涉及使用QWT库进行图表和数据可视化…

在若依框架基础上开发新功能

本文介绍如何在若依框架&#xff08;不分离版本&#xff09;的基础上开发新功能。 目录 运行若依框架 下载若依框架代码 IDEA打开若依框架代码 初始化数据库 修改数据库配置 运行项目 设计数据库 数据表命名规则 建表及初始化数据 开发新功能 后端CRUD功能 用户前端…

从零开始做题:神奇的棋盘

题目 打开得到一副adfgvx加密棋盘 观察txt数据只有1-5&#xff0c;猜测是数字字母坐标转换&#xff0c;用notepad批量操作一下 解题 AGAXXDAGGVGGVDVADAVXDGADVGDVAADDDDFXAFAFDGDVXXDGGDGGDXDDFDDXVGXADGVDFXVVAADDXDXXADDVGGGXGXXXXGXXGGXGDVVVGGGAGAAAAGAAGGAGDDDAGAGGG…

JS实现:统计字符出现频率/计算文字在文本中的出现次数

要实现这个功能&#xff0c;JavaScript 一个非常强大的方法&#xff0c;那就是reduce() reduce() 它用于将数组的所有元素减少到一个单一的值。这个值可以是任何类型&#xff0c;包括但不限于数字、字符串、对象或数组。 reduce() 方法接收一个回调函数作为参数&#xff0c;这个…

Java单边表的局部翻转

反转链表 II 这是上一个翻转全部链表的进阶版&#xff0c;大家可以先去看我的上一篇博客 Java算法之单链表的全部翻转-CSDN博客 题目描述 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节…

Spring Cloud Eureka

引入&#xff1a;远程调用时&#xff0c;url是写死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 解决思路&#xff1a; 比如&#xff08;医院&#xff0c;学校等&#xff09;机构的电话号码发生变化&#xff0c;就需要通知各个使⽤…

mybatilsplaus 常用注解

官网地址 baomidou注解配置

vue3项目,表单增删改

效果图 ArticleChannel.vue页面代码 <script setup> import {artGetChannelsService ,artDelChannelService} from /api/article.js import { Edit, Delete } from element-plus/icons-vue //调用open方法&#xff0c;ChannelEdit去修改组件内部类容 import ChannelEdit…

【Linux】1w详解如何实现一个简单的shell

目录 实现思路 1. 交互 获取命令行 2. 子串分割 解析命令行 3. 指令的判断 内建命令 4. 普通命令的执行 补充&#xff1a;vim 文本替换 整体代码 重点思考 1.getenv和putenv是什么意思 2.代码extern char **environ; 3.内建命令是什么 4.lastcode WEXITSTATUS(sta…

linux nethogs网络监控程序(端口监控、流量监控、上传流量、下载流量、进程监控进程网络)

文章目录 Nethogs 网络监控程序详解1. 引言2. Nethogs 的安装与运行2.1 安装 Nethogs- **Debian/Ubuntu**- **Fedora**- **Arch Linux** 2.2 运行 Nethogs 3. Nethogs 的使用详解3.1 基本界面- **PID**&#xff1a;进程的 ID。- **用户**&#xff1a;运行该进程的用户。- **程序…

graphviz subgraph添加边界框

subgraph name 属性必须要以cluster开头。 A Quick Introduction to GraphvizAn awesome tool for software documentation and visualizing graphshttps://www.worthe-it.co.za/blog/2017-09-19-quick-introduction-to-graphviz.html digraph {rankdir"LR"// the n…

DEBUG:jeston卡 远程ssh编程

问题 jeston 打开网页 gpt都不方便 而且只需要敲命令就行 解决 下载MobaXterm(window执行) liunx需要虚拟机 软件 远程快速复制命令

7.13 专题训练DP

P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ac代码 #include<bits/stdc.h> using namespace std; typedef long long ll; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) const ll mod 1e97;int main() {IOS;int n;cin>>n;int a[…

Unity Text Mesh Pro 中英文混编自动换行问题

问题描述 使用TextMeshPro 输入中英文时&#xff0c;在一行内 输入中英文&#xff0c;当英文部分超过第一行剩余位置时&#xff0c;整个英文部分都会自动换行 问题截图&#xff1a; 期待截图&#xff1a; 问题说明 因为 TextMeshPro识别中文后会带换行符。 解决方案 修改…

MICCAI 2024 每日一篇论文 纯纯直读 CUTS:用于多粒度无监督医学图像分割的深度学习和拓扑框架

MICCAI 2024 CUTS: A Deep Learning and Topological Framework for Multigranular Unsupervised Medical Image Segmentation CUTS: 用于多粒度无监督医学图像分割的深度学习和拓扑框架 作者 陈璐1*、Matthew Amodio1*、梁博伦.沈2、冯高3、阿曼阿维斯塔4、Sanjay Aneja3,5…