为自定义元素创建自定义 HTML 属性是一种好习惯吗?

Is it good practice to create custom HTML attributes for custom elements?

在创建像 <input-field> 这样的自定义元素时,自定义属性是否仍应使用 'data-' 前缀,还是仅按原样使用它们是否可以接受?例如,基本上使用 variation="abc"data-variation="abc"
如果允许,是否允许重新使用 type 等现有属性?

此外,在创建过程中向元素的对象添加自定义属性是否是一种不好的做法,如下所示:

class InputFieldElement extends HTMLElement {
    constructor() {
        super();

        this.customProperty = {data: 123};
    }
}
customElements.define('input-field', InputFieldElement);

我知道这些方法现在工作得很好,但问题是它是否真的是预期的行为,或者它是否只是一个可能随时停止工作的奇怪的边缘情况。

3年多前我问过

您几乎可以自由选择任何您喜欢的属性名称,通用属性除外(例如 idclasstitle)。在某些情况下,甚至某些元素上存在的 re-using 属性名称(例如 valuedisabled 等)也完全有意义,因此组件使用者可以像使用您的元素一样使用它们HTML 个元素。

请记住,这种自由仅在使用 自主自定义元素时适用 (<foo-bar>),不适用于扩展 built-ins (<div is="foo-bar">)!

关于你的第二个问题,构造函数中的 define/add 属性也完全没问题,但最近对 ES 标准的添加增加了 public and private class fields:

class InputFieldElement extends HTMLElement {
    customProp = {data: 123}; // public class field
    #abc = "Hello"; // only accessible from within this class via this.#abc
}

除私有成员外,此 class 与您的 class 完全相同,有效地节省了您对 constructor 的需求。请注意,在为私有或 public class 字段赋值时,this 尚不可用,这意味着您无法以这种方式设置计算属性。

关于您要求 type 的具体问题,具有该属性通常表明 class 设计不当(这对于 HTMLInputElement 是正确的,例如,导致 text 输入和无意义的 checked 属性,以及具有 readOnly 属性 的复选框(也不会做任何事情)),但不能改变任何更多是由于网络兼容。