gpt4 book ai didi

javascript - HTML 自定义元素子容器

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

我正在尝试制作一个经典的菜单栏,同时尝试使用网络组件。我从来没有和他们一起玩过,这是我第一次涉足这个主题。它们似乎是一个非常强大的工具,但似乎没有太多关于我想要做什么的信息。

我有一个自定义 html 元素树,当前看起来像这样(调用构造函数之后):

<menu-bar>
<sub-menu label="some label">
<label>some label</label>
<menu-item></menu-item>
<menu-item></menu-item>
<menu-item></menu-item>
</sub-menu>
</menu-bar>

如何让自定义元素将其变成...

<menu-bar>
<sub-menu label="some label">
<label>some label</label>
<div>
<menu-item></menu-item>
<menu-item></menu-item>
<menu-item></menu-item>
</div>
</sub-menu>
</menu-bar>

...何时调用子菜单的构造函数?另外,是否可以使 div 成为 Shadow dom 的一部分,而菜单项元素不在 Shadow dom 中?

相关示例代码

class MenuBar extends HTMLElement {
constructor() {
super();
}
};

class SubMenu extends HTMLElement {
constructor() {
super();
let shadowRoot = this.attachShadow({mode: "open"});
this.labelElement = document.createElement("label");
shadowRoot.appendChild(this.labelElement);
}

static get observedAttributes() {
return ["label"];
}
attributeChangedCallback(pName, pOldValue, pNewValue) {
switch (pName) {
case "label":
this.labelElement.innerHTML = pNewValue;
break;
}
}
};

class MenuItem extends HTMLElement {
constructor() {
super();
}
};

window.customElements.define("menu-bar", MenuBar);
window.customElements.define("sub-menu", SubMenu);
window.customElements.define("menu-item", MenuItem);

非常感谢任何帮助,因为我刚刚学习它们是如何工作的,并且正在寻找更多有关如何使用 Web 组件操作预定义 html 的详细信息,而不仅仅是对这个确切示例本身的直接答案。

最佳答案

您需要使用<slot>允许非shadowDOM子元素显示在元素的shadowDOM中。

示例:

class MenuBar extends HTMLElement {
constructor() {
super();
}
};

class SubMenu extends HTMLElement {
constructor() {
super();
let shadowRoot = this.attachShadow({mode: "open"});
this.labelElement = document.createElement("label");
let temp = document.createElement("div");
temp.innerHTML = '<slot></slot>';
shadowRoot.appendChild(this.labelElement);
shadowRoot.appendChild(temp);
}

static get observedAttributes() {
return ["label"];
}
attributeChangedCallback(pName, pOldValue, pNewValue) {
switch (pName) {
case "label":
this.labelElement.innerHTML = pNewValue;
break;
}
}
};

class MenuItem extends HTMLElement {
constructor() {
super();
this.attachShadow({mode: "open"}).innerHTML = `
<style>
:host {
background-color: #eee;
border: 1px solid #ddd;
display:block;
margin: 1px 0;
}
</style>
<slot></slot>
`;
}
};

window.customElements.define("menu-bar", MenuBar);
window.customElements.define("sub-menu", SubMenu);
window.customElements.define("menu-item", MenuItem);
<menu-bar>
<sub-menu label="some label">
<menu-item>1</menu-item>
<menu-item>2</menu-item>
<menu-item>3</menu-item>
</sub-menu>
</menu-bar>

在您的 SubMenu 中我添加了<div><slot>容纳所有的<menu-item>组件。

我还添加了一些小的 CSS,以便更容易看到子元素。

关于javascript - HTML 自定义元素子容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53272600/

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