Хотя я лично не рекомендую вам динамически создавать слоты для веб-компонента, вы можете этого добиться, вам просто нужно сохранить код создания в функции рендеринга.
Например, вы можете создать массив из своей переменной steps
и перебрать его с помощью функции map
для создания таких слотов:
render() {
return html`<div class="wizard-container ${this.className}">
${Array.from({ length: this.steps }, (v, k) => k).map(
item =>
html`<slot name="step_${item}"><div>Default content ${item}</div></slot>`
)}
</div>`;
}
А затем используйте свой компонент следующим образом:
<my-element steps="3">
<div slot="step_1">Custom content</div>
</my-element>
В результате получится что-то вроде:
Содержимое по умолчанию 0 Пользовательское содержимое Содержимое по умолчанию 2
Вот живая демонстрация
Что касается причины, по которой ваш предыдущий код работал не так, как вы ожидали, LitElement по большей части ожидает, что вы сохраните код, связанный с шаблонами в функции рендеринга, поскольку все, что вы добавляете с помощью appendChild
или аналогичных функций DOM, будет "удалено" в следующий раз, когда компонент обновится, поэтому вам придется добавлять его после каждого обновления самостоятельно
Добавляя слоты непосредственно в метод рендеринга, вы гарантируете, что они не будут удалены неожиданным образом.
person
Alan Dávalos
schedule
30.09.2019