【发布时间】:2017-05-25 22:16:36
【问题描述】:
我目前正在使用自定义元素(Web 组件)实现数据表元素。表格可以包含用于呈现每一行的不同类型的单元格(文本、数字、日期等)。
例如
<my-table>
<my-table-cell-text column="name"></my-table-cell-text>
<my-table-cell-date column="dob" format="YYYY-MM-DD"></my-table-cell-date>
<my-table-cell-number column="salary" decimals="2"></my-table-cell-number >
</my-table>
我还有一个 MyTableCell 类,所有单元格元素都扩展了它。这可以很好地共享通用功能,但是样式可能会很痛苦,因为每种单元格类型都是其自己的 html 标记。目前,我在扩展 MyTableCell 时添加了一个 css 类,但为了论证,可以说我不想这样做。
理想的解决方案是能够使用is 关键字扩展自定义元素,例如<my-table-cell is="my-table-cell-text">、but that's only allowed for built in html elements。
我能想到 3 种方法来解决这个问题:
具有类似于
<input type="">的语法,但这需要更多的工作,因为您不再扩展基类,而是创建相同元素的变体,这意味着您需要一种自定义方法来注册不同的变体,比如静态的MyTableCell.registerType一种可组合的方法,我将渲染器元素
<my-table-renderer-text>包装在通用<my-table-cell>中。这避免了自定义注册方法,但它更难编写并导致更多元素和更多样板代码,这反过来意味着性能损失。两者兼而有之,用户写入
<my-table-cell type="text">,而单元格在内部使用document.createElement('my-table-rendener-'+ type)之类的东西。这保留了选项 1 的更简单语法,同时仍然避免了自定义注册方法,但它具有与选项 2 相同的性能影响。
您能提出更好的替代方案吗?我错过了什么吗?
【问题讨论】:
-
您想使用 v0 或 v1 规范设计自定义元素吗?
-
我对两者都很满意。目前使用 v0,直到更多浏览器添加对 v1 的原生支持。据我所知,这两个规范都有相同的限制,即不能使用
is来扩展自定义元素
标签: html css dom web-component custom-element