web-component - connectedCallback 中的 lit-element getElementById 返回 null

标签 web-component lit-element lit-html

我记得许多 Web 组件教程都说 connectedCallback 非常适合连接 DOM 事件或获取一些 DOM 元素(例如 this one )。但我无法在 lit-element 中运行一个简单的程序:

import { LitElement, html } from 'lit-element';

class MyElement extends LitElement {
  render() {
    return html`<p id="root">template content</p>`;
  }

  connectedCallback() {
    super.connectedCallback();
    this.shadowRoot.getElementById('root'); // null
  }

  firstUpdated() {
    this.shadowRoot.getElementById('root'); // not null
  }
}

看起来它只在 firstUpdated 中有效,firstUpdate 在第一次渲染后不会触发吗?如果我需要在首次渲染之前设置一些事件怎么办?为什么 connectedCallback 在这里不起作用?

最佳答案

connectedCallback 按照规范工作,它只是不符合您的预期。

这些回调在不同时刻触发

<my-element myattribute="foo">   1. -> connectedCallback
  <p id="root">
    template content
  </p>
</my-element>  2. -> firstUpdated (LitElement)

1。 ->connectedCallback 表示元素被注入(inject)到 DOM 中。 但它的子级尚未被解析。

除非您使用 FireFox(2021 年之前的版本!!),它会在 2 时太晚触发 connectedCallback (confirmed bug)

将元素视为水管; 连接表示软管连接到水龙头,而不是水流过它。因此,您可以在 connectedCallback

中访问数据属性(软管的属性)

这就是 connectedCallback 在此 1 处触发的原因。 -> 某个时刻...您可能需要基于其属性的内容。而且您不想等待所有内容都被解析(这可能是一个非常非常大的 DOM 树)

另请注意,每次您在 DOM 中移动元素时,connectedCallback 都会运行

如果您深入研究,您还会注意到,如果您的元素上有observerAttributes,attributeChangedCallback 会在connectedCallback 之前运行。

LitElement 生命周期回调是,它们“保护”您免受(强大的)裸机 Web 组件行为的影响。

因此,如果没有 LitElement,您可以执行以下操作:

connectedCallback(){
  // 1. -> do stuff
  setTimeout(() => {//no tricks, just wait till that dreaded JS Event Loop is done
    // all children are parsed
    // 2. -> do stuff
  });
}

有关血淋淋的回调详细信息,请参阅:wait for Element Upgrade in connectedCallback: FireFox and Chromium differences

关于web-component - connectedCallback 中的 lit-element getElementById 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66303117/

相关文章:

angular - 如何从 Angular 子组件内的 "top component"获取 DI?

javascript - LitElement 从列表中删除项目

javascript - 如何访问并可能修改子 lit-element 组件的属性?

javascript - 如何在点击时清除数据列表输入?

reactjs - 未在 React 应用程序中调用 Microsoft Graph Toolkit 组件的事件处理程序

javascript - 如何获取已注册的自定义元素列表

javascript - 添加新的 Web 组件时的线程问题

node.js - 如何在实时 Web 服务器上部署/使用 lit-html、lit-element

javascript - 使用属性或插槽将数据传递给子元素

javascript - 问题映射数组javascript