首页 > 编程语言 >JavaScript 中的 Web 组件介绍:创建一个 hello-world 的 Web 组件

JavaScript 中的 Web 组件介绍:创建一个 hello-world 的 Web 组件

时间:2022-09-25 10:34:49浏览次数:110  
标签:Web 元素 自定义 DOM JavaScript 组件

JavaScript 中的 Web 组件介绍:创建一个 hello-world 的 Web 组件

Web Components 是一套不同的技术,允许您创建可重用的自定义 html 元素。它的伟大之处在于对组件的逻辑和样式的封装。我们可以将元素的特征保密,这样就可以编写脚本和设置样式,而不必担心与文档的其他部分发生冲突。

Web Components 由三种主要技术组成:

  • 自定义元素 :一组 JavaScript API,允许您定义新的自定义 HTML 标签或改进现有标签。

    类 MyComponent 扩展 HTMLElement {
    构造函数(){
    极好的();
    this.innerHTML = <p>我的网络组件</p>;
    }
    }

    customElements.define('my-component', MyComponent);

  • 影子 DOM: 一组 JavaScript API,用于将封装的“影子”DOM 树附加到与主文档 DOM 分开呈现的元素。 Shadow DOM 确保我们为 Web 组件定义的样式或 JavaScript 不会泄漏并影响应用程序的其他部分。
    您可以使用 Element.attachShadow() 方法将阴影根附加到任何元素。

    const shadow = this.attachShadow({mode: 'open'});

  • HTML 模板: 模板允许您在页面中定义 Web 组件可以使用的 HTML。模板及其内容不会在 DOM 中呈现,但仍可以使用 JavaScript 引用。
    笔记 : 还有您可以使用它来管理元素的内容。

生命周期方法

浏览器在 Web 组件状态的整个生命周期中自动调用六个方法。

  1. 构造函数() : 组件初始化时调用。它必须调用 super() 并且可以设置任何默认值或执行其他预渲染过程。
  2. 连接回调() : 当自定义元素第一次连接到文档的 DOM 时调用。
  3. 断开回调() : 当自定义元素与文档的 DOM 断开连接时调用。
  4. 通过回调() :当 Web 组件从一个文档移动到另一个文档时调用此函数。
  5. 属性更改回调() :在添加、删除或更改自定义元素的属性之一时调用。
  6. 静态observedAttributes() :返回浏览器将观察到的属性数组。

创建一个网页组件:

自定义元素

我们需要定义一个类来控制元素。它可以命名任何东西,我们称之为HelloWorld。它必须扩展 HTMLElement 接口,该接口代表每个 HTML 元素的默认属性和方法。

 类 HelloWorld 扩展 HTMLElement {  
 构造函数(){  
 极好的();  
 this.textContent = 'Hello World!';  
 }  
 }

该类必须向 CustomElementRegistry 注册,才能将其定义为特定元素的处理程序。名称必须包含破折号,以免与 HTML 规范中正式支持的元素发生冲突。

 customElements.define('hello-world', HelloWorld);

添加属性

到目前为止,我们的组件只在屏幕上打印 hello world。为了使问候语动态化,我们可以添加 HTML 属性:

 <hello-world name="Ankit"></hello-world>

并且 textContent 将更改如下:

 类 HelloWorld 扩展 HTMLElement {  
 构造函数(){  
 极好的();  
 this.textContent = `你好 ${this.getAttribute("name")}!`;  
 }  
 }

影子王国

虽然我们在上面构建的 Web 组件可以正常工作,但它不能免受外部干扰,CSS 或 JavaScript 可以修改它。我们为组件定义的样式可能会泄漏并影响文档的其他部分。为了防止这种情况发生,我们需要创建一个 shadow dom。 Shadow DOM 通过将分离的 DOM 附加到 Web 组件来解决这个封装问题。 Shadow DOM 可以像任何其他 DOM 元素一样被操作

 this.shadow = this.attachShadow({ mode: "open" });
  • { mode: “open” } — 这意味着我们可以使用在主页面上下文中使用 Element.shadowRoot 属性编写的 JavaScript 访问 shadow DOM。
  • { mode: “closed” } — 这意味着 Shadow DOM 只能在 Web 组件内访问。如果您使用 { mode: “closed”} 将影子根附加到自定义元素,您将无法从外部访问影子 DOM,即 Element.shadowRoot 将返回 null。

