首页 > 编程语言 >JavaScript学习笔记:Web Components

JavaScript学习笔记:Web Components

时间:2023-06-24 15:11:22浏览次数:51  
标签:Web 元素 name 自定义 DOM JavaScript host Components shadow

组件的概念

组件是对可重用的HTML与JS功能的封装。
在没有组件的时候,同样的HTML结构会在文档中多次出现,使代码变得复杂。
在使用组件封装后,就像使用一个HTML标签那样使用这些HTML结构,HTML文档变得清晰易维护。

它主要由三项技术实现:

  • Custom Element:
    自定义元素,JavaScript WEB API。就像浏览器已经定义的那些元素一样,自定义的元素也有属性、事件等特性。

  • Shadow DOM:影子DOM,JavaScript WEB API。
    影子DOM不在DOM树上,它以某个元素为宿主,附加在该元素上。
    要通过其宿主的shadowRoot属性来访问它。shadowRoot是就像一个独立的DOM树,可以添加与移除元素。

  • HTML templates:
    HTML的<template>标签中可以包含任何文本内容及HTML标签。
    浏览器会解析其内容,但是不会将解析的内容添加到DOM树,所以其内容不会渲染。
    HTMLTemplateElement对象的content属性是一个DocumentFragment对象,所有从<template>标签中解析的DOM都存放于此。

组件的生命周期

  • connectedCallback: 当自定义元素第一次被连接到文档DOM时被调用。

  • disconnectedCallback: 当自定义元素与文档DOM断开连接时被调用。

  • adoptedCallback: 当自定义元素被移动到新文档时被调用。

  • attributeChangedCallback: 当自定义元素的一个属性被增加、移除或更改时被调用。

组件的使用

组件是一个自定义的类,可以使用构造函数语法或类语法定义。

// 定义一个人员信息卡片组件
class InfoCard extends HTMLElement {
  constructor() {
      super();
      
      // 将一个影子DOM附加到自定义元素
      this.attachShadow({mode: 'open'});
      // 为影子DOM添加元素
      this.shadowRoot.append(InfoCard.template.content.cloneNode(true));

      this.nameEle = this.shadowRoot.querySelector('#name');
      this.genderEle = this.shadowRoot.querySelector('#gender');
      this.ageEle = this.shadowRoot.querySelector('#age');
  }
  // 初次添加到DOM树上回调
  connectedCallback () {
      this.style.display = 'inline-block';
      this.style.border = "1px solid #aeaeae";
      this.style.width = "200px";
      this.style.textAlign = "center";
  }

  // 被监听的属性,是一个静态的数组类型属性
  static get observedAttributes () {return ['name', 'age', 'gender']}

  // 被监听的属性发生变化时回调
  attributeChangedCallback (name, oldVal, newVal) {
      if (this.hasOwnProperty(name+'Ele')) {
          this[name+'Ele'].textContent = newVal;
      }
  }

  // 以对象属性代理元素属性
  get name () {return this.getAttribute('name');}
  get age () {return this.getAttribute('age');}
  get gender () {return this.getAttribute('gender');}

  set name (val) {return this.getAttribute('name', val);}
  set age (val) {return this.getAttribute('age', val);}
  set gender (val) {return this.getAttribute('gender', val);}
}

// 静态属性作为模板,可以重复使用
InfoCard.template = document.createElement('template');
InfoCard.template.innerHTML = `
  <p><span id='name'></span><span id="age"></span><span id=gender></span></p>
  <style>:host #name, :host #age, :host #gender {margin: 8px;}</style>
  `;

// 为自定义标签名定义元素类
// html中所有指定的标签会自动实例化为该元素对象
customElements.define('info-card', InfoCard);

插槽<solt>

插槽是定义时的占位,在使用时可以使用实际的标签替换。
slot标签有一个name属性,用于为影子宿主中的阳光DOM指定插槽。
若有一个插槽,则阳光DOM会像是该插槽的子元素一样显示;
若有插槽而没有阳光元素,则该插槽照常显示;
若有多个插槽,且插槽有name属性,就可以为阳光元素指定插槽了。

定义:

<info-card>
  <slot name="name"><span>Your Name</span></slot>
</info-card>

使用:

<info-card>
  <h2 slot="name">TOM</h2> /*h2是影子宿主中的阳光DOM*/
</info-card>

组件的css

在影子DOM外部的CSS不会影响影子DOM内部元素的样式,同样的影子DOM中的<style>标签定义的css样式也不会影响外面的元素。

