可能使用到的库stencil(用于生成Web 组件的编译器)
1.shadow DOM
作用:防止内部的样式被外部样式影响
开启shadow Dom显示
基于Web components的库
- Google’s Polymer Library (https://polymer-library.polymer-project.org)
- Mozilla’s X-Tags (https://x-tag.github.io)
2.Web Components
的未来
作为浏览器自带的API,可以支持在组件内使用前端框架,编译成单独的组件以供使用。
这也就意味着可以在React项目中使用Vue,在无框架应用中使用框架,以及最重要的:使得微前端成为可能,打破了各大框架之间的铁幕
对于未定义的tag,会像一个
HTMLUnknownElement
,因为命名规范使得你如果不定义自己的元素并且不符合规范(-
分隔),则会继承HTMLUnknownElement
1 | <randomElement>111</randomElement> |
1 | document.createElement('randomElement').constructor; |
使用-
分隔,则会继承HTMLElement
1 | document.createElement('random-element').constructor; |
创建自定义元素
1 | class Ele extends HTMLElement {} |
如果重复定义同一元素控制栏会报错
1 | customElements.define('u-el', Ele) |
因为命名是唯一的,因此添加判断逻辑
1 | if (!customElements.get('u-el')) { |
如果想要继承HTMLButtonElement
或者其它已经定义过的元素,需要考虑浏览器的兼容性,只有HTMLElement
是几乎所有浏览器都兼容的(除了IE,nmd),但是可以使用polyfills
地址:https://unpkg.com/@webcomponents/custom-elements@1.2.4/custom-elements.min.js
or
使用npm安装
1 | npm install @webcomponents/custom-elements |
并且定义的新元素需要继承HTMLElement
,否则是不合法的
3.Custom Element
的生命周期
3.1 connectedCallback
在此周期函数内可以通过this
访问当前自定义元素,修改内部元素、自身样式以及添加事件
数据劫持(getters、setters)
3.2 observedAttributes
与attributeChangedCallback
observedAttributes
用于判断当前触发的attribute是不是需要监控
1 |
|
属性反射器
1 | static get observedAttributes() { |
以上的写法会触发无限的循环
因此,对此属性添加一个反射器(添加一个setter和getter)
1 | static get observedAttributes() { |
使用反射器后,当设置checked时,触发setter,设置当前元素的attribute(并不单独设置property),读取这个property也是返回key相同的attribute
对于一个开发者来说,保持attrbutes和properties
的一致和同步是十分重要的
attributes
的相关函数hasAttribute()getAttribute()setAttribute()
3.3 constructor
注意
1 | ```javascript |
当Element
被插入DOM
中时connectedCallback
才会被触发
初始化属性最好在constructor
中,这样比较直观
connectedCallback
在现实应用中不怎么使用的一个原因是Shadow DOM
1 |
|
3.5 adoptedCallback
当组件在```DOM``中移动后触发
最后更新: 2022年07月16日 13:46