【问题标题】:Creating radio buttons in Shadow DOM在 Shadow DOM 中创建单选按钮
【发布时间】:2020-01-06 07:46:08
【问题描述】:

当我们要使用 Shadow Dom 创建一个 自定义单选按钮 作为 Web 组件时,问题就出现了。

通常当我们使用单选按钮时,我们通常给分组的单选框起相同的名称,像这样。

<input type="radio" name="size" id="small" value="small">
<input type="radio" name="size" id="large" value="large">

但是如果我们定义一些自定义元素(比如我们说 cus-radio)-> 我们会以将名称和 id 作为输入(来自父级)并将它们放置在自定义元素中的方式来做。这将在正常情况下完美运行。

但我的问题在于影子 dom!当我们在 shadow dom 中创建元素时,它内部的属性可以访问或与外部 dom(主 dom)连接。那么,如果它的 name 和 id 属性在父 dom 中不可访问或不常见,我们如何开发自定义单选按钮?

例子:-

我们将像这样开发我们的自定义元素(角度元素中的伪代码)

radio.html:-

<input type="radio" [name]="name" [id]="id" ...>

TS/逻辑文件:-

...
component cus-radio {
@Input() name: string;
@Input() id: string;
...

无论我们在哪里使用它:-

<cus-radio [id]="'small'" [name]="'size'" value="small">
<cus-radio [id]="'large'" [name]="'size'" value="large">

预期的行为应该是(就像在正常 dom 中发生的那样),这两个无线电输入必须相互关联并存在于两个相互理解的情况下不。因为那些 name 和 id 在没有引用父 dom(主 dom)的影子 dom 中被更改。

我们如何才能在 shadow dom 中实际创建无线电输入?

【问题讨论】:

  • 您能否提供一个实际重现问题的minimal reproducible example
  • FWIW 我试图查看我的自定义元素是否可以扩展 HTMLInputElement(或类似的东西),但在尝试让它工作一段时间后我放弃了。如果我需要解决这个问题,而不是每个收音机的额外输入元素(正如 Emiel 的回答所建议的那样),我可能会选择一个自定义 radiogroup 元素,它能够人为地管理我的自定义收音机元素(所以我只需要一个额外的包装器元素)。还是觉得很老套。

标签: javascript web-component shadow-dom custom-element angular-elements


【解决方案1】:

在 Shadow DOM 模板中使用 &lt;slot&gt; 元素。这样您就可以在您的自定义元素中注入 input 并在 parent DOM 和 Shadow DOM 中访问它。

在你的 Shadow DOM 中添加一个 &lt;slot&gt; 元素。如果您有多个插槽并希望将特定元素分配给特定插槽,则此元素可以具有 name 属性。但 未命名 插槽也是一种选择。这意味着自定义元素的每个直接子元素都将放置在未命名的插槽内。

this.shadowRoot.innerHTML = `

    <style>
        ::slotted(input[type="radio"]) {
            /**
             * Styles of the input.
             * The input can also be styled from the parent DOM.
             */
        }
    </style>

    <slot></slot>

`;

现在您的 Shadow DOM 有一个 &lt;slot&gt; 元素,您可以在其中注入 &lt;input&gt; 元素。使用::slotted 伪选择器,您可以设置插槽内的每个元素的样式,甚至可以通过选择::slotted 选择器内的特定元素、类或ID 来指定多种样式。

将您的 &lt;input&gt; 添加为自定义元素中的直接子元素,它将被放置在 Shadow DOM 中。

<cus-radio id="small">
    <input type="radio" name="size" value="small"/>
</cus-radio>

Javascript.info 有一些关于如何在自定义元素中使用槽的优秀文档。我建议你检查一下。

【讨论】:

  • 很好的解决方案来解决我实际上不需要的东西。我需要制作一个单选按钮组件,它包含所有使用不需要关心添加另一个输入元素的东西,所以插槽的东西实际上不适用于此。
  • 您真正需要的东西很快就会以form-associated custom elements 的形式出现。 WHATWG 有一个实现示例。但目前几乎不存在支持。
猜你喜欢
  • 2019-06-19
  • 2021-11-11
  • 2021-09-10
  • 2020-09-13
  • 1970-01-01
  • 2019-02-27
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多