obsidian-computer
前端识记

Web components

class UserCard extends HTMLElement { connectedCallback() { this.innerHTML Hi,{this.getAttribute('nam…

最后更新 2026年8月23日

快速使用

<user-card name="zongxi"></user-card>

    <script>
        class UserCard extends HTMLElement {
            connectedCallback() {
                this.innerHTML = `<div> Hi,${this.getAttribute('name')}  </div>`
            }
        }
        customElements.define('user-card',UserCard)
    </script>
  1. 在HTML中创建自定义组件,注意需要带-
  2. 创建一个类,并继承HTML element
  3. 补充connected callback函数,挂载后执行的内容,this指向该dom节点
  4. customElements.define(html组件,类)

常用api

class MyElement extends HTMLElement {
  constructor() {
    super()
    // JS 对象刚创建
  }

  connectedCallback() {
    // 插入 DOM
    console.log('mounted')
  }

  disconnectedCallback() {
    // 从 DOM 移除
    console.log('unmounted')
  }
}

它还有属性监听功能

class UserCard extends HTMLElement {
	static observedAttributes = ['name'];
	connectedCallback() {
		this.innerHTML = `<div> Hi,${this.getAttribute('name')}  </div>`
	}
	attributeChangedCallback(name, oldValue, newValue) {
		if (name === 'name') {
			this.innerHTML = `<div> Hi,${newValue}  </div>`
		}
	}
}
customElements.define('user-card',UserCard)
setTimeout(() => {
	document.querySelector('user-card').setAttribute('name', 'zongxi2')
}, 2000);

可以写到html中看看效果

当然我们并不建议用innerHTML,建议使用shadow root来创建组件内容,因为它不会污染其他样式,而且外部样式也污染不到内部。

class UserCard extends HTMLElement {
	static observedAttributes = ['name'];
	constructor() {
		super();
		this.attachShadow({ mode: 'open' }); // 让外部js可以访问shadowRoot中的元素
	}
	connectedCallback() {
		this.shadowRoot.innerHTML = `<div> Hi,${this.getAttribute('name')}  </div>`
		// this.innerHTML = `<div> Hi,${this.getAttribute('name')}  </div>`
	}
	attributeChangedCallback(name, oldValue, newValue) {
		if (name === 'name') {
			this.shadowRoot.innerHTML = `<div> Hi,${newValue}  </div>`
		}
	}
}

前端渲染内容:

<user-card name="zongxi2"><template shadowrootmode="open"><div> Hi,zongxi2  </div></template></user-card>

插槽

 <user-card >
        <span style="color: red;">123</span>
    </user-card>

    <script>
        class UserCard extends HTMLElement {
            static observedAttributes = ['name'];
            constructor() {
                super();
                this.attachShadow({ mode: 'open' }); // 让外部js可以访问shadowRoot中的元素
            }
            connectedCallback() {
                this.shadowRoot.innerHTML = `<div> Hi<slot></slot>  </div>`
                // this.innerHTML = `<div> Hi,${this.getAttribute('name')}  </div>`
            }
            attributeChangedCallback(name, oldValue, newValue) {
                // if (name === 'name') {
                //     this.shadowRoot.innerHTML = `<div> Hi,${newValue}  </div>`
                // }
            }
        }

和Vue React一样,可以在组件里面任意中内容加上slot="xxx",然后在shadowRoot中的html写上<slot

开发一些小tips

建议在比较简单的场景下使用。复杂场景下尽量还是用框架来写,它的最大优势主要还是跨框架

因为这一个Web Components的新特性,衍生出了新框架Lit

反向链接(0)

还没有笔记链接到这里。在 Obsidian 里用 [[笔记名]] 引用它,这里就会出现,关系图谱上也会多出一条连线。

评论

关系图谱

工程化与性能优化网络React快速总结This指向TypeScript 快速上手Web components00-总览与阅读路线01-reactivity-effect与依赖收集02-reactivity-reactive-ref-computed03-runtime-挂载流程04-runtime-组件系统05-runtime-更新与diff06-compiler-三段式07-方法论-如何啃大型开源项目README前端小记01-js-core02-browser03-network04-css-html05-react06-vue07-engineering08-scenarios09-handwritten-js10-algorithms11-ai-frontend手写Promise踩坑记录前端识记AI总结mini-vue-reading前端面试

On this page