vue3-router

一、路由

(1)通过 URL 区分路由的机制上,有两种实现方式:

  •  hash 模式:通过 URL 中 # 后面的内容做区分,我们称之为 hash-router;
  •  history 模式:在这种方式下,路由看起来和正常的 URL 完全一致

 (2)这两个不同的原理,在 vue-router 中对应两个函数,分别是 createWebHashHistory createWebHistory

二、实现原理 

 

 (1)hash模式

后来hash 值的变化并不会导致浏览器页面的刷新,只是会触发 hashchange 事件。在代码中,通过对 hashchange 事件的监听,可以在fn 函数内部进行动态地页面切换。

window.addEventListener('hashchange',fn)

(2) history模式

2014 年之后,因为 HTML5 标准发布,浏览器多了两个 API:pushState replaceState。通过这两个 API ,我们可以改变 URL 地址,并且浏览器不会向后端发送请求,同时还会触发 popstate 事件。通过这两个 API 和 popstate 事件,我们就能用另外一种方式实现前端路由

window.addEventListener('popstate', fn)

 三、手写迷你vue-router

(1) 用 Router 类去管理路由。

(2)使用createWebHashHistory 来返回 hash 模式相关的监听代码,以及返回当前 URL 和监听hashchange 事件的方法。

(3)通过 Router 类的 install 方法注册了 Router 的实例,并对外暴露 createRouter 方法去创建 Router 实例。

(4)最后,暴露了useRouter方法,去获取路由实例。

import { ref, inject } from "vue";
import RouterLink from "./RouterLink.vue";
import RouterView from "./RouterView.vue";
const ROUTER_KEY = "__router__";function createRouter(options) {return new Router(options);
}
function userRouter() {return inject(ROUTER_KEY);
}function createWebHashHistory() {function bindEvents(fn) {window.addEventListener("hashchange", fn);}return {bindEvents,url: window.location.hash.slice(1) || "/",};
}class Router {constructor(options) {this.history = options.history;this.routes = options.routes;this.current = ref(this.history.url);this.history.bindEvents(() => {this.current.value = window.location.hash.slice(1);});}install(app) {app.provide(ROUTER_KEY, this);app.component("router-link", RouterLink);app.component("router-view", RouterView);}
}export { createRouter, createWebHashHistory, userRouter };

 (5)使用

import { createRouter, createWebHashHistory } from "./grouter/index";
import About from "../pages/about.vue";
import Count from "../components/Count.vue";
const routes = [{path: "/",name: "Home",component: Count,},{path: "/about",name: "About",component: About,},
];
const router = createRouter({history: createWebHashHistory(),routes,
});

(6)内置组件 router-view

1、在 createRouter 创建的 Router 实例上,current 返回当前的路由地址,并且使用 ref 包裹成响应式的数据。

2、router-view 组件的功能,就是 current 发生变化的时候,去匹配 current 地址对应的组件,然后动态渲染到 router-view 就可以了

3、首先使用 useRouter 获取当前路由的实例;然后通过当前的路由,也就是router.current.value 的值,在用户路由配置 route 中计算出匹配的组件。

4、 最后通过计算属性返回 comp 变量,在 template 内部使用 component 组件动态渲染

<template><component :is="comp"></component>
</template>
<script setup>
import { computed } from "vue";
import { userRouter } from "../grouter/index";let router = userRouter();
const comp = computed(() => {const route = router.routes.find((route) => route.path === router.current.value);return route ? route.component : null;
});
</script>

(7) 内置组件 router-link

 template 渲染一个 a 标签,把 a 标签的 href 属性前面加了个一个 #, 就实现了 hash 的修改。

<template><a :href="'#' + $props.to"><slot></slot></a>
</template>
<script setup>
let props = defineProps({to: { type: String, required: true },
});
</script>

 (8)注册 router-link 和 router-view 这两个组件

