Web Components之继承

我们在使用Web Components自定义组件的时候,我们需要继承HTMLElement这个浏览器内置对象,但是如果我要一些高级封装,给组件内置一些方法的话。我们就需要使用继承的方式,在父类中实现基本功能的封装。

1 父类的封装

以下是我的继承封装:

import Emitter from "./index.js";
import { loadHtmlFile } from "./index.js";
export default class PageElement extends HTMLElement {constructor() {super();this.emits = Emitter.emits;this.loadHtml = this.loadHtml;this.appendHTML = this.appendHTML;}loadHtml(path) {}appendHTML(html) {}bindEvent() {}beforeMounted() {  }mounted() {}beforeDestroy() {}destroyed() {}
}

父类中完成了一些基本方法的配置。我这个父类中利用HTMLElement自身的一些特性,实现对组件生命周期的重新封装。以及一些基础方法。以及绑定事件的处理。

1 loadHTML方法

这个方法是我具体是去实现加载html的方法,即我的组件是由三部分组层的html,css,js三部分完成。css上期我们已经讲过了使用link标签完成加载。

html我们使用fetch方法去加载,然后将fetch封装成为一个异步方法,这样我们就可以去加载html.

最后由这个js去完成组件功能的封装。

加载html我的封装方法如下:

export function loadHtmlFile(url) {return new Promise((resolve, reject) => {fetch(url).then((response) => {if (response.ok) {return response.text();}}).then((htmlContent) => {resolve(htmlContent);}).catch((error) => {reject(error);});});
}
constructor() {super();this.emits = Emitter.emits;this.loadHtml = this.loadHtml;this.appendHTML = this.appendHTML;}loadHtml(path) {return new Promise((resolve, inject) => {loadHtmlFile(path).then((html) => {resolve(html);this.beforeMounted();}).catch((error) => {console.warn("html加载失败", error.toString());})})}

这样我们就可以在加载完成html之后,去触发我们自己定义的beforeMounted方法。

2 appendHTML方法

appendChild方法,触发我们真实的加载完成方法。mounted。这里必须要讲一下,组件自身带的connectedCallback这个勾子函数是不符合我的使用场景的,因为虽然标签已经注册到页面上,并且也调用了对应的标签,但是这个时候我的html并没有加载完成。所以我自己的mounted生命周期才是真正的组件内部html代码全部加载完成。

下面我们看一个具体定义组件的例子:

export class pageError extends PageElement {constructor() {super();if (!this.shadowRoot) {this.attachShadow({ mode: "open" });}const style = document.createElement("link");style.setAttribute("rel", "stylesheet");style.setAttribute("href", "./src/page/error/index.css");this.shadowRoot.appendChild(style);this.loadHtml("./src/page/error/index.html").then((html) => {const template = document.createElement("div");template.innerHTML = html;this.setAttribute("class", "page-error");this.appendHTML(template);});}mounted() {console.log("loaded");}backHome() {this.app.router.push("/");}
}

这是我做的一个404页面组件。

继承了PageElement,并且使用了父类中的loadHTML方法和appendHTML方法。

这个地方之所以用父类的方法,是因为父类需要在这两个方法里面去做一些特殊处理。上面已经演示了具体做了什么。

2 页面组件的组成:

下面演示一下我的组件三部分组成:

通过以上方法的封装,我们讲一个组件拆分成为三部分。

3 路由:

那么我们怎么根据路由变化,来加载不同的页面了。我这里封装了路由,通过拦截路由我们来完成页面加载。具体的做法我们后面再讲。

这里需要用html4 history对象的history.pushState方法以及,popstate的监听事件。当然我们这里默认指的时history模式,而不是hash模式。而且这个popstate事件,并不是用来做跳转监听的,想要实现对路由的拦截,是需要重新写着一部分逻辑的。后面我们继续分享这一块的知识。

这里还有一个特殊处理,就是事件绑定处理。

4 事件绑定处理

我们实现了类似vue的事件绑定方式:

 <div class="desc"><div class="desc-text">非常抱歉,当前页面无法访问,可能原因:</div><div class="desc-content">1、您输入了错误的网页地址 <br />2、原网页已经删除或下线</div><div class="desc-btn" @click="backHome">返回网站首页</div></div>

