初探Web Components
web components是一套无需react/vue,浏览器就可实现的自定义组件方法。
通过
customElements.define()
定义组件,有二个必填和一个选填参数:
- 名称,一个带中划线的字符串,如:my-control
- 自定义组件类
- 继承,包含extends属性的对象(选填)
自定义组件类的是通过继承HTMLElement接口实现,组件类的生命周期有:
- connectedCallback:组件首次被插入文档DOM时,被调用。
- disconnectedCallback:组件从文档DOM中删除时,被调用。
- adoptedCallback:组件被移动到新的文档时,被调用。
- attributeChangedCallback: 组件增加、删除、修改自身属性时,被调用。
实现一个按钮组件
1 | class MyButton extends HTMLElement { |
调用
1 | <my-button text="自定义组件按钮" color="blue"/> |
继承内置元素的组件
上面是用span创建模拟button实现的一个自定义按钮组件,而customElements.define()
的第三个参数设置继承自内置元素,实现对内置元素的扩展。
1 | class CustomButton extends HTMLButtonElement { |
调用
1 | <button is="custom-button">定制按钮</button> |
继承元素组件类的继承需要继承相应的内置接口,比如button的
HTMLButtonElement
,调用也不再是直接调用,而是直接调用内容元素传入is="custom-button"
。
Web Components还有一些其他定义,比如:Shadow DOM 、Templates、slot等,可用于实现更加复杂、灵活的组件。个人觉得Web Components不需要任何框架即可实现组件开发非常好,补足了web开发不能拆分的缺陷。虽然是各种框架的出现算是补足了这一块,但如果浏览器默认就支持自然是更好了,现阶段的Web Components还不及框架,但随着浏览器的发展,谁知道呢?