Web Components
什么是Web Components
行走在新时代的我们面对前端开发身边围绕着各声各色的“组件化”,使用最多的比如 Vue 中的模版语法、React 中的JSX,都致力于将结构、样式、逻辑封装成一个组件,采用组件复用来提高开发效率。但是这些框架的组件化并不是真正的组件化,虽然我们写代码时确实是写的组件化代码,但经过编译后就不再是组件化了,比如在使用ElementUI 的时候我们会使用 组件,在经过编译过后显示在页面上的就会变成 div 等标签,这种就像是CSS预处理器。Web Components 不同的是,它是原生支持的组件化,不依赖任何库或框架以及各种编译打包工具就可以在浏览器中运行,并且其可以与MVVM框架共存。我们在使用 ElementUI 时,会或多或少受到其样式的影响,Web Components 可以完美避开这个问题,它可以将每个组件渲染在独立的 DOM 树中,天然支持模块间样式和逻辑的隔离。不会干扰页面上的其他代码。
注意看,下面使我们实现的一个简单 Web 组件在浏览器中的使用效果(是直接显示为自定义标签的诶~):
特性
web component 由三项主要技术组成:
-
Custom element 一组 JavaScript API,可以定义 custom elements 及其行为,然后在用户界面中按照需要使用它们。
-
Shadow DOM 一组 JavaScript API,用于将封装的 Shadow DOM 树附加到元素(与主文档 DOM 分开呈现)并控制其关联的功能。通过这种方式,可以保持元素的功能私有,这样它们就可以被脚本化和样式化,而不用担心与文档的其他部分发生冲突。
-
HTML template
<template> 和 <slot> 元素使您可以编写不在呈现页面中显示的标记模板。然后它们可以作为自定义元素结构的基础被多次重用。
custom elements
-
注册 custom elements
// 定义一个名为 <a-b-c> 的组件
customElements.define('a-b-c', class extends HTMLElement {})
// 元素叫做 word-count,类对象是 WordCount, 继承自 <p> 元素
customElements.define('word-count', WordCount, { extends: 'p' });
/*参数说明*/
1. 表示所创建的元素名称的符合 DOMString 标准的字符串。注意,custom element 的名称不能是单个单词,且其中必须要有短横线。
2. 用于定义元素行为的 类 。
3. 可选参数,一个包含 extends 属性的配置对象,是可选参数。它指定了所创建的元素继承自哪个内置元素,可以继承任何内置元素。 -
获取组件的构造函数
// 获取 <a-b-c> 组件的构造函数
customElements.get('a-b-c') -
升级为自定义元素
// 创建一个 <a-b-c> 的元素,名为 el
const el = document.createElement('a-b-c')
// 升级 el 元素
customElements.upgrade(el)