在嵌套的 shadow DOM 中重新分配重复的槽元素

DAR*_*DAR 5 html web-component google-chrome-extension shadow-dom custom-element

背景:这个问题与 Chrome 最新版本扩展的开发有关。它依赖于 javascript 功能,例如并非在所有浏览器上都可用的 HTML 导入和自定义元素,但在这种情况下是可以的。

我正在尝试实现一个简化的 HTML 自定义元素,如下所示:

<custom-el>
    <span slot="head">Great</span>

    <span slot="item">Item one</span>
    <span slot="item">Item two</span>

    <span slot="foot">done</span>
</custom-el>
Run Code Online (Sandbox Code Playgroud)

我注册了<custom-el>. 每次创建元素时,我的代码的自定义元素类都会附加一个影子根并附加到以下模板中的影子根内容:

<template id="main">
    <h1><slot name="head"></slot></h1>
    <ul>
        <slot name="item"></slot>
    </ul>
    <i><slot name="foot"></slot></i>
</template>
Run Code Online (Sandbox Code Playgroud)

我想将每个<span>属性重新分配slot="item"给负责呈现单个项目的辅助模板:

<template id="sub">
    <li><slot name="item"></slot></li>
</template>
Run Code Online (Sandbox Code Playgroud)

带属性的槽数name="item"不固定。它从数据库生成并定期更改。

我知道可以通过将 shadowRoot 附加到插槽的父元素并设置插槽的插槽属性来重新分配插槽,例如<slot name="item" slot="newItem">. 但我认为这在我的情况下不起作用,因为子模板需要包装每个项目实例,而不是项目列表。

我可以将影子根和子模板附加到主文档中的每个项目。这会起作用,但我的偏好是主模板导入并应用任何嵌套的 shadowRoots 和模板。这样,主文档只需要导入包含主模板的文件。组件细节的实现被封装在主模板html文件中。

我还可以使用slotchange事件和HTMLSlotElement.assignedNodes方法来拼凑脚本解决方案。但我宁愿不走那条路。

还有另一种方法吗?我的实际用例涉及更复杂的 HTML 结构。或者我的架构或对 Web 组件的理解有缺陷?

Sup*_*arp -1

<li>如果可能的话,最简单的方法是在 light DOM 中添加带有标签的项目。

<span slot=item><li>Item 1</li></span>
<span slot=item><li>Item 2</li></span>
Run Code Online (Sandbox Code Playgroud)

这样您就不需要使用 Javascript 来生成标签<li>