谢谢吉尔的回答。
我之前也在考虑类似的事情(设置状态等 - 因为可能会出现时间问题)。不过我不喜欢这个解决方案,因为您随后会在 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>
);
}
}