import {ref,inject} from 'vue'
import RouterLink from './RouterLink.vue'
import RouterView from './RouterView.vue'
class Router{//....install(app){app.provide(ROUTER_KEY,this)app.component("router-link",RouterLink)app.component("router-view",RouterView)}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Revit SDK 介绍:PanelSchedule 配电盘明细表

前言 这个例子介绍 Revit 的配电盘明细表&#xff0c;PanelSchedule。Revit 的电器专业在国内用的并不是十分广泛&#xff0c;但从功能上来说还是比较完整的。 内容 这个例子里有三个命令&#xff1a; PanelScheduleExport - 导出配电盘明细表InstanceViewCreation - 创建配…

一百五十一、Kettle——Linux上安装的kettle8.2开启carte服务以及配置子服务器

一、目的 kettle8.2在Linux上安装好可以启动界面、并且可以连接MySQL、Hive、ClickHouse等数据库后&#xff0c;准备在Linux上启动kettle的carte服务 二、实施步骤 &#xff08;一&#xff09;carte服务文件路径 kettle的Linux运行的carte服务文件是carte.sh &#xff08;二…

MYSQL作业二

首先&#xff0c;查询数据库并是选择一个数据库打开 show table; use sys 第二部&#xff0c;创建一个表格 CREATE TABLE employee ( 部门号 int(11) not null, 职工号 int(11) not null, 工作时间 date not null, 工资 float(8,2) not null, 政治面貌 varchar(20) not…

微信小程序(原生)搜索功能实现

一、效果图 二、代码 wxml <van-searchvalue"{{ keyword }}"shape"round"background"#000"placeholder"请输入关键词"use-action-slotbind:change"onChange"bind:search"onSearch"bind:clear"onClear&q…

elasticsearch简单入门语法

基本操作 创建不同的分词器 ik_smart&#xff1a; 极简分词 &#xff1b; ik_max_word: 最细力再度分词 基本的rest命令 methodurl地址描述PUTlocalhost:9200/索引名称/类型名称/文档id创建文档&#xff08;指定文档id&#xff09;POSTlocalhost:9200/索引名称/类型名称创建文…

Spring对象装配

在spring中&#xff0c;Bean的执行流程为启动spring容器&#xff0c;实例化bean&#xff0c;将bean注册到spring容器中&#xff0c;将bean装配到需要的类中。 既然我们需要将bea装配到需要的类中&#xff0c;那么如何实现呢&#xff1f;这篇文章&#xff0c;将来阐述一下如何实…

打造专属花店展示小程序

在当今社会&#xff0c;微信小程序已经成为了各行各业拓展客户资源的利器&#xff0c;而花店行业也不例外。通过打造一个独特的花店小程序&#xff0c;你可以为你的花店带来更多的曝光和客户资源。那么&#xff0c;如何制作一个专属的花店小程序呢&#xff1f;下面我们就来一步…

网络编程(JavaEE初阶系列10)

目录 前言&#xff1a; 1.网络编程的基础 1.1为什么需要网络编程 1.2什么是网络编程 1.3网络编程中的基本概念 1.3.1发送端和接收端 1.3.2请求和响应 1.3.3客户端和服务端 2.Socket套接字 2.1概念 2.2分类 3.UDP数据报套接字编程 3.1DataGramSocket API 3.2Datagr…

Stable Diffusion 告别复制关键词,高质量提示词自动生成插件

在使用SD时,我们经常会遇到心中无想法,或不知如何描述心中所想的图像。有时由于提示词的选择不当,生成的图片质量也不尽如人意。为此,我今天为大家推荐一个高质量的提示词自动生成插件——One Button Prompt。 下面是他生成的一些样图。 文章目录 插件安装插件说明主菜单工…

【应用笔记】使用 CW32 实现电池备份(VBAT)功能

前言 电池备份&#xff08;VBAT&#xff09;功能的实现方法&#xff0c;一般是使用 MCU 自带的 VBAT 引脚&#xff0c;通过在该引脚连接钮扣电池&#xff0c;当系统电源因故掉电时&#xff0c;保持 MCU 内部备份寄存器内容和 RTC 时间信息不会丢失。 本文档介绍了如何基于 C…

vscode | linux | c++ intelliense 被弃用解决方案

每日一句&#xff0c;vscode用的爽是爽&#xff0c;主要是可配置太强了。如果也很会研究&#xff0c;可以直接去咸鱼接单了 废话少说&#xff0c;直接整。 用着用着说是c intelliense被弃用&#xff0c;很多辅助功能无法使用&#xff0c;像查看定义、查看引用、函数跳转、智能提…