是否可以通过编程方式在Web组件中放置元素?

塞巴斯蒂安·扎特纳(Sebastian Zartner)

是否可以自动或以编程方式slot放置嵌套的Web组件或特定类型的元素,而不必在其上指定属性?

考虑这样的一些结构:

<parent-element>
  <child-element>Child 1</child-element>
  <child-element>Child 2</child-element>

  <p>Content</p>
</parent-element>

随着<parent-element>有阴影DOM是这样的:

<div id="child-elements">
  <slot name="child-elements">
    <child-element>Default child</child-element>
  </slot>
</div>
<div id="content">
  <slot></slot>
</div>

预期结果是:

<parent-element>
  <#shadow-root>
    <div id="child-elements">
      <slot name="child-elements">
        <child-element>Child 1</child-element>
        <child-element>Child 2</child-element>
      </slot>
    </div>
    <div id="content">
      <slot>
        <p>Content</p>
      </slot>
    </div>
</parent-element>

换句话说,我要强制执行<child-element>s仅在<parent-element><td>元素类似的情况下才被允许<tr>我希望将它们放置在<slot name="child-elements">元素中。必须slot为它们中的每一个都指定一个属性,以将它们放置在<parent-element>似乎特定的插槽中同时,内的其余内容<parent-element>应自动放入第二个<slot>元素中。

我首先搜索了一种在注册父元素时定义此方法的方法,尽管CustomElementRegistry.define()当前仅支持此功能extends

然后我想,也许有一个功能允许手动放置元素,例如childElement.slot('child-elements'),但是似乎不存在。

然后,我尝试在父元素的构造函数中以编程方式实现此目的,如下所示:

constructor() {
  super();

  this.attachShadow({mode: 'open'});
  this.shadowRoot.appendChild(template.content.cloneNode(true));

  const childElements = this.getElementsByTagName('child-element');
  const childElementSlot = this.shadowRoot.querySelector('[name="child-elements"]');
  for (let i = 0; i < childElements.length; i++) {
    childElementSlot.appendChild(childElements[i]);
  }
}

尽管这不会将子元素移动到<slot name="child-elements">,所以所有子元素仍会插入第二个<slot>元素中。

Danny'365CSI'英格曼

未命名的默认设置<slot></slot>将捕获所有未分配给命名插槽的元素
因此,slotchange事件可以捕获这些事件并强制child-element插入正确的插槽:

customElements.define('parent-element', class extends HTMLElement {
    constructor() {
      super().attachShadow({mode:'open'})
             .append(document.getElementById(this.nodeName).content.cloneNode(true));
      this.shadowRoot.addEventListener("slotchange", (evt) => {
        if (evt.target.name == "") {// <slot></slot> captures
          [...evt.target.assignedElements()]
            .filter(el => el.nodeName == 'CHILD-ELEMENT') //process child-elements
            .map(el => el.slot = "child-elements"); // force them to their own slot
        } else console.log(`SLOT: ${evt.target.name} got:`,evt.target.assignedNodes())
      })}});
customElements.define('child-element', class extends HTMLElement {
    connectedCallback(parent = this.closest("parent-element")) {
      // or check and force slot name here
      if (this.parentNode != parent) {
        if (parent) parent.append(this); // Child 3 !!!
        else console.error(this.innerHTML, "wants a PARENT-ELEMENT!");
      }}});
child-element { color: red; display: block; } /* style lightDOM in global CSS! */
<template id=PARENT-ELEMENT>
  <style>
    :host { display: inline-block; border: 2px solid red; }
    ::slotted(child-element) { background: lightgreen }
    div { border:3px dashed rebeccapurple }
  </style>
  <div><slot name=child-elements></slot></div>
  <slot></slot>
</template>

<parent-element>
  <child-element>Child 1</child-element>
  <child-element>Child 2</child-element>
  <b>Content</b>
  <div><child-element>Child 3 !!!</child-element></div>
</parent-element>
<child-element>Child 4 !!!</child-element>

请注意,处理<child-element>不是的直接子代的逻辑<parent-element>,您可能需要根据自己的需要重写它

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

是否可以在.less组件中放置重复样式

来自分类Dev

是否可以通过编程方式控制SVG

来自分类Dev

