Хотя я лично не рекомендую вам динамически создавать слоты для веб-компонента, которого вы можете достичь, вам просто нужно сохранить код создания в функции рендеринга
Например, вы можете создать массивиз вашей переменной 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, будет «удалено» при следующем обновлении компонента, поэтомувам придется добавлять его после каждого обновления самостоятельно
Добавляя слоты непосредственно в метод рендеринга, вы гарантируете, что они не получатизбрал неожиданным образом