During the March 2020 web components virtual F2F, we discussed the fact that an element with a closed shadow root has no standard way to refer to its own shadow root:
class MyElement extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: "closed" });
}
connectedCallback() {
// Other callbacks/methods can't access shadow.
this.shadowRoot.innerHTML = "Hello"; // Throws: Can't set innerHTML of null
}
}
Because of this, any component that creates a closed root must maintain its own private reference to the root.
Additionally, the possibility of declarative Shadow DOM introduces a scenario in which a rehydrated component may need access to a shadow root that was automatically created for it.
For these reasons, it seems worthwhile to expose shadowRoot on an element's internals:
class MyElement extends HTMLElement {
#internals;
constructor() {
super();
this.attachShadow({ mode: "closed" });
this.#internals = this.attachInternals();
}
connectedCallback() {
// Other callbacks/methods can access shadow via internals.
this.#internals.shadowRoot.innerHTML = "Hello";
}
}
As before, the component must still maintain a private reference (to internals instead of the shadow root), but at least now:
- A component that wants to have both a closed shadow root and internals has to track only a reference to the internals. Through that, it can always obtain a reference to the
shadowRoot.
- A component with declarative Shadow DOM could invoke
attachInternals and then inspect the internals to determine whether a shadow root has already been created.
During the March 2020 web components virtual F2F, we discussed the fact that an element with a closed shadow root has no standard way to refer to its own shadow root:
Because of this, any component that creates a closed root must maintain its own private reference to the root.
Additionally, the possibility of declarative Shadow DOM introduces a scenario in which a rehydrated component may need access to a shadow root that was automatically created for it.
For these reasons, it seems worthwhile to expose
shadowRooton an element's internals:As before, the component must still maintain a private reference (to internals instead of the shadow root), but at least now:
shadowRoot.attachInternalsand then inspect the internals to determine whether a shadow root has already been created.