Décrivez le bogue
Je voudrais ajouter une histoire de mon composant Modal qui est fait par ReactDOM.createPortal.
le conteneur modal est <div id="modal-root"></div>
ajouté par moi dans index.html.
mais quand j'écris une histoire comme celle-ci:
storiesOf('atoms/modal', module)
.addDecorator(withKnobs)
.add('Modal', () => (
<Modal
isOpen={true}
onRequestClose={action('onRequestClose')}
>
<div>modal</div>
</Modal>
))
「Le conteneur cible n'est pas un élément DOM」 Une erreur s'est produite.
Je pense que c'est parce qu'il n'y a pas de div racine modale dans l'interface utilisateur de Storybook?
Comment puis-je y remédier?
Reproduire
voir au dessus
Captures d'écran
Extraits de code
c'est mon code modal pour faire court:
const modalRoot = document.getElementById('modal-root')
class Modal extends React.Component {
constructor(props) {
super(props)
this.el = document.createElement('div')
}
componentDidMount() {
modalRoot.appendChild(this.el)
}
componentWillUnmount() {
modalRoot.removeChild(this.el)
}
handleClickBackDrop = event => {
this.props.onRequestClose(event)
}
render() {
const { isOpen, children } = this.props
if (!isOpen) {
return null
}
const modalUI = (
<BackDropWrapper
onClick={this.handleClickBackDrop}
>
<ModalWrapper>
{children}
</ModalWrapper>
</BackDropWrapper>
)
return ReactDOM.createPortal(modalUI, modalRoot)
}
}
Système:
Puisque le const modalRoot = document.getElementById('modal-root')
est appelé statiquement, vous devez générer le <div id="modal-root">
avant que le composant Modal
soit importé. Je peux suggérer de créer ce div dans config.js
avant de charger les histoires.
Quelque chose comme ça:
// config.js
const modalRoot = document.createElement('div');
modalRoot.setAttribute('id', 'modal-root');
document.body.append(modalRoot);
@ igor-dv Merci, votre suggestion a fonctionné.
Commentaire le plus utile
Puisque le
const modalRoot = document.getElementById('modal-root')
est appelé statiquement, vous devez générer le<div id="modal-root">
avant que le composantModal
soit importé. Je peux suggérer de créer ce div dansconfig.js
avant de charger les histoires.Quelque chose comme ça: