我正在尝试使用门户呈现模式,它在我的应用程序以及 Storybook 中都可以正常工作,但是一旦将其添加到 Storyshots 中,我就会遇到问题。
第一个问题是模拟 ReactDOM 的 createPortal API。我是这样做的:
ReactDOM.createPortal = element => element;
如果不添加,我会收到以下错误:
错误:未捕获 [TypeError:parentInstance.children.indexOf 不是函数]
我找到了这个解决方案React Portal Error。
这解决了这个问题,但是当组件使用门户时,它会在尝试附加子项时失败。它没有找到“modal-root”组件,因此无法附加元素。我不知道如何克服这一点。
我的门户看起来与 React 网站上的示例几乎相同:
import React from 'react';
import { createPortal } from 'react-dom';
import { node } from 'prop-types';
class Portal extends React.Component {
constructor(props) {
super(props);
this.el = document.createElement('div');
}
componentDidMount() {
// !!!!!!!fails here !!!!!!!!!
document.getElementById('modal-root').appendChild(this.el);
}
componentWillUnmount() {
document.getElementById('modal-root').removeChild(this.el);
}
render() {
return createPortal(this.props.children, this.el);
}
}
它现在失败并出现此错误:
错误:未捕获 [TypeError:无法读取属性 'appendChild' of null]
上面代码片段中指示的位置。