Вы можете использовать декоратор @ Element () и использовать его для запроса элемента domContainer
в shadowRoot
. shadowRoot
необходимо с @Element()
в этом случае, потому что для shadow
установлено значение true
:
import { Component, Element, Prop } from "@stencil/core";
import { format } from "../../utils/utils";
import ReactDOM from 'react-dom';
import React from "react";
import { LikeButton } from './../LikeButton';
const e = React.createElement;
@Component({
tag: "my-component",
styleUrl: "my-component.css",
shadow: true
})
export class MyComponent {
@Element() el: HTMLElement;
@Prop() first: string;
@Prop() middle: string;
@Prop() last: string;
private getText(): string {
return format(this.first, this.middle, this.last);
}
componentWillLoad() {
const domContainer = this.el.shadowRoot.querySelector("#like_button_container");
ReactDOM.render(e(LikeButton), domContainer);
}
render() {
return (
<div>
Hello, World! I'm {this.getText()}{" "}
<div id="like_button_container">React container</div>
</div>
);
}
}
У меня периодически возникали проблемы при запуске в режиме разработки stenciljs. При обновлении страницы я столкнулся с проблемой, возможно, из-за кеша, но если я вызвал перезагрузку, сохранив файл компонента stenciljs, содержащий этот код, он обычно работал. Это может быть больше связано с stencil-dev-server, чем с кодом.
Надеюсь, это поможет!