注意看这里@click="backHome"

 <div class="menu" @click="() => this.skip(2)"><div class="icon"><custom-icon src="./src/assets/svg/api.svg" /></div><div class="text">新html5 API</div></div>

注意看这里@click="() => this.skip(2)"

这种时间绑定的处理方法,我们都是在页面加载环节,在appHTML方法里面完成的属性解析以及对当前属性的节点进行事件监听方法的绑定处理。

同样,我们再看404页面中我们绑定方法backHome方法,我们实践代码如下:

 backHome() {this.app.router.push("/");}

 this.app.router.push("/"),这里我们就完成了跳转页面,而这里则就是我们给页面组件中注入了路由对象,然后通过路由的方法完成跳转。

这里的路由对象的封装,我们后续继续分享。

当然,我的个人基于webComponents框架,已经即将封装完成。后续和大家见面和分享这里面的技术知识点。

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

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

相关文章

Java多线程(1)—线程基础

一、关于线程 1.1 简介 计算机线程&#xff08;Thread&#xff09;是操作系统能够进行运算调度的最小单位。线程的优势在于提高了程序的效率和响应能力&#xff0c;尤其在处理 I/O 操作或多任务时。多线程编程能够充分利用多核处理器的计算能力&#xff0c;达到更高的性能。 …

Spring 源码分析

Spring 源码版本 4.2.8.RELEASE Bean 生命周期 动态代理 代理模式 优点: 在不修改目标对象的功能前提下&#xff0c;能通过代理对象对目标功能扩展缺点: 代理对象需要与目标对象实现一样的接口&#xff0c;所以会有很多代理类&#xff0c;一旦接口增加方法&#xff0c;目标对…

Apifox 「定时任务」操作指南,解锁自动化测试的新利器

定时任务是按照预设时间自动执行的任务&#xff0c;它可以有效解决一些常见问题&#xff0c;比如频繁执行的回归测试和大规模的接口测试&#xff0c;这些任务需要在固定时间点或间隔周期内自动运行&#xff0c;以确保软件的持续集成和持续交付过程中的稳定性和可靠性。通过使用…

Windows下 批量重命名文件【bat实现】-两个小问题

Windows下 批量重命名文件【bat实现】_bat批量重命名文件ren-CSDN博客 上面是原来的教程&#xff0c;我遇到了两个小问题&#xff0c;问题及解决如下&#xff1a; ①dir/b>rename.csv : 无法将“dir/b>rename.csv”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。…

【每天学个新注解】Day 2 Lombok注解简解(一)—@Data、@Build、@Value

Data 相当于同时使用了 Getter 、Setter 、RequiredArgsConstructor、ToString、EqualsAndHashCode 1、如何使用 需要同时使用Getter 、Setter 、RequiredArgsConstructor、ToString、EqualsAndHashCode注解一个Bean的时候。 2、代码示例 例&#xff1a; Data public cla…

CCC SPAKE2+流程解析

1、SPAKE2流程及SCP03通道介绍 SPAKE2流程发生在CCC车主配对过程中的Phase2。 SPAKE2流程为车辆和手机之间的数据交换建立了一个安全通道SCP03。 那这个SCP03通道是干啥的&#xff1f; 我们可以先简单的理解为&#xff1a;建立安全通道前&#xff0c;车辆和手机之间交互的AP…

剖解反转链表

剖解反转链表 思路&#xff1a; 1.若链表为空或者只存在一个节点&#xff0c;就无需反转&#xff0c;直接返回head 2.若存在多个节点 首先将head.next给到cur&#xff0c;并将head.next置为null 剩余的节点就利用头插法&#xff0c;反转链表 class Solution {public ListNo…

基于SpringBoot+Vue+MySQL的特色旅游网站系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着旅游业的蓬勃发展&#xff0c;人们对旅游体验的需求日益多样化与个性化。传统的旅游信息查询与预订方式已难以满足现代游客的需求。因此&#xff0c;我们开发了这款基于SpringBootVueMySQL的特色旅游网站系统。该系统旨在通…

MySQL高阶1917-Leetcodify好友推荐

