gpt4 book ai didi

shadow-dom - 如何将选项标签作为分布式节点传递给自定义元素(又名 )

转载 作者:行者123 更新时间:2023-12-03 14:25:10 25 4
gpt4 key购买 nike

我有一个像这样定义的 Web 组件自定义元素。

 <template id="dropdown-template">
<select>
<slot></slot>
</select>
</template>
<script>
class Dropdown extends HTMLElement {
constructor() {
super();
const shadowRoot = this.attachShadow({mode: 'open'});
let template = document.getElementById('dropdown-template');
shadowRoot.appendChild(template.content.cloneNode(true));
}
}
customElements.define("drop-down", Dropdown);
</script>

在尝试使用它时,我尝试将带有值的选项标签传递到自定义元素中。
<drop-down>
<option>one</option>
<option>two</option>
<option>three</option>
</drop-down>

这不起作用。选择元素显示为具有 <slot>元素作为其直接子元素,并且不呈现选项。这是否与 <select> 无关?标签?

最佳答案

不可能这样做,因为 <option> 的父元素标签必须是 <select>标签。所以你可以使用 Shadow DOM 因为 <slot>元素将打破父/子层次结构。

解决方案 1:移动元素

一种解决方法是在 <select> 内移动 lig​​ht DOM 的内容。模板中的元素。

class Dropdown extends HTMLElement {
constructor() {
super()
const shadowRoot = this.attachShadow( {mode: 'open'} )
let template = document.getElementById( 'dropdown-template' )
shadowRoot.appendChild( template.content.cloneNode(true) )

const select = shadowRoot.querySelector( 'select' )
shadowRoot.addEventListener( 'slotchange', ev => {
let node = this.querySelector( 'option' )
node && select.append( node )
} )
}
}
customElements.define("drop-down", Dropdown);
<template id="dropdown-template">
<select></select>
<slot></slot>
</template>

<drop-down>
<option>one</option>
<option>two</option>
<option>three</option>
</drop-down>


方案二:定制<select>

另一种可能性是避免使用 Shadow DOM 并将下拉列表定义为自定义的内置 <select>元素。如果您想自定义布局,这可能不符合您的需求。
<select is="drop-down">
<option>one</option>
<option>two</option>
<option>tree</option>
</select>

关于shadow-dom - 如何将选项标签作为分布式节点传递给自定义元素(又名 <slot></slot>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56351274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com