使用 Web 组件创建自定义输入

Creating a custom input with Web Components

我想用 Web 组件创建自己的 HTML 元素集,它们都包含一些基本功能。 我想从输入开始,似乎有两种可能性: 从 HTMLElementHTMLInputElement.

继承

选项A:

class BasicCustomHTMLElement extends HTMLElement {
  //basic functionality
}

class CustomInput extends BasicCustomHTMLElement {
  let shadow = this.attachShadow({
    mode: 'open'
  });

  let textbox = document.createElement("input");
  shadow.appendChild(textbox);
}

选项 B

class CustomInput extends HTMLInputElement {

}

我对选项 B 的问题是,我没有主 class,我可以在其中定义基本功能。另一方面,我必须重写选项 A 中的代码以获得本机输入和 select 元素提供的功能。

我是否忽略了某些方面?

您没有理由不能将选项 A 和选项 B 结合起来,这样您就可以从 HTMLInputElement 开始使用基础 class 进行扩展,然后使用更具体的 class 进行扩展]稍后。

class BasicCustomHTMLElement extends HTMLInputElement {
}

class CustomInput extends BasicCustomHTMLElement {
}

如果您想要一组共享功能来扩展许多内置 classes,您可以使用 mixins

const BaseClassMixin = (superclass) => class extends superclass {
};

class CustomInput extends BaseClassMixin(HTMLInputElement) {
}

class CustomTextArea extends BaseClassMixin(HTMLTextAreaElement) {
}

但是,目前 only Chrome supports extending built-in elements 因此不建议在现实世界中使用。