我需要在React中构建一个从父组件打开并从模态组件本身关闭的模态组件。
我在父组件中设置状态,并将其作为属性传递给子模态组件:
const [modalIsOpen, setModalIsOpen] = useState(false)
const handleOpenFromParent = () => {
setModalIsOpen(true)
}
const handleCloseFromChild = () => {
setModalIsOpen(false)
}
以及
<div
className={`${styles.w_30} p-3 d-flex justify-content-center align-items-center flex-column`}
onClick={handleOpenFromParent}
>
<ModalPaymentMethods
playerNickname={nickname}
paymentDescription={paymentMethodsVisa}
paymentLogo={<Icon icon='mdi:credit-card-outline' color={'#84c3d3'} style={{ fontSize: '150px' }} />}
depositTimes={11}
depositAmount={'€18.6k'}
depositTimesLastSixMonths={9}
depositQuantityLastSixMonths={'€12.7k'}
paymentMethodNumber={4301165517084005}
expiryMonth={'07'}
expiryYear={'2017'}
holderName={`${name + ' ' + lastName}`}
billingAddress={address}
modalIsOpen={modalIsOpen}
handleCloseFromChild={handleCloseFromChild}
/>
</div>
从父组件打开模态组件没有问题,但是一旦从子组件打开模态组件,我就无法关闭它。
我传递了一个回调函数handleCloseFromChild
作为一个prop来将模态上的可见性状态设置回false,但是它不起作用,modalIsOpen
始终保持true,并且从不会从回调函数中设置为false:
const ModalPaymentMethods = ({
playerNickname,
paymentDescription,
paymentLogo,
depositTimes,
depositAmount,
depositTimesLastSixMonths,
depositQuantityLastSixMonths,
paymentMethodNumber,
expiryMonth,
expiryYear,
holderName,
billingAddress,
modalIsOpen,
handleCloseFromChild
}) => {
console.log(modalIsOpen)
console.log(handleCloseFromChild)
return (
<div className={styles.ModalPaymentMethods}>
<Modal
open={modalIsOpen}
onClose={handleCloseFromChild}
aria-labelledby='modal-modal-title'
aria-describedby='modal-modal-description'
>
test
</Modal>
</div>
)
2条答案
按热度按时间vfwfrxfs1#
原因是div元素中的
ModalPaymentMethods
组件有onClick
事件。只需尝试在handleOpenFromParent
和handleCloseFromChild
函数上写入控制台日志,就可以找到问题。您可以使用
stopPropagation
方法简单地解决该问题。t1qtbnec2#
您应该像这样定义打开状态:
const [open,setOpen]=useState(false)
然后定义一个函数来处理它:
const handleToggleModal=()=>{setOpen((current)=>!current)}
您应该将这个
handleToggleModal
函数作为props传递给子组件,并在需要关闭模态的任何地方调用它。open
状态用作关闭和打开模态