作者:Pascal Schilp
原文链接:Web Components: from zero to hero
Web Components: 入门到精通
一个编写原生 Web Components 的教程
- 什么是 Web Components?
- 组件生命周期
- 编写我们的 to-do 应用
- 设置 properties
- 设置 attributes
- 将 properties 映射到 attributes
- 事件
- 浏览器支持以及 polyfill
- 包装
Web Components 现在有了越来越大的推动力。随着 Edge 团队宣布部署 Custom Elements 和 Shadow DOM,所有的主流浏览器都已经原生支持 Web Components。像 Github,Netflix,Youtube 和 ING 等甚至已经在生产环境中使用了 Web Components!赞!不过,很让人惊讶的是,这些成功的大公司中没有一个做过(猜的没错) to-do 应用!
因此,今天我们要做一个 to-do 应用,因为世界上还没几个 to-do 应用。你可以在这里先预览一下我们要做的东西。
在开始之前,我要先写点免责声明,这篇博文只是为了让你对 Web Components 的基础概念有个大概的了解。Web Components 是非常底层的技术,并不建议在没有辅助库的情况下编写完整的应用,也不应该拿它跟其他成熟的框架进行比较。
什么是 Web Components?
先说重点:Web Components 是一系列编写具有模块化、可重用和封装性的 HTML 元素的规范。最棒的地方在于:由于它是基于 web 标准,我们无需安装任何框架或库。现在你就可以用纯 JavaScript 编写 Web Components!
不过呢,在我们下手之前,让我们先来看看编写 Web Components 的县官规范。
自定义元素
Custom Elements api 允许我们编写自定义的 DOM 元素。通过这个 api,我们可以定义一个自定义元素,并通知解析器如何正确的构建元素及如何应对此类元素的变动。你是否想过创建自己的元素,比如
Shadow DOM
Shadow DOM 给了我们封装组件样式和标记的能力。它是一个 DOM 元素的子 DOM 树,可以确保我们的组件样式不会泄漏到外部作用域,或是被外部作用域的样式所影响。是模块化的绝配。
ES 模块
ES 模块规范定义了标准化、模块化、高效率的引用和重用 JS 文件的方式。
HTML Templates
HTML 标签允许我们创建可重用的 DOM 块。在 template 内部,脚本不会执行,图片不会加载,样式和标签也不会渲染。在这个 template 被激活之前它甚至会被当作不存在在 document 中。HTML templates 非常棒,因为不管我们这个自定义元素有多少实例,它们用的都是同一个 template。
现在我们已经知道了 Web Components 利用了哪些 Web 规范,我们来看一下自定义元素的生命周期。别急,别急,我们马上就要开始写代码了!
组件的生命周期
我们来看一下自定义元素的生命周期。以下面的元素为例:
1 | class MyElement extends HTMLElement { |
constructor()
constructor
会在元素创建后而尚未被附加到文档上之前被调用。我们用 constructor
来设置初始状态、事件监听以及 shadow DOM。
connectCallback()
connectCallback
会在元素被添加到 DOM 中后被调用。此时非常适合执行初始化代码,比如获取数据或是设置默认属性。
disconnectedCallback()
disconnectedCallback()
会在元素从 DOM 中被移除后调用。大扫除时间!我们可以利用 disconnectedCallback
来移除事件监听器或取消定时循环事件。
attributeChangedCallback(name, oldValue, newBalue)
attributeChangedCallback
会在元素的受监的控属性变动时被调用。我们可以通过设置 observedAttributes
getter 来监控某个元素属性,像这样:
1 | static get observedAttributes() { |
在这个例子中,每当 my-attr
属性发生变化,attributeChangedCallback
就会执行。本文后面将会详细讲解。