内部的CSS可以使用以下伪类:

  • :defined:
    匹配任何已定义的元素,包括内置元素和使用 CustomElementRegistry.define() 定义的自定义元素。

  • :host:
    选择 shadow DOM 的 shadow host,内容是它内部使用的 CSS(containing the CSS it is used inside)。

  • :host():
    选择 shadow DOM 的 shadow host,内容是它内部使用的 CSS(这样您可以从 shadow DOM 内部选择自定义元素)— 但只匹配给定方法的选择器的 shadow host 元素。

  • :host-context():
    选择 shadow DOM 的 shadow host,内容是它内部使用的 CSS(这样您可以从 shadow DOM 内部选择自定义元素)— 但只匹配给定方法的选择器匹配元素的子 shadow host 元素。

标签:Web,元素,name,自定义,DOM,JavaScript,host,Components,shadow
From: https://www.cnblogs.com/chaihuibin/p/17501139.html

相关文章

  • WebStorm下载-WebStorm官方版下载「电脑版」软件大全
    软件介绍WebStorm是JetBrains旗下的JavaScript开发工具Web集成开发环境,被JS开发者誉为Web前端开发神器、最强大的HTML5编辑器、最智能的JavaScriptIDE调试器等。JetBrains全家桶,包括pycharm ,WebStorm,IntelliJIDEA, phpStorm,RiderClion,RubyMine,AppCode,Goland,......
  • JavaScript 之 高级程序设计 基础篇 (一)
    导读此篇文章为作者拜读JavaScrpit第四版(红宝石)的笔记内容、适用于有经验的程序员阅读;作者java开发出身。在之前前后端不分离的时代使用esayUIJQuery的时代经常写js相关代码。现在前后端分离的时代;前端工程日新月异、各种框架层出不穷;万变不离其中;学好js才是根本;很喜欢并......
  • JavaScript基础
    JavaScript基础简介JavaScript是由网景公司发明,起初命名为LiveScript,后来由于SUN公司的介入更名为了JavaScript为了确保不同的浏览器上运行的JavaScript标准一致,所以几个公司共同定制了JS的标准名命名为ECMAScriptJS的特点解释型语言类似于C和Java的语法结构动态语言......
  • WebStorm下载-WebStorm(Web前端开发工具)下载 软件大全
    WebStorm是JetBrains旗下一款JavaScript开发工具,支持多种语言和主流框架,内置数百种检查,覆盖所有支持的语言。软件还提供了错误警告,并提供许多快速修复选项,帮助用户对整个项目运行代码质量分析,被誉为“Web前端开发神器”,非常适合编程人员来使用的Web前端编辑器。[下载地址]:后台私信......
  • Tomcat-创建MavenWeb项目
       ......
  • spring web框架介绍
    springweb框架SpringWeb框架是一个开源的Java框架,它被广泛用于构建Web应用程序和RESTful服务。它基于经典的Spring框架,提供了一组功能强大且灵活的工具和类,用于简化Web应用程序的开发。以下是SpringWeb框架的主要特点和组件:MVC模式:SpringWeb框架采用了经......
  • 【web开发】PHP之字符串比较
    前言字符串的比较或者说字符串的判断是任何一门编程语言的字符串处理功能中的非常重要的特性之一。同时也是在实际开发中最常使用的字符串判断方式,在PHP中,除了可以使用比较运算符号(“==”或者<以及>)来进行比较操作,还提供了一个系列的比较函数,使得PHP可以进行更加复杂的字符串比较......
  • Springboot web 项目开发流程梳理总结
    项目开发流程梳理总结1.环境准备1.准备数据库表(user,order);2.创建springboot工程,引入对应的起步依赖(web,mybatis,mybatisx,mysql驱动,lombok);3.配置文件application.properties中引入mybatis的配置信息,准备对应的实体类;4.准备对应的mapper,service(接口,实现类),controlle......
  • WEB安全-渗透测试-waf绕过信息收集
    waf绕过WAF拦截会出现在安全测试的各个层面,掌握各个层面的分析和绕过技术最为关键本文主要讲述以下四种环境下的waf绕过Safedog-默认拦截机制分析绕过-未开CCSafedog-默认拦截机制分析绕过-开启CCAliyun_os-默认拦截机制分析绕过-简要界面BT(防火墙插件)-默认拦截机制分......
  • vue学习第25天 移动WEB开发----响应式布局
    目标:1)响应式原理2)使用媒体查询完成响应式导航3)使用Bootstrap的栅格系统4)使用Bootstrap的响应式工具5)完成阿里百秀首页案例 目录:1)响应式开发2)Bootstrap前端开发框架3)Bootstrap栅格系统4)阿里百秀首页案例  ......