我有一个特殊情况,我需要用一个 Web 组件封装一个 React 组件。设置似乎非常简单。这是react代码:
// React Component
class Box extends React.Component {
handleClick() {
alert("Click Works");
}
render() {
return (
<div
style={{background:'red', margin: 10, width: 200, cursor: 'pointer'}}
onClick={e => this.handleClick(e)}>
{this.props.label} <br /> CLICK ME
</div>
);
}
};
// Render React directly
ReactDOM.render(
<Box label="React Direct" />,
document.getElementById('mountReact')
);
HTML:
<div id="mountReact"></div>
这很好地安装并且点击事件有效。现在,当我围绕 React 组件创建 Web 组件包装器时,它可以正确呈现,但单击事件不起作用。这是我的 Web 组件包装器:
// Web Component Wrapper
class BoxWebComponentWrapper extends HTMLElement {
createdCallback() {
this.el = this.createShadowRoot();
this.mountEl = document.createElement('div');
this.el.appendChild(this.mountEl);
document.onreadystatechange = () => {
if (document.readyState === "complete") {
ReactDOM.render(
<Box label="Web Comp" />,
this.mountEl
);
}
};
}
}
// Register Web Component
document.registerElement('box-webcomp', {
prototype: BoxWebComponentWrapper.prototype
});
这是 HTML:
<box-webcomp></box-webcomp>
有什么我想念的吗?还是 React 拒绝在 Web 组件中工作?我见过像 Maple.JS 这样的库可以做这种事情,但他们的库有效。我觉得我错过了一件小事。
这是 CodePen,因此您可以看到问题: