前端JavaScript中常见设计模式

article/2025/10/22 16:11:19

1、为啥会有这一篇 ?

前两天有个同学问我,然后组内同学也即将分享相关实践内容,此处 在他之前发出(早一天发布的发布会),good!

2、是何物?

组件化是前端非常重要的一块内容,现在流行的 React 和 Vue 都是组件框架。

谷歌 Chrome 一直在推动浏览器的原生组件,即 Web Components API。相比第三方框架,原生组件简单直接,不用加载任何外部模块,代码量小。当前发展较为成熟,在很多项目中被使用

广受好评!

3、基本概念早知道

Web Components主要由三项技术组成,分别为

  • Custom elements(自定义元素)

  • Shadow DOM(影子DOM)

  • HTML templates(HTML模板)

  • 自定义元素实例

customElements.define(
'test-custom', // name 
class TestCustom extends HTMLParagraphElement { // 这个类定义功能constructor() {super();// 功能代码...}
}, { extends: 'p' }); // 继承自哪个元素 此处 p 
  • 影子 DOM

Shadow DOM 可将隐藏的 DOM挂到一个元素上:且 shadow root 节点为起始根节点,在这个根节点的下方,可以是任意元素,和普通的 DOM 元素一样

  • 如下图
  • 想将一个 Shadow DOM 附加到 custom element 怎么做?
class Button extends HTMLElement {constructor() {super();let shadow = this.attachShadow({mode: 'open'}); // 挂到 构造函数上}
} 
  • 操作一下 也是 ok 的
class Button extends HTMLElement {constructor() {super();let shadow = this.attachShadow({mode: 'open'});let p = document.createElement('p');shadow.appendChild(p);}
} 
  • 我想添加样式 怎么办 ?
let mySelfStyle = document.createElement('style');mySelfStyle.textContent = `.btn-container {position: relative;}.btn {// ...}
`shadow.appendChild(mySelfStyle); 
  • good !* HTML模版* 类似于 html 结构 和 vue slot```

```

4、磨拳擦掌,怎么使用 ?

1.创建一个类或函数来指定 web 组件的功能,如果使用类,请使用 ECMAScript 2015 的类语法 (参阅类获取更多信息)。
2.使用 CustomElementRegistry.define() 方法注册您的新自定义元素,并向其传递要定义的元素名称、指定元素功能的类、以及可选的其所继承自的元素。
3.如果需要的话,使用Element.attachShadow() 方法将一个 shadow DOM 附加到自定义元素上。使用通常的 DOM 方法向 shadow DOM 中添加子元素、事件监听器等等。
4.如果需要的话,使用 <template><slot> 定义一个 HTML 模板。再次使用常规 DOM 方法克隆模板并将其附加到您的 shadow DOM 中。
5.在页面任何位置使用自定义元素,就像使用HTML DIV一样(为例)

5、实现一个 Button

  • 上面那段话 请忘掉!!! , 我们 写给 Button 试试

1、创建一个类来指定 web 组件的功能

customElements.define('mark-button', Button); 

2、使用Element.attachShadow() 方法将一个 shadow DOM 附加到自定义元素上

 const shadowRoot = this.attachShadow({ mode: 'open' });const btn = document.createlement('button');btn.appendChild(templateContent.cloneNode(true));btn.setAttribute('class', 'mark-button'); 

3、使用 <template><slot> 定义一个 HTML 模板

<template id="btn_tpl"><slot name="btn-content">button contentxxx</slot>
</template> 

4、使用

<mark-button type="primary"><span slot="btn-content" id="btn_show">button test1</span></mark-button>
<mark-button type="warning"><span slot="btn-content">button test2</span></mark-button>
<mark-button type="default"><span slot="btn-content">button test3</span></mark-button> 

5、添加点击事件

document.querySelector('#btn_show').addEventListener('click', () => {modal.setAttribute('visible', 'true');
}, false) 

6、效果

