Спасибо за ответ Gil.
Я думал о чем-то похожем раньше (установка состояния и т. Д. - из-за проблем с синхронизацией, которые могут возникнуть).Однако решение мне не понравилось, потому что тогда вы выполняете изменение состояния в componentDidLoad, которое инициирует другую загрузку сразу после загрузки компонента.Это кажется грязным и бесполезным.
Немного с innerHTML={child.outerHTML}
мне очень помогло, хотя.
Кажется, что вы также можете просто сделать:
import {Component, Element, State} from '@stencil/core';
@Component({
tag: 'slotted-element',
styleUrl: 'slotted-element.css',
shadow: true
})
export class SlottedElement {
@Element() host: HTMLDivElement;
render() {
return (
<div>
<ul>
{Array.from(this.host.children)
.map(child => <li innerHTML={child.outerHTML} />)}
</ul>
</div>
);
}
}
Я думалВы можете столкнуться с проблемами синхронизации, потому что во время render()
дочерние элементы хоста уже были удалены, чтобы освободить место для того, что render()
возвращает.Но так как shadow-dom и light-dom прекрасно сосуществуют в компоненте хоста, я думаю, что не должно быть никаких проблем.
Я действительно не знаю, почему вы должны использовать innerHTML
.Исходя из React, я привык делать:
{Array.from(this.host.children)
.map(child => <li>{child}</li>)}
И я подумал, что это базовый синтаксис JSX, и, поскольку Stencil также использует JSX, я тоже могу это сделать.Не работает, хотяinnerHTML
помогает мне.Еще раз спасибо.
РЕДАКТИРОВАТЬ: Проблемы с синхронизацией, которые я упомянул, появятся, если вы не используете shadow-dom.Некоторые странные вещи начинают происходить, и в итоге у вас будет много дублирующих детей.Хотя вы можете сделать (может иметь побочные эффекты):
import {Component, Element, State} from '@stencil/core';
@Component({
tag: 'slotted-element',
styleUrl: 'slotted-element.css',
shadow: true
})
export class SlottedElement {
children: Element[];
@Element() host: HTMLDivElement;
componentWillLoad() {
this.children = Array.from(this.host.children);
this.host.innerHTML = '';
}
render() {
return (
<div>
<ul>
{this.children.map(child => <li innerHTML={child.outerHTML} />)}
</ul>
</div>
);
}
}