Web Components之Custom Elements

什么是Web Component?

Web Components 包含了多种不同的技术。你可以把Web Components当做是用一系列的Web技术创建的、可重用的用户界面组件的统称。Web Components使开发人员拥有扩展浏览器标签的能力,可以自由的进行定制组件。但截至本文时间,Web Components依然是W3C工作组的一个草案,并为被正式纳入标准,但这并不妨碍我们去学习它。

Web组件

何为Web组件?Web组件相对于Web开发者来说并不陌生,Web组件是一套封装好的HTML,CSS,以及JavaScript,它最大的特点就是可复用。基本在每一个网站上我们都可以看到各式各样的组件,例如下拉菜单、按钮、图片滚播、日历控件等。慢着,既然我们已经可以实现web组件的封装,那Web Component这家伙出现的意义是什么呢?Web Component回答道:“你们的实现方式不够优雅也不够完美,还是看看我的吧”。

因为当我们使用各种编程技巧对组件进行封装时,一个无法规避的事实是,组件的内部是可被访问和影响的,例如我们对样式表进行改动时经常会担心影响到页面组件的样式。而通过Web Component封装出来的组件,我们可以选择让组件的内部隐藏起来,也就是说,组件内部是与世隔绝的!

Web Component的组成

  • Custom Elements
  • HTML Templates
  • Shadow Dom
  • HTML Imports

总的来说,Web Components包含以上四种技术,本文着重谈谈Custom Element,这也是Web component中最核心的部分。

Custom Elements

自定义元素是一个可由创建者来自定义接口的对象。在创建时我们需要通过 document.registerElement() 来对自定义元素进行注册。该方法会返回一个元素的构造器,通过该构造器我们就可以创建我们的自定义元素的实例了。

var MyButton= document.registerElement(‘my-button‘);
document.body.appendChild(new MyButton());

实际上 document.registerElement(tag-name, prototype) 包含两个参数:

tag-name: 自定义元素的标签名,这个标签名必须包含连字符‘-‘,这样做的母的是用以区分自定义元素和HTML规范的元素

prototype: 这是一个可选的参数,用于描述该元素的原型,在该元素中你可以为自定义元素进行接口的定义

var MyElement = document.registerElement(‘my-element‘, {
  prototype: Object.create(HTMLElement.prototype, {
    createdCallback: {
      value: function() {
        this.innerHTML = "<p>I‘m a Custom Element</p>";
      }
    }
  })
});
document.body.appendChild(new MyElement())

在上面的例子中,我们通过Object.create()方法创建了一个继承自HTMLElement的对象作为自定义对象的原型,并设置了元素默认的 innerHTML ,如果你对Object.create()方法的第二个参数不熟悉,你最好先去查阅一下。实际上它的上面的例子跟下面给出的写法的效果是一样的:

var MyElementProto = Object.create(HTMLElement.prototype)

MyElementProto.createdCallback = function() {
    this.innerHTML = "<p>I‘m a Custom Element</p>"
}

var MyElement = document.registerElement(‘my-element‘, { prototype: MyElementProto })

document.body.appendChild(new MyElement())

接着,在页面上我们可以看到渲染出如下结构:

自定义元素的生命周期

在上面的例子中我们可以看到自定义元素的原型上有一个 createdCallback 属性,它的值是一个回调函数,在自定义元素被创建的时候被调用。实际上自定义元素在它的生命周期中可能会经历以下几种变化:

  • 自定义元素在其注册前被创建
  • 自定义元素被注册
  • 自定义元素的实例在自定义元素注册后被创建
  • 自定义元素被插入到文档中
  • 自定义元素从文档中移除
  • 自定义元素的属性被创建、移除、修改

在自定义元素经历上面某些变化时,不同的回调函数会被调用。这些回调函数被保存在一个名为生命周期回调的键值对集合中。我们可实现的回调函数总共有以下4种,其中 attributeChangedCallback 的回调函数中我们可以通过其参数访问到操作的属性名、老的属性值、新的属性值。

DOM:

<div id="modify">
  <label class="CEgreen"><input type="radio" name="CEclass" value="green">green box</label>
  <label class="CEred"><input type="radio" name="CEclass" value="red">red box</label>
</div>

JS:

var MyElement = document.registerElement(‘my-element‘, {
  prototype: Object.create(HTMLElement.prototype, {
    createdCallback: {
      value: function() {
        this.innerHTML = "<span>I‘m a Custom Element</span>"
      }
    },
    attributeChangedCallback: {
      value: function(property, oldValue, newValue) {
        this.innerHTML = "attribute ‘" + property + "‘ is modified to " + newValue
      }
    }
  })
})
document.body.appendChild(new MyElement())

var temp = document.querySelector("#modify")
var myElement = document.querySelector("my-element")

temp.addEventListener(‘click‘, function(e){
  console.log(e.target.value)
  myElement.className = e.target.value
})