HTML 模板:

在这里,我们可以为我们的 Web 组件定义 html 和 css。

 常量模板 = document.createElement("模板");  
 模板.innerHTML = `  
 <style>  
 .你好世界 h1 {  
 字体粗细:粗体;  
 字体系列:无衬线;  
 红色;  
 }  
 </style>  
 <div class="hello-world">  
 <h1>你好<span id="name"></span>!</h1>  
 </div>  
 `;

更新构造函数以将我们的模板附加到 shadow DOM 并将 name 的初始值设置为“World”:

 构造函数(){  
 极好的();  
 this.shadow = this.attachShadow({ mode: "open" });  
 this.shadowRoot.appendChild(template.content.cloneNode(true));  
 this.shadowRoot.querySelector("#name").innerText = "World";  
 }

现在我们还可以使用observedAttributes 和attributeChangedCallback 方法在我们的Web 组件添加到DOM 时更新名称。

 静态获取observedAttributes() {  
 返回[“名称”];  
 }  
 属性更改回调(属性,旧值,新值){  
 如果(旧值 === 新值)返回;  
 这个[属性] = newValue;  
 }  
 连接回调(){  
 this.shadowRoot.querySelector("#name").innerText = this.name;  
 }

完整的JS代码:

完整代码: Codepen 演示

更多 Web 组件示例:

  1. 柜台 : Codepen 演示
  2. 编辑词: Codepen 演示

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/39128/21262510

标签:Web,元素,自定义,DOM,JavaScript,组件
From: https://www.cnblogs.com/amboke/p/16727343.html

相关文章

  • forms组件参见错误参数
    Fieldrequired=True,是否允许为空widget=None,HTML插件label=None,用于生成Label标签或显示内容......
  • winform程序如何调用webapi接口?附源码
    我们开发winform程序时,通常使用传统的三层结构,包括:数据层、业务层、页面层。Form页面调用时,直接new个Service类,实现业务需求。但这种模式有个弊端,就是业务逻辑全部放到了客......
  • html中select option原生JavaScript按照value值 或 按照文本 选择指定选项
    每次搜索大家都在说JQ。。但是我只会用原生js  因为强迫症 不想因为一个小功能引入一个大的js文件以下是原生JavaScript按照value值或按照文本选择指定的optio......
  • 【前端必会】webpack的目标代码
    背景webpack生成什么样的代码呢?同的模块依赖的写法(import、exportexportdefault),会导致生成代码的不同,下面介绍普通的import与export开始导出PI1,max//index.jsletPI......
  • web全栈工程师的自我修养---阅读笔记
    先不说书本的内容,先来谈谈这位作者的经历从他的博客可以看出他是2010年毕业,加入腾讯,据他说当年他只投递了一份简历,1988年出生,今年(2022)是34岁,而我是2024年毕业,晚......
  • mac上webstorm打开不
    当你下载最新版的webstorm,然后替换完旧版本的时候,发现打不开,或者是破解后webstorm打不开的情况时,先卸载webstorm软件。然后在终端里执行以下代码,删除webstorm的残留文件r......
  • Javaweb学习笔记第十一弹(内含Servlet相关知识呦!)
    Web核心静态资源:HTML,CSS,JavaScript,图片等,负责页面展现动态资源:Servlet,JSP等,负责逻辑处理数据库:负责存储数据HTTP协议:定义通信规则Web服务器:负责解析HTTP协议,解析请求......
  • Nacos集群启动报错: nested exception is org.springframework.boot.web.server.WebS
    Nacos的 cluster.conf文件集群配置`127.0.0.1:8845``127.0.0.1:8846``127.0.0.1:8847`application.properties文件的配置##Copyright1999-2018AlibabaGroupH......
  • 组件-video
    1.使用服务器网路连接video的src可以是要播放视频的资源地址,支持网络路径、本地临时路径、云文件ID所以像访问图片那样不可以可以吧视频放服务器根目录下直接访问2.使......
  • JavaScript 计时事件
    做一个在设定的时间间隔之后来执行代码,称为计时事件两个关键字:setInterval()-间隔指定的毫秒数不停地执行指定的代码setTimeout()-在指定的毫秒数后执行指定代码。......