目录 题目 准备数据 分析数据 总结 题目 为 Leetcodify 用户推荐好友。我们将符合下列条件的用户 x 推荐给用户 y &#xff1a; 用户 x 和 y 不是好友&#xff0c;且用户 x 和 y 在同一天收听了相同的三首或更多不同歌曲。 注意&#xff0c;好友推荐是单向的&#xff0c…

web前端字段大小写下划线转换工具

文章目录 前言一、如何使用&#xff1f;二、相关代码总结 前言 程序员在敲代码的过程中都要命名一些字段&#xff0c;但是Java语言对字段的命名规范和sql命名规范不一样&#xff0c;如下图所示&#xff0c;这种机械性的转换工作很劳神费力&#xff0c;为了省点劲写了一个web小…

pdf怎么编辑修改内容?试试这四款工具!

作为一个经常探索各种办公软件的人&#xff0c;今天我打算和大家聊聊一个我们工作中经常会遇到的问题——编辑PDF文件。我们都知道&#xff0c;PDF文件以其格式稳定、不易被篡改而受到青睐&#xff0c;但这也意味着一旦需要修改内容&#xff0c;就变得相当棘手。不过&#xff0…

设计模式之类结构模式例题

答案&#xff1a;B A 知识点&#xff1a; 设计模式中类结构模式分别是&#xff1a;工厂方法模式&#xff0c;适配器模式&#xff0c;模板方法模式&#xff0c;解释器模式 记忆方法&#xff1a;公司里有个模特小姐姐&#xff0c;公是工厂模式&#xff0c;司是适配器模式&…

Mapper代理

文章目录 Mapper代理路径一定要写对Mapper代理方式加载配置文件 &#xff08;包扫描的方式&#xff09; Mapper代理 好像就是能 包名.方法。 反正就是防止硬编码&#xff0c;更灵活&#xff0c;更适用。 路径一定要写对 Mapper代理方式加载配置文件 &#xff08;包扫描的方式…

fiddler抓包08_抓Android手机请求

课程大纲 手机抓包&#xff0c;电脑端的设置和IOS端相同&#xff0c;设置一次即可&#xff0c;无需重复设置。 前提&#xff1a;电脑和手机连接同一个局域网 土小帽电脑和手机都连了自己的无线网“tuxiaomao”。 Step1. 电脑端设置 ① 打开Fiddler - 开启抓包&#xff08;F12…

Windows下如何定时执行自定义任务

目录 一.前言二.设置定时自动执行自定义任务 一.前言 本文环境是Windows11系统。 有时候我们希望能够在Windows下定时自动执行自定义任务&#xff0c;比如检测数据库服务的状态。那在Windows下怎么定时自动执行自定义任务&#xff0c;这篇文章介绍一种方法。 二.设置定时自动…

计算机毕业设计推荐-基于python的电子图书阅读推荐平台【源码+文档+讲解】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的电子图书阅读推…

吴津雨银洁刘雅雯获得国际超模大赛四川总决赛网络组三甲

9月8日众人期盼已久的都江堰杯2024国际超模大赛四川总决赛在三遗之城都江堰落下帷幕。国际超模大赛已经举办第12个年头&#xff0c;每年为时尚界、模特界输送无数的优秀时尚模特人才&#xff0c;让世界超模中出现更多的中国面孔。大赛在全球已经布局多个国家及地区&#xff0c;…

项目第七弹:消费者管理模块

项目第七弹&#xff1a;消费者管理模块 一、为何要有这个模块&#xff1f;二、消费者是否需要持久化&#xff1f;三、怎么设计&#xff1f;1.如何抽象描述&#xff1f;1.回想一下基于生产消费模型的线程池2.如何组织3.消息处理与确认问题的解决4.自动确认标志5.消费者代码 2.队…

【计算机组成原理】主存储器深度解析

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

DETR论文翻译与理解

DETR&#xff08;Detection with transformer&#xff09; DETR&#xff1a;End to End Object Detection with Transformer 论文链接&#xff1a;2005.12872 (arxiv.org) 参考视频&#xff1a;https://www.bilibili.com/video/BV1GB4y1X72R/?spm_id_from333.788&vd_…