web_components

介绍

谷歌公司由于掌握了 Chrome 浏览器,一直在推动浏览器的原生组件,即 Web Components API
相比第三方框架,原生组件简单直接,符合直觉,不用加载任何外部模块,代码量小。目前,它还在不断发展,但已经可用于生产环境。

下面是演示如果将一个卡片写出一个 Web Components 组件,后续通过在html代码里插入 <user-card></user-card>这一命令即可直接生成组件

注意

这种自定义的 HTML 标签,称为自定义元素(custom element)。根据规范,自定义元素的名称必须包含连词线,用与区别原生的 HTML 元素。所以,不能写成

1. customElements.define()

首先定义一个类,后续的<user-card>会基于这个类

1
2
3
4
5
class UserCard extends HtmlEliment {
constructor(){
super();
}
}

上面代码中,UserCard就是自定义元素的类。注意,这个类的父类是HTMLElement,因此继承了 HTML 元素的特性。

接着,使用浏览器原生的customElements.define()方法,告诉浏览器<user-card>元素与这个类关联。

1
window.customElements.define('user-card', UserCard);

2. 自定义元素内容

接下来给<user-card>这个元素里加点东西

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class UserCard extends HTMLElement {
constructor() {
super();

var image = document.createElement('img');
image.src = 'https://semantic-ui.com/images/avatar2/large/kristy.png';
image.classList.add('image');

var container = document.createElement('div');
container.classList.add('container');

var name = document.createElement('p');
name.classList.add('name');
name.innerText = 'User Name';

var email = document.createElement('p');
email.classList.add('email');
email.innerText = 'yourmail@some-email.com';

var button = document.createElement('button');
button.classList.add('button');
button.innerText = 'Follow';

container.append(name, email, button);
this.append(image, container);
}
}

上面代码最后一行,this.append()this表示自定义元素实例。

完成这一步以后,自定义元素内部的 DOM 结构就已经生成了。

3.