javascript 如何在子组件React中关闭从父组件打开的MUI Modal

jm81lzqq  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(176)

我需要在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>
   )
vfwfrxfs

vfwfrxfs1#

原因是div元素中的ModalPaymentMethods组件有onClick事件。只需尝试在handleOpenFromParenthandleCloseFromChild函数上写入控制台日志,就可以找到问题。
您可以使用stopPropagation方法简单地解决该问题。

const handleCloseFromChild = (e) => {
   e.stopPropagation();
   setModalIsOpen(false)
}
t1qtbnec

t1qtbnec2#

您应该像这样定义打开状态:const [open,setOpen]=useState(false)
然后定义一个函数来处理它:const handleToggleModal=()=>{setOpen((current)=>!current)}
您应该将这个handleToggleModal函数作为props传递给子组件,并在需要关闭模态的任何地方调用它。
open状态用作关闭和打开模态

相关问题