主题

  • ​1)什么是组件
  • 2)合并配置
  • 3)事件委托
  • ​4)通过继承扩展组件功能
  • 5)webComponent自定义组件

1、组件是什么?

组件: 组件是具有一定功能的属性和方法的封装,比如样式的封装,DOM操作的封装,然后通过export导出模块,通过import模块引用,完成代码复用。

ElementUI库:https://element.eleme.io/#/zh-CN/component/installation

2、弹窗功能

  • 属性:宽、高、标题、内容;

  • 方法:打开 、关闭、渲染、拖拽

  • 配置

    {
    	width: "30%",
    	height: "250px",
    	title: "测试标题",
    	content: "测试内容",
    	dragable: true, //是否可拖拽
    	maskable: true, //是否有遮罩
    	isCancel:false //是否有取消
    }
    

3、合并配置

  • 解构赋值添加默认参数

  • 通过Object.assagin来合并

    this.opts = Object.assign({
      width: "30%",
      height: "250px",
      title: "测试标题",
      content: "测试内容",
      dragable: true, //是否可拖拽
      maskable: true, //是否有遮罩
      isCancel:false, //是否有取消
      cancel(){},
      sucess(){}
    },options)
    

4、渲染视图

  • 创建dom解构;es6表达式做判断;
${
  this.opts.isCancel?'<span class="k-default">取消</span>':''
}
  • 初始化

  • 打开方法

  • 关闭方法

  • 拖拽方法

5、事件委托

  • 节点不存在绑定事件,委托给父级添加事件
    事件冒泡原理
<div class="k-dialog">
  <div class="k-header">
      <span class="k-title">提示</span><span class="k-close">X</span>
  </div>
  <div class="k-body">
      <span>这是一段文本</span>
      <input class="input-inner" type="text" />
  </div>
  <div class="k-footer">
      <span class="k-cancel">取消</span>
      <span class="k-primary">确定</span>
  </div>
</div>
addEvent() {
  let dailog = this._sd.querySelector(".k-dialog");
  // 事件委托
  dailog.onclick = e => {
    // console.log(e.target.className);
    switch (e.target.className) {
      case 'k-close':
        this.close();
        this.dispatchEvent(new CustomEvent("close"))
        break;
      case 'k-primary':
        this.close();
        let inputValue = this._sd.querySelector(".input-inner").value;
        this.dispatchEvent(new CustomEvent("submit", {
          detail: inputValue
        }))
        break;
      case 'k-cancel':
        this.close();
        this.dispatchEvent(new CustomEvent("close"))
        break;
      default:
        break;
    }
  }
}

6、继承扩展功能

  • 遮罩层、取消按钮;

  • 重写和功能相关的方法;

7、通过webComponent自定义组件

  • 自定义独立元素Autonomous custom elements

     class MyComponents extends HTMLElement{
         constructor(){
             super();
         }
     }
     customElements.define('my-components', MyComponents);
    
  • 继承HTML元素Customized built-in elements

    class  UlComponents  extends HTMLUListElement{
         constructor(){
             super();
         }
     }
    
    customElements.define("ul-components",UlComponents,{
         extends: "ul"
     })