另外,给自定义元素添加样式和普通元素是一样的,这是上面例子中为自定义元素添加的样式:

my-element {display: inline-block;margin-top: 20px;padding: 10px;font-size: 24px;}

这就是一个最基础的自定义元素的实现了。如果我们希望自定义元素内部不受外部样式的影响,我们需要使用Shadow Dom来对内部dom结构和样式进行封装。

时间: 2024-10-14 04:28:50

Web Components之Custom Elements的相关文章

The state of Web Components

Web Components have been on developers’ radars for quite some time now. They were first introduced by Alex Russell atFronteers Conference 2011. The concept shook the community up and became the topic of many future talks and discussions. In 2013 a We

web components折腾记

了解web组件化开发是最初是从了解reactjs开始,但是一直对框架有抵触情绪,另外喜欢不走寻常路,喜欢简单好用的东西,越简单越好,进而开始研究web components.web components这个技术因为太新,浏览器的支持还不完善,还没流行,也没啥中文资料参考,就是官方英文网站貌似都没看到有文档说明,折腾起来甚是费劲.最开始对web components技术还很懵懂,只知道它由几个子技术组成,包括Custom Elements和Shadow DOM还有HTML Imports等等,于是

Facebook React 和 Web Components(Polymer)对比优势和劣势

目录结构 译者前言 Native vs. Compiled 原生语言对决预编译语言 Internal vs. External DSLs 内部与外部 DSLs 的对决 Types of DSLs - explanation DSLs 的种类 - 解释 Data binding 数据绑定 Native vs. VM 原生对决 VM(虚拟机) 译者前言 这是一篇来自 StackOverflow 的问答,提问的人认为 React 相比 WebComponents 有一些"先天不足"之处,列举

【转】Facebook React 和 Web Components(Polymer)对比优势和劣势

原文转自:http://segmentfault.com/blog/nightire/1190000000753400 译者前言 这是一篇来自 StackOverflow 的问答,提问的人认为 React 相比 WebComponents有一些“先天不足”之处,列举如下: 原生浏览器支持 原生语法支持(意即不把样式和结构混杂在 JS 中) 使用 Shadow DOM 封装样式 数据的双向绑定 这些都是确然的.不过他还是希望听听大家的看法,于是就有了这篇精彩的回答. 需要说明的是,这篇回答并没有讨

一个使用 Web Components 的音乐播放器: MelodyPlayer

先上效果预览: Web Components 首先,什么是 Web Components ? MDN 给出的定义是: Web Components 是一套不同的技术,允许您创建可重用的定制元素(它们的功能封装在您的代码之外)并且在您的web应用中使用它们. ... ... 实现web component的基本方法通常如下所示: 使用 ECMAScript 2015 类语法创建一个类,来指定web组件的功能(参阅类获取更多信息). 使用 CustomElementRegistry.define()

前端应该知道的Web Components

前端组件化的痛点 在前端组件化横行的今天,确实极大的提升了开发效率.不过有一个问题不得不被重视,拟引入的这些html.css.js代码有可能对你的其他代码造成影响.虽然我们可以通过命名空间.闭包等一系列措施来加以防备,不过还是存在这些隐患.为了解决这些问题,有一个基本大家遗忘的技术还是可以了解一下的,那就是Web Components. Web Components 是什么 Web Components是一个浏览器的新功能,提供了一个面向web包括下面几个方面标准的组件模型. 你可以认为Web

自定义元素(custom elements)

记录下自定义html自定义元素的相关心得: 浏览器将自定义元素保留在 DOM 之中,但不会任何语义.除此之外,自定义元素与标准元素都一致 事实上,浏览器提供了一个HTMLUnknownElement,HTMLElement对象,所有自定义元素都是该对象的实例. var tabs=document.createElement("tabs"); console.log(tabs instanceof HTMLUnknownElement);//true console.log(tabs i

使用CLI 3 创建发布Web Components

本文翻译自:codementor 翻译不当之处,欢迎指正交流 Web Components是web平台的未来吗?关于这一问题支持和反对的观点有很多.事实上浏览器对Web Components的支持正在逐渐形成,并有越来越多的工具.资源和IT从业人员正在致力于创建发布自己的Web Components. Vue.js是一个创建Web Components的很好的工具,在更新的Vue CLI 3和@vue/web-component-wrapper中甚至更加简单.这篇文章中,我们会讨论为什么你需要创

Lightning Web Components 组合(五)

使用组合我们可以用来设计复杂的组件. 组合一些比较小的组件,可以增加组件的重新性以及可维护性. 通过以下一个简单的demo,将会展示关于owner 以及container 的概念,在实际的项目中 example-todo-item 一般是通过for:each 循环动态填充的 <!-- todoApp.html --> <template> <example-todo-wrapper> <example-todo-item item-name="Milk&