  • 完整代码
// index.html<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Web Component</title></head><body style="padding: 60px"><h1>Web Component 马克付</h1><h2>1. Button</h2><mark-button type="primary"><span slot="btn-content" id="btn_primary">button test1</span></mark-button><mark-button type="warning"><span slot="btn-content" id="btn_danger">button test2</span></mark-button><mark-button type="default"><span slot="btn-content">button test3</span></mark-button><!-- template定义区 --><template id="btn_tpl"><slot name="btn-content">button content xxx</slot></template><script src="components/button.js"></script><script> document.querySelector('#btn_primary').addEventListener('click',() => {alert('我是 btn_primary ,我被点击了')},false)document.querySelector('#btn_danger').addEventListener('click',() => {alert('我是 btn_danger 我很危险')},false) </script></body>
</html> 
// Button.js
class Button extends HTMLElement {constructor() {super();// 获取模板内容let template = document.getElementById('btn_tpl');let templateContent = template.content;const shadowRoot = this.attachShadow({ mode: 'open' });const btn = document.createElement('button');btn.appendChild(templateContent.cloneNode(true));btn.setAttribute('class', 'mark-button');// 定义类型primary | warning | defaultconst type = {'primary': '#06c','warning': 'red','default': '#f0f0f0'}const btnType = this.getAttribute('type') || 'default';const btnColor = btnType === 'default' ? 'pink' : '#fff';// 创建样式const style = document.createElement('style');// 为shadow Dom添加样式style.textContent = `.mark-button {position: relative;display: inline-block;padding:8px 20px;border-radius: 50px;margin-right: 3px;background-color: ${type[btnType]};color: ${btnColor};box-shadow: inset 0 5px 10px rgba(0,0,0, .3);cursor: pointer;}`shadowRoot.appendChild(style);shadowRoot.appendChild(btn);}
}
customElements.define('mark-button', Button); 

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享


http://chatgpt.dhexx.cn/article/viMl1ceC.shtml

相关文章

你必须要会的4种Web前端设计模式

在软件工程领域&#xff0c;设计模式是为了解决特定问题而产生的一些可复用的方法、模板。每一种设计模式都针对性解决某一类场景的问题。设计模式被认为是开发者解决通用问题的最佳实践。 通常我们学习的设计模式&#xff0c;大多数与面向对象的语言相关&#xff0c;比如Java。…

前端开发中常用的几种设计模式

设计模式概览 设计模式是对软件设计开发过程中反复出现的某类问题的通用解决方案。设计模式更多的是指导思想和方法论&#xff0c;而不是现成的代码&#xff0c;当然每种设计模式都有每种语言中的具体实现方式。学习设计模式更多的是理解各种模式的内在思想和解决的问题&#…

图像金字塔原理

一、图像缩小 先高斯模糊&#xff0c;再降采样&#xff0c;需要一次次重复&#xff0c;不能一次到底 二、图像扩大 先扩大&#xff0c;再卷积或者使用拉普拉斯金字塔 三、金字塔类型 1、高斯金字塔 用于下采样。 高斯金字塔是最基本的图像塔。 原理&#xff1a;首先将原图…

【编程】金字塔图案

1&#xff0e;问题描述 打印出金字塔图案&#xff0c;如图1.1所示。 图1-1 2&#xff0e;问题分析 这个问题是一个很经典的循环应用的题目。我们都知道&#xff0c;打印输出的时候&#xff0c;都是从最左端输出&#xff0c;而这里&#xff0c;第一个星号是在中间。这实际是…

计算机视觉-OpenCV图像金字塔

&#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; 本次博客内容将继续讲解关于OpenCV的相关知识 &#x1f389;作者简介&#xff1a;⭐️⭐️⭐️目前计算机研究生在读。主要研究方向是人工智能和群智能算法方向。目前熟悉pytho…

图像金字塔(image pyramid) 分为两种:高斯金字塔  和  拉普拉斯金字塔。

高斯金字塔 高斯金字塔模仿的是图像的不同的尺度&#xff0c;尺度应该怎样理解&#xff1f;对于一副图像&#xff0c;你近距离观察图像&#xff0c;与你在一米之外观察&#xff0c;看到的图像效果是不同的&#xff0c;前者比较清晰&#xff0c;后者比较模糊&#xff0c;前者比…

数字图像处理:图像金字塔

转载请标明出处&#xff1a;数字图像处理&#xff1a;图像金字塔_数字图像处理opencv_新浪博客 &#xff08;一&#xff09;概念 以多个分辨率来表示图像的一种有效且概念简单的结构是图像金字塔。图像金字塔最初用于机器视觉和图像压缩&#xff0c;一个图像金字塔是一系列以金…

图像处理-图像金字塔

图像金字塔&#xff08;image pyramid&#xff09;&#xff0c;一般有两种&#xff1a;高斯金字塔、拉普拉斯金字塔 ——————————————————————————————— 先介绍下里面的一些操作&#xff1a; 下采样&#xff1a;相当于对图像进行一个像素的抽取&a…

10.图像金字塔

图像金字塔&#xff1a;主要是指一种算法思想 一般情况下&#xff0c;我们要处理是一副具有固定分辨率的图像。但是有些情况下&#xff0c;我们雪要对同一图像的不同分辨率的子图像进行处理。比如&#xff0c;我们要在一幅图像中查找某个目标&#xff0c;比如险&#xff0c;我们…

图像金字塔:概念及实现

文章目录 图像金字塔&#xff1a;概念和实现1. 图像金字塔的概念2. 图像金字塔的实现方式3. 基于OpenCV的图像金字塔实现参考资料 图像金字塔&#xff1a;概念和实现 首先补充一下分辨率的概念&#xff1a;图像分辨率指图像中存储的信息量&#xff0c;是每英寸图像内有多少个像…

图像金字塔的简单理解

图像金字塔模型&#xff1a; Level层定义的是图片的分辨率&#xff0c;图像金字塔的塔底到塔顶表示的是图片的缩小过程。也就是说从第Level0层开始是原图&#xff0c;越往上越压缩&#xff0c;丢失的信息越多。 图像金字塔的测试&#xff1a; 图片&#xff1a; halcon代码&am…

数字图像处理5:图像金字塔

图像金字塔 近似金字塔和残差金字塔 图像金字塔是图像中多尺度表达的一种&#xff0c;最主要用于图像的分割&#xff0c;是一种以多分辨率来解 释图像的有效但概念简单的结构。图像金字塔最初用于机器视觉和图像压缩&#xff0c;一幅图像的金字塔是一系列以金字塔形状排列的分…

图像金字塔、特征金字塔(FPN)

图像金字塔 参考&#xff1a; https://www.jianshu.com/p/436e96200f80 图像金字塔是图像多尺度表达的一种&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低&#xff0c;且来源于同一张原始图的图像…

图像金字塔,原理、实现及应用

什么是图像金字塔 图像金字塔是对图像的一种多尺度表达&#xff0c;将各个尺度的图像按照分辨率从小到大&#xff0c;依次从上到下排列&#xff0c;就会形成类似金字塔的结构&#xff0c;因此称为图像金字塔。 常见的图像金字塔有两类&#xff0c;一种是高斯金字塔&#xff0…

计算机视觉教程2-5:图像金字塔送她一朵玫瑰(附代码)

目录 1 金字塔2 什么是图像金字塔&#xff1f;3 图像金字塔有什么用&#xff1f;4 OpenCV实战图像金字塔 1 金字塔 平时你听到、见到的金字塔是什么样的&#xff1f; 这样&#xff1f; 还是这样&#xff1f; 实际上除了这些&#xff0c;还有图像金字塔 图像金字塔有什么用&am…

图像金字塔(Python实现)

图像金字塔&#xff08;Python实现&#xff09; 1 简介 在图像处理中常常会调整图像大小,最长的就是放大(zoom in)和缩小(zoom out),尽管集合变换也可以实现图像放大或者缩小 一个图像金字塔式一系列的图像组成,最底下一张式图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下…

图像金字塔分层算法

一. 图像金字塔概述 欢迎关注微信公众号“智能算法”&#xff01; 1. 图像金字塔是图像中多尺度表达的一种&#xff0c;最主要用于图像的分割&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。 2. 图像金字塔最初用于机器视觉和图像压缩&#xff0c;一幅图像的金…

图像金字塔是什么?

一般情况下&#xff0c;我们要处理是一副具有固定分辨率的图像。但是有些情况下&#xff0c;我们需要对同一图像的不同分辨率的子图像进行处理。比如&#xff0c;我们要在一幅图像中查找某个目标&#xff0c;比如脸&#xff0c;我们不知道目标在图像中的尺寸大小。这种情况下&a…

图像处理之高斯金字塔

一&#xff1a;图像金字塔基本操作 对一张图像不断的模糊之后向下采样&#xff0c;得到不同分辨率的图像&#xff0c;同时每次得到的 新的图像宽与高是原来图像的1/2, 最常见就是基于高斯的模糊之后采样&#xff0c;得到的 一系列图像称为高斯金字塔。 高斯金字塔不同(DoG)又…

【OpenCV学习笔记】之图像金字塔(Image Pyramid)

一、尺度调整 顾名思义&#xff0c;即对源图像的尺寸进行放大或者缩小变换。在opencv里面可以用resize函数&#xff0c;将源图像精准地转化为指定尺寸的目标图像。要缩小图像&#xff0c;一般推荐使用CV_INETR_AREA(区域插值)来插值&#xff1b;若要放大图像&#xff0c;推荐使…