sye*_*yed 10 web-component reactjs
我正在尝试从 React 组件构建 Web 组件,一切正常,但有两个问题我正在尝试解决:
谢谢
Har*_*til 12
对于第一个问题,没有直接的方法将React组件转换为Web组件。您必须将其包装到Web 组件类中:
export function MyReactComponent() {
return (
<div>
Hello world
</div>
);
}
class MyWebComponent extends HTMLElement {
constructor() {
super();
// Do something more
}
connectedCallback() {
// Create a ShadowDOM
const root = this.attachShadow({ mode: 'open' });
// Create a mount element
const mountPoint = document.createElement('div');
root.appendChild(mountPoint);
// You can directly use shadow root as a mount point
ReactDOM.render(<MyReactComponent />, mountPoint);
}
}
customElements.define('my-web-component', MyWebComponent);
Run Code Online (Sandbox Code Playgroud)
当然,您可以将其概括并创建一个可重用的函数,如下所示:
function register(MyReactComponent, name) {
const WebComponent = class extends HTMLElement {
constructor() {
super();
// Do something more
}
connectedCallback() {
// Create a ShadowDOM
const root = this.attachShadow({ mode: 'open' });
// Create a mount element
const mountPoint = document.createElement('div');
root.appendChild(mountPoint);
// You can directly use shadow root as a mount point
ReactDOM.render(<MyReactComponent />, mountPoint);
}
}
customElements.define(name, MyWebComponent);
}
register(MyReactComponent, 'my-web-component');
Run Code Online (Sandbox Code Playgroud)
现在可以在您想要公开为 Web 组件的所有组件中重复使用相同的注册函数。此外,如果您的组件接受应传递的 props,则可以更改此函数以接受第三个参数作为字符串数组,其中每个值将使用 注册为此组件的 setter Object.define。每次调用 setter 时,您只需ReactDOM.render再次调用即可。
现在对于第二个问题,您想要做的事情有多种情况。
import或require从应用程序运行的全局环境中进行替换。库的捆绑稍微复杂一些,因为您必须决定输出格式(common.js、ES 模块或 UMD 或全局或多种格式)。如果您要捆绑浏览器,则理想的格式是 ES 模块,因为它可以更好地进行树形抖动。Webpack 之前不支持 Module 格式,最近开始支持。一般来说,我推荐用于应用程序的 Webpack 和用于库的 Rollup.js。
小智 5
如果您想手动执行此操作,Harshal Patil 的答案就是您的最佳选择。我还想指出我帮助创建的一个库,react-to-webcomponent。它简化了这个过程并无缝支持 React 16-18。
| 归档时间: |
|
| 查看次数: |
9919 次 |
| 最近记录: |