mirror of
https://github.com/zhigang1992/react.git
synced 2026-04-29 12:45:32 +08:00
fix(modal): fix close handler is triggered repeatedly
fix(modal): trigger callback before state update
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect, useMemo, useState } from 'react'
|
import React, { useEffect, useMemo } from 'react'
|
||||||
import { createPortal } from 'react-dom'
|
import { createPortal } from 'react-dom'
|
||||||
import usePortal from '../utils/use-portal'
|
import usePortal from '../utils/use-portal'
|
||||||
import ModalTitle from './modal-title'
|
import ModalTitle from './modal-title'
|
||||||
@@ -11,6 +11,7 @@ import Backdrop from '../shared/backdrop'
|
|||||||
import { ModalConfig, ModalContext } from './modal-context'
|
import { ModalConfig, ModalContext } from './modal-context'
|
||||||
import { pickChild } from '../utils/collections'
|
import { pickChild } from '../utils/collections'
|
||||||
import useBodyScroll from '../utils/use-body-scroll'
|
import useBodyScroll from '../utils/use-body-scroll'
|
||||||
|
import useCurrentState from '../utils/use-current-state'
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
disableBackdropClick?: boolean
|
disableBackdropClick?: boolean
|
||||||
@@ -41,26 +42,27 @@ const Modal: React.FC<React.PropsWithChildren<ModalProps>> = ({
|
|||||||
}) => {
|
}) => {
|
||||||
const portal = usePortal('modal')
|
const portal = usePortal('modal')
|
||||||
const [, setBodyHidden] = useBodyScroll()
|
const [, setBodyHidden] = useBodyScroll()
|
||||||
const [visible, setVisible] = useState<boolean>(false)
|
const [visible, setVisible, visibleRef] = useCurrentState<boolean>(false)
|
||||||
const [withoutActionsChildren, ActionsChildren] = pickChild(children, ModalAction)
|
const [withoutActionsChildren, ActionsChildren] = pickChild(children, ModalAction)
|
||||||
const hasActions = ActionsChildren && React.Children.count(ActionsChildren) > 0
|
const hasActions = ActionsChildren && React.Children.count(ActionsChildren) > 0
|
||||||
|
|
||||||
const closeModal = () => {
|
const closeModal = () => {
|
||||||
|
onClose && onClose()
|
||||||
setVisible(false)
|
setVisible(false)
|
||||||
setBodyHidden(false)
|
setBodyHidden(false)
|
||||||
onClose && onClose()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (open === undefined) return
|
if (open === undefined) return
|
||||||
setVisible(open)
|
|
||||||
setBodyHidden(open)
|
|
||||||
|
|
||||||
if (open) {
|
if (open) {
|
||||||
onOpen && onOpen()
|
onOpen && onOpen()
|
||||||
} else {
|
}
|
||||||
|
if (!open && visibleRef.current) {
|
||||||
onClose && onClose()
|
onClose && onClose()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setVisible(open)
|
||||||
|
setBodyHidden(open)
|
||||||
}, [open])
|
}, [open])
|
||||||
|
|
||||||
const closeFromBackdrop = () => {
|
const closeFromBackdrop = () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user