UserName: Sookie
+E-mail: colorfulsweet@gmail.com
+ +``` +```javascript +class UserInfo extends HTMLElement { + constructor() { + super() + var templateElem = document.getElementById('userInfo') + var content = templateElem.content.cloneNode(true) + this.appendChild(content) + } +} +window.customElements.define('user-info', UserInfo); +``` + + + +### shadow DOM +独立封装的一段html代码块,其中包含的html标签、CSS样式、js行为都可以隔离、隐藏起来 +它就是为组件封装而生的特性,父子组件之间不会互相干扰 + +其实浏览器本身就有一些内置的shadow DOM +需要打开F12的设置当中的**Show user agent shadow DOM** +就可以看到诸如``的内部结构了 + + +可以把它看做浏览器封装的一个组件 +如果要把我们的组件也封装为这样的一个结构(虽然可以看到组件中的结构,但是内外隔离,外部无法对内部的DOM进行操作) +可以使用如下的方式 + +```javascript +class UserInfo extends HTMLElement { + constructor() { + super() + var shadow = this.attachShadow( { mode: 'closed' } ) + var templateElem = document.getElementById('userInfo') + var content = templateElem.content.cloneNode(true) + shadow.appendChild(content) + } +} +window.customElements.define('user-info', UserInfo) +``` + +此时在组件内部定义的样式就只应用在该组件内,不会对外部造成影响了 + +### 组件传参 +接收传参的方式就是获取DOM上的属性 +```javascript +var templateElem = document.getElementById('userInfo') +var content = templateElem.content.cloneNode(true) +content.querySelector('#name').innerText = this.getAttribute('name') +shadow.appendChild(content) +``` \ No newline at end of file