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) ```