В настоящее время я реализую элемент таблицы данных, используя пользовательские элементы (веб-компоненты). В таблице могут быть разные типы ячеек (текст, число, дата и т. д.), которые используются для отображения каждой строки.
E.g
<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-тег. В настоящее время я добавляю класс css при расширении MyTableCell
, но ради аргумента, допустим, я не хочу этого делать.
Идеальным решением было бы иметь возможность расширить пользовательский элемент, используя ключевое слово is
, например <my-table-cell is="my-table-cell-text">
, но это разрешено только для встроенных html-элементов.
Я могу придумать 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.
Можете ли вы предложить лучшие альтернативы? Я что-то пропустил?
is
для расширения пользовательских элементов. - person Dogoku   schedule 11.01.2017