Использование шаблона с пользовательскими элементами HTML

1

Я только начал изучать пользовательские элементы HTML, и, прочитав серию интро, учебники и документацию, я думаю, что у меня есть хорошая инструкция о том, как это работает, но у меня есть философский вопрос о том, как правильно использовать или не использовать <template>.

Пользовательские элементы дают возможность инкапсулировать новые функции, упрощая структуру вашего HTML-документа и позволяя просто вставить <my-custom-element>...</my-custom-element> вместо <div class="my-custom-element"><span class="part1">...</span><span class="part2">...</span></div>.

Затем определение класса для элемента устанавливает структуру и функциональность этого элемента. Затем в кучу учебников описывается, как использовать <template>...</template> и <slot>...</slot> чтобы настроить содержимое настраиваемого элемента. Затем вам следует включить код шаблона в каждый HTML-документ, в котором вы хотите использовать элемент, а не его настройку в конструкторе класса пользовательского элемента. Разве это не противоречит тому факту, что пользовательские элементы упрощают и инкапсулируют функциональность таким образом, чтобы сделать их более переносимыми? Или я не понимаю правильное использование и/или размещение шаблона в документе?

Глядя через SO, ближайший я могу найти для решения этого вопроса:

Как отменить шаблон в автономных пользовательских элементах с ванильным js?

Но ответ, по сути, обходит все это вместе и говорит: "Не используйте <template> ", и поэтому на самом деле не проясняет мое замешательство.

Теги:
web-component
custom-element
html5-template

1 ответ

2
Лучший ответ

Фактически элементы <template> могут быть импортированы из другого документа с помощью импорта HTML вместе с кодом Javascript, который определит пользовательский элемент:

<link rel="import" src="my-custom-element.html">
...
<custom-element></custom-element>

Поэтому его не нужно включать в каждый HTML-документ. Этот пост показывает минимальный пример.

Импорт HTML реализован только в Chrome и Opera. Если вы хотите использовать их вместе с Firefox и Safari, вам нужно использовать полифилл HTML Imports.

С другой стороны, на данный момент Mozilla и Apple не намерены реализовывать HTML-импорт непосредственно в своих браузерах. Поэтому они рекомендуют определять пользовательские элементы с чистыми модулями Javascript (с помощью import или <script src="...">) и вместо этого продвигать строки литералов шаблона, которые предлагают некоторые преимущества (переменные, функции), но иногда более сложны для код в IDE (из-за их строкового представления).

Возможно, в будущем стандартные HTML-модули будут приняты всеми браузерами, и <template> вернется в центр внимания...

Обратите внимание, что без HTML-импорта вы можете импортировать некоторые HTML-документы с помощью fetch():

fetch( "template.html" )
    .then( stream => stream.text() )
    .then( text => 
        customElements.define( "c-e", class extends HTMLElement {
            constructor() {
                super()
                this.attachShadow( { mode: 'open'} )
                    .innerHTML = text
            }
        } )
    )

Обновление 2019

HTML-импорт не будет изначально поддерживаться после Chrome 73. Затем вы должны использовать другие решения, перечисленные выше (polyfill, загрузчик альтернативных модулей, import JS или прямая загрузка с fetch).

  • 0
    Спасибо, я не знал об импорте HTML, звучит как правильное решение. Но, учитывая отсутствие поддержки, правильно ли я понимаю, что вместо этого вы поддерживаете литеральные шаблоны? Если это так, у меня все еще остается вопрос, почему бы просто не создать элемент программно в классе JS пользовательского элемента? Мне кажется, что включение большого блока HTML в качестве строки в JS излишне усложняет вещи.
  • 7
    HTML-импорт был правильным решением ... до сентября, когда Google объявил об отказе от этой функции ( stackoverflow.com/q/52791470/4600982 ). На самом деле я защищал импорт HTML (с полифилом), но сейчас ... :-( Как разработчик и дизайнер, я считаю, что использование HTML-документов для шаблонов лучше, чем литералы шаблонов, но парни из Google и особенно Mozilla и Apple, кажется, есть другие интересы ... Некоторые люди не в нужном месте: в 2018 году все еще нет функции импорта для первой платформы в мире. Вы можете в это поверить?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню