J'utilise le modal d'ANT Design dans un autre composant comme ceci:
import React from "react"; class SomeComponent extends React.Component { constructor(props) { super(props); this.state = { modalVisible: false }; } toggleModal() { const { modalVisible } = this.state; this.setState({ modalVisible: !modalVisible }); } render() { const { modalVisible } = this.state; return ( <div> // some non-modal content <button onClick={() => this.toggleModal()}>Toggle Modal</button> <SomeModalWrapper modalVisible={modalVisible} toggleModal={this.toggleModal} /> </div> ); } } export default SomeComponent;
Ce composant est à son tour appelé par un composant parent comme ceci:
import React from "react"; import { Modal, Button } from "antd"; class SomeModalWrapper extends React.Component { constructor(props) { super(props); this.state = {}; } handleOk() { console.log("OK"); } render() { const { modalVisible, toggleModal } = this.props; return ( <Modal title="Some Title" visible={modalVisible} width={300} className="" destroyOnClose={true} footer={[ <Button key="back" onClick={() => toggleModal()}> Return </Button>, <Button key="submit" type="primary" onClick={this.handleOk}> Submit </Button> ]} > // some other content </Modal> ); } } export default SomeModalWrapper;
3 Réponses :
Le problème ne vient pas de maskClosable
qui est la valeur par défaut est vrai
.
this
à la fonction toggleModal
. visible = {modalVisible}
, ce qui signifie que vous contrôlez l'état modal, avec lui, l'état modalVisible
va remplacer maskClosable
. En d'autres termes, maskClosable
ne peut pas changer votre état par lui-même. <Modal ... onCancel={toggleModal} ... > // some other content </Modal>;
Aussi, je suggère toujours en utilisant onCancel
, vous pouvez obtenir un comportement inattendu sans cela.
class SomeComponent extends React.Component { state = { modalVisible: false }; // bind with named class function or with `.bind()` inside consturctor toggleModal = () => { this.setState(prevState => ({ modalVisible: !prevState.modalVisible })); }; render() { ... } }
Vous devez transmettre les accessoires Annuler dans le composant SomeWrapper : c'est-à-dire Somewrapper.js
<Modal title="Some Title" visible={modalVisible} width={300} className="" onCancel={toggleModal} //pass close logic here destroyOnClose={true} footer={[ <Button key="back" onClick={() => toggleModal()}> Return </Button>, <Button key="submit" type="primary" onClick={this.handleOk}> Submit </Button> ]} > // some other content </Modal>
Voici la démo: https: / /codesandbox.io/s/long-shape-7tc3g
Je ne sais pas pourquoi, je l'ai voté. C'est le seul changement que j'ai fait et cela a fonctionné.
Cela fonctionnera mais cela n'explique pas pourquoi maskClosable
ne fonctionne pas, vous pouvez voir l'exemple onCancel
sur chaque exemple Modal
. J'ai voté contre parce que la question est "la propriété modale maskClosable ne fonctionne pas?" et non "Comment faire fonctionner le modal"
Ajout de ceci pour quiconque a commis l'erreur que j'ai faite:
'Spécifiez une fonction qui sera appelée lorsqu'un utilisateur clique sur le bouton OK'
et a rempli inconsciemment ce que 'onCancel' fait comme l'opposé de onOk, malgré ce qui est réellement répertorié, ce qui est:
' Spécifiez une fonction qui sera appelée lorsqu'un utilisateur clique sur le masque, le bouton de fermeture en haut à droite ou le bouton Annuler '.
non seulement à cause de ma propre insouciance, mais aussi à cause d'une dénomination incohérente dans leur API.
Merci d'avoir signalé cela Yohan! Cela m'a également manqué, pour toute personne intéressée, vous pouvez trouver le libellé original dans l ' API modale