首页 > Web开发 > 详细

web component

时间:2019-06-30 11:34:02      阅读:114      评论:0      收藏:0      [点我收藏+]

浏览器发展至今,很多浏览器已经很好的支持web component了,如果实在需要兼容IE、Edge还可以用pollyfill来增强一下浏览器

最全的使用文档:https://developers.google.com/web/fundamentals/web-components/

下面我们来大概看看怎么使用

test.html:

<!DOCTYPE html>
<html lang="en">

<head>
    <style>
        /* 可以外部定义web component样式,但是内部的shadow dom,选择器无法命中 */
        app-drawer { font-size: 20px; }
        /* slot进去的可以命中 */
        app-drawer div { font-style: italic }
        /* shadow dom的没法命中 */
        app-drawer p { font-style: italic }
    </style>
</head>

<body>
    <!-- 原生支持的template,用于web component的shadow dom -->
    <template id="temp">
        <!-- 这里的style是跟外界独立开的,相当于vue的scoped -->
        <style>
            p { color: orange; }
        </style>
        <p>
            我是template啦~
        </p>
        <!-- 插槽 -->
        <slot></slot>
        <!-- 这里使用script和在template外使用是一样的,this都是window -->
        <script>
            console.log(来自shadow dom的问候)
            console.log(this)
        </script>
    </template>

    <app-drawer>
        <div>我从是插槽进来的div啦~</div>
    </app-drawer>

    <!-- 定义自定义web component -->
    <script src="./test.js"></script>
</body>

</html>

test.js:

class AppDrawer extends HTMLElement {

  // 定义组件需要同步更新到DOM的属性
  get open() {
    return this.hasAttribute(‘open‘);
  }
  set open(val) {
    if (val) {
      this.setAttribute(‘open‘, ‘‘);
    } else {
      this.removeAttribute(‘open‘);
    }
    this.toggleDrawer();
  }

  // 相当于vue component的beforeCreate
  constructor() {
    super();
    // 创建shadow dom,mode可以时open和close
    let shadowRoot = this.attachShadow({mode: ‘open‘});
    // 复制一份template
    const temp = document.querySelector(‘#temp‘).content.cloneNode(true)
    // 添加进shadow dom
    shadowRoot.appendChild(temp)
    // 添加事件
    this.addEventListener(‘click‘, e => {
      this.open = !this.open
    });
  }

  // 插入到 DOM 时,相当于vue component的created
  connectedCallback() {
    // web component容器的样式需要到这个钩子才能添加
    this.style.cursor = ‘pointer‘
    this.style.display = ‘block‘
    this.toggleDrawer()
  }

  /**
   * 生命钩子还有:
   * disconnectedCallback: 从DOM中移除时,相当于vue component的beforeDestroy
   * attributeChangedCallback:属性添加、移除、更新或替换时,有点像vue component的beforeUpdate(不完全等同)
   * adoptedCallback:被移入新的 document时
   */
  
  // 定义组件的方法
  toggleDrawer() {
    this.style.backgroundColor = this.open ? ‘red‘ : ‘pink‘
  }
}

// 定义自定义组件,名字一定要有"-", 不然浏览器不认为它是web component, 会认为是一个HTMLUnknownElement
customElements.define(‘app-drawer‘, AppDrawer);

 

web component

原文:https://www.cnblogs.com/amiezhang/p/11108823.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!