首页 > 其他分享 >Custom Elements 和 Shadow DOM了解一下?

Custom Elements 和 Shadow DOM了解一下?

时间:2023-07-31 19:47:59浏览次数:37  
标签:... Elements DOM attributeChangedCallback Custom drawer open

Why

在最近参与的一个项目中,有使用 Vue 创建 Custom Elements的代码,与传统的单 Vue 实例 render 到 DOM 节点有很大不同。所以有了本文。

Custom Elements

首先我们来看看怎么创建一个自定义元素,假如我们要实现一个抽屉元素:

class AppDrawerElement extends HTMLElement {...}
window.customElements.define('app-drawer', AppDrawerElement);

这里我们定义了一个AppDrawerElement类,将它实例化就可以得到一个抽屉元素,正如我们创建一个 button 时,其实是一个HTMLButtonElement的实例一样,在第二行代码中,我们将抽屉元素对应的HTML标签命名为'app-drawer';接下来我们就可以创建一个抽屉元素,并插入到 Body 中了

const drawer = document.createElement('drawer');
document.body.appendChild(drawer);

但是这样的 element 毫无用处,也不能显示隐藏, 我们希望它能显示隐藏,那么需要完善AppDrawerElement的实现,主要包含constructor connectedCallback , disconnectedCallback ,attributeChangedCallback等方法,他们的职责分别是:

实现上述方法后代码如下:

class AppDrawer extends HTMLElement {
  constructor() {
    super(); // always call super() first in the constructor.
  }
  static get observedAttributes() { // 哪些属性的变化可以触发 attributeChangedCallback
    return ['open'];
  }
   get open() {
    return this.hasAttribute('open');
  }

  set open(val) {
    if (val) {
      this.setAttribute('open', '');
    } else {
      this.removeAttribute('open');
    }
    this.toggleDrawer();
  }
  toggleDrawer() {
    console.log(this.open);
      if (this.open) {
        this.children[0].style.cssText="display: block;"
      } else {
        this.children[0].style.cssText = 'display: none';
      }
  }

  connectedCallback() {
    // ...
    this.innerHTML = '<div style="display:none">drawer</div>';
  }

  disconnectedCallback() {
    // ...
  }

  attributeChangedCallback(attrName, oldVal, newVal) {
    console.log(attrName, oldVal, newVal);
    if (attrName === 'open') {
        this.toggleDrawer();
     }
    // ...
  }
}

这里要注意下observedAttributes这个静态属性,在这个属性中的 attribute 名才会触发 attributeChangedCallback,除此之外如 class,style 的变化不会触发回调函数。

<iframe allowfullscreen="true" allowtransparency="true" frameborder="no" height="300" loading="lazy" scrolling="no" src="https://codepen.io/imgss/embed/eYQbzPz?default-tab=html%2Cresult" style="width: 100%" title="Untitled"> See the Pen Untitled by imgss (@imgss) on CodePen. </iframe> 虽然现在可以显示隐藏了,但是如何在元素中自定义 css 并且不影响全局呢,此外像 Vue 中的 slot 又改如何实现,这里就要用到 Shadow DOM了

Shadow DOM

参考文档

标签:...,Elements,DOM,attributeChangedCallback,Custom,drawer,open
From: https://www.cnblogs.com/imgss/p/17594116.html

相关文章

  • web APIs获取dom元素
    1.获取页面中的标签最常用的两种方式 document.querySelectorAll和document.querySelector 2他们两个区别是什么document.querySelectorAll可以选择多个元素,得到伪数组,要遍历才能得到每一个元素document.querySelector只能得到一个元素,可以直接操作注意:它们里面的小括......
  • [dom-to-image.js]镜像
    dom-to-image|dom2image|dom-to-img|dom2imggithub原始仓库github原始仓库rowgitee镜像gitee镜像rowdom-to-image压缩版本dom-to-image.min.js-9.06KB点击查看代码/*!dom-to-image10-06-2017*/!function(a){"usestrict";functionb(a,b){functionc(a){retur......
  • React(四):虚拟DOM创建的两种方式
    1.使用js创建虚拟DOM(不推荐使用)<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>js创建虚拟DOM</title><scriptsrc="https://unpkg.com/react@18/umd/react.development.js"></script>......
  • SAP Fiori Elements 应用 metadata.xml 解析成的 JSON 对象
    在这个文件设置断点: AnnotationParser._parserData.metadataProperties=AnnotationParser.getAllPropertiesMetadata(AnnotationParser._parserData.serviceMetadata); if(AnnotationParser._parserData.metadataProperties.extensions){ mappingList.propertyExtensi......
  • 知其然知其所以然 - 使用向导生成的 Fiori Elements 应用的文件结构分析
    本教程前一篇文章,笔者向大家介绍了一步一步自己动手创建FioriElements应用的详细步骤:5.动手开发第一个SAPFioriElements应用我们得到了如下图所示的一个SAPUI5应用工程。然而有的朋友反馈说学到这里,心里很不踏实。觉得心里不踏实的原因,是因为这些朋友学习freestyl......
  • SAP Fiori Elements 应用中 table id 的生成逻辑
    id:jerryfiorielement01::sap.suite.ui.generic.template.ListReport.view.ListReport::SEPMRA_C_PD_Product--listReportSAPFioriElements是SAP提供的一种开发框架,允许开发者使用预定义的页面类型(如ListReport,ObjectPage等)和配置,而不是编写大量的前端代码来创建Fiori......
  • SAP Fiori Elements 应用里的 visitor 访问者设计模式
    SAPFioriElements应用SmartTabletitle控件的text属性,在运行时如何生成的?在TitleRenderer.js里设置断点:调用getText拿到textproperty值:问题是这个Text属性是从哪里来的?在SmartTable.js内部能够观察到这个Products字符串:最终的入口还是XMLTemplate......
  • SAP Fiori Elements 本地 annotation.xml 里的一个代码片段
    下面是从SAPUI5FioriElements应用本地注解文件摘录出来的xml片段,这些代码的含义是:<AnnotationsTarget="SEPMRA_PROD_MAN.SEPMRA_PROD_MAN_Entities/SEPMRA_C_PD_Product"xmlns="http://docs.oasis-open.org/odata/ns/edm"><AnnotationTerm=&......
  • SAP Fiori Elements SemanticKey 的语法
    annotation本地文件的xml片段如下:<AnnotationsTarget="SEPMRA_PROD_MAN.SEPMRA_C_PD_ProductType"xmlns="http://docs.oasis-open.org/odata/ns/edm"><AnnotationTerm="Common.SemanticKey">......
  • SAP Fiori Elements propertyAnnotations 举例讲解
    SAPFioriElements是SAP提供的一种用户界面开发框架,它允许开发人员创建符合Fiori设计原则的应用程序。这种框架主要基于SAPUI5,它是SAP的一种基于HTML5的用户界面技术。FioriElements提供了一种声明性的方式来定义用户界面,这意味着开发人员不需要编写大量的前端代码。......