是否可以通过编程方式更改PieRenderer?

来自分类Dev

是否可以通过编程方式控制SVG

来自分类Dev

是否可以通过编程将<remove>元素添加到web.config中的httpmodule?

来自分类Dev

是否可以在同一行中放置组件?[React Native Design]

来自分类Dev

是否可以在选择查询中放置<if>条件

来自分类Dev

是否可以在布局中放置多张卡片?

来自分类Dev

是否可以通过编程方式创建数据库视图?

来自分类Dev

是否可以通过编程方式连接到chromecast路由?

来自分类Dev

是否可以通过编程方式导出图表图表?

来自分类Dev

是否可以通过编程方式在设备上操纵网络质量?

来自分类Dev

是否可以通过编程方式启用远程jmx监视?

来自分类Dev

是否可以通过编程方式创建Freemarker宏?

来自分类Dev

是否可以通过pip以编程方式安装python库?

来自分类Dev

是否可以通过编程方式取消/停止从JavaScript开始的下载?

来自分类Dev

是否可以通过编程方式对很多动画进行重新着色?

来自分类Dev

是否可以通过编程方式收听Dynamics crm 2011事件?

来自分类Dev

是否可以通过编程方式更改父Shell的工作目录?

来自分类Dev

是否可以通过编程方式在登录时设置显示配置?

来自分类Dev

是否可以通过编程方式在Android上暂停通话?

来自分类Dev

Android-以编程方式在EditText中居中放置文本

来自分类Dev

如何以编程方式在UITableViewCells中居中放置图像?

来自分类Dev

以编程方式在钻取地图 amchart 中放置标记

来自分类Dev

是否可以通过编程获取WKInterfaceGroup的子元素?

来自分类Dev

是否可以通过编程方式知道Activity是否[未]通过GC?

来自分类Dev

是否可以通过编程方式知道Activity是否[未]通过GC?

来自分类Dev

在CXF中,是否可以通过编程方式对客户端的配置进行编程?

来自分类Dev

自动布局-以编程方式在元素之间垂直放置元素吗?

Related 相关文章

  1. 1

    是否可以在.less组件中放置重复样式

  2. 2

    是否可以通过编程方式控制SVG

  3. 3

    是否可以通过编程方式更改PieRenderer?

  4. 4

    是否可以通过编程方式控制SVG

  5. 5

    是否可以通过编程将<remove>元素添加到web.config中的httpmodule?

  6. 6

    是否可以在同一行中放置组件?[React Native Design]

  7. 7

    是否可以在选择查询中放置<if>条件

  8. 8

    是否可以在布局中放置多张卡片?

  9. 9

    是否可以通过编程方式创建数据库视图?

  10. 10

    是否可以通过编程方式连接到chromecast路由?

  11. 11

    是否可以通过编程方式导出图表图表?

  12. 12

    是否可以通过编程方式在设备上操纵网络质量?

  13. 13

    是否可以通过编程方式启用远程jmx监视?

  14. 14

    是否可以通过编程方式创建Freemarker宏?

  15. 15

    是否可以通过pip以编程方式安装python库?

  16. 16

    是否可以通过编程方式取消/停止从JavaScript开始的下载?

  17. 17

    是否可以通过编程方式对很多动画进行重新着色?

  18. 18

    是否可以通过编程方式收听Dynamics crm 2011事件?

  19. 19

    是否可以通过编程方式更改父Shell的工作目录?

  20. 20

    是否可以通过编程方式在登录时设置显示配置?

  21. 21

    是否可以通过编程方式在Android上暂停通话?

  22. 22

    Android-以编程方式在EditText中居中放置文本

  23. 23

    如何以编程方式在UITableViewCells中居中放置图像?

  24. 24

    以编程方式在钻取地图 amchart 中放置标记

  25. 25

    是否可以通过编程获取WKInterfaceGroup的子元素?

  26. 26

    是否可以通过编程方式知道Activity是否[未]通过GC?

  27. 27

    是否可以通过编程方式知道Activity是否[未]通过GC?

  28. 28

    在CXF中,是否可以通过编程方式对客户端的配置进行编程?

  29. 29

    自动布局-以编程方式在元素之间垂直放置元素吗?

热门标签

归档