【发布时间】:2019-07-19 01:13:22
【问题描述】:
给出以下示例代码:
import { LitElement, html, css } from 'lit-element';
class ItemsDisplay extends LitElement {
static get styles() {...}
static get properties {...}
constructor () {
super();
...
}
render {
return html`
${this.items.map((item, index, array) => html`
<div class="name">
...
</div>
`)}
`;
}
}
选择具有类“名称”的所有节点的适当方法是什么?
我尝试了以下方法,但失败; nodesList 一直是 undefined:
- 内
constructor:
this.nodesList = this.shadowRoot.querySelectorAll(".name");
- 使用:
firstUpdated(changedProperties) {
return this.nodesList = this.shadowRoot.querySelectorAll(".name");
}
- 自定义函数内部:
getNodesList() {
let nodesList = this.shadowRoot.querySelectorAll(".name");
...
}
我也尝试过:
connectedCallback() {
super.connectedCallback();
return this.nodesList = this.shadowRoot.querySelectorAll(".name");
}
期待阅读解决方案。
蒂亚
【问题讨论】:
-
这取决于您何时调用它。您必须确保 DOM 已添加到
shadowRoot,然后querySelectorAll才能工作。你能添加一个你试图调用它的例子吗? -
我试图从
constructor调用它为this.getNodesList(),这是一个放在render之后的函数。我认为lit-element负责所有必要的工作,以便将新的element自动添加到DOM 和/或将shadowDOM 添加到shadowRoot!。我想念什么?如何在“lit-element”中检查 shadowRoot 已准备好解析?蒂亚 -
我没有使用过 lit,但您可能需要在
setTimeout中拨打电话,以便浏览器有时间在内容真正可用之前进行实际渲染 -
您将无法查询
constructor中的DOM,甚至connectedCallbackDOM 节点可能还没有准备好。您想对这些元素做什么?为什么需要这么早查询它们? -
@Intervalia Tnks 为您提供帮助。也请看看这个questions。
setTimeout会起作用,但这不是让我满意的方式!这是一个终极解决方案,但不是一个优雅的解决方案。promise可能是理想的选择。
标签: polymer web-component shadow-dom lit-element