我有一个特殊情况,我需要用一个 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,因此您可以看到问题: