fix: 修复的问题: │ │

│ │ -  React 18 Portal insertBefore 错误                                                                                                                               │ │
│ │ -  Ant Design Modal defaultProps 废弃警告
This commit is contained in:
zdl
2025-11-21 17:46:07 +08:00
parent 39978c57d5
commit bc50d9fe3e

View File

@@ -1,13 +1,7 @@
// src/components/Auth/AuthModalManager.js // src/components/Auth/AuthModalManager.js
import React, { useEffect, useRef } from 'react'; import React, { useEffect, useRef } from 'react';
import { import { Modal } from 'antd';
Modal, import { useBreakpointValue } from '@chakra-ui/react';
ModalOverlay,
ModalContent,
ModalBody,
ModalCloseButton,
useBreakpointValue
} from '@chakra-ui/react';
import { useAuthModal } from '../../hooks/useAuthModal'; import { useAuthModal } from '../../hooks/useAuthModal';
import AuthFormContent from './AuthFormContent'; import AuthFormContent from './AuthFormContent';
import { trackEventAsync } from '@lib/posthog'; import { trackEventAsync } from '@lib/posthog';
@@ -44,85 +38,43 @@ export default function AuthModalManager() {
} }
}, [isAuthModalOpen]); }, [isAuthModalOpen]);
// 响应式尺寸配置 // 响应式宽度配置Ant Design Modal 使用数字或字符串)
const modalSize = useBreakpointValue({ const modalMaxW = useBreakpointValue(
base: "md", // 移动端md不占满全屏 {
sm: "md", // 小屏md
md: "lg", // 中屏lg
lg: "xl" // 大屏xl更紧凑
});
// 响应式宽度配置
const modalMaxW = useBreakpointValue({
base: "90%", // 移动端屏幕宽度的90% base: "90%", // 移动端屏幕宽度的90%
sm: "90%", // 小屏90% sm: "90%", // 小屏90%
md: "700px", // 中屏固定700px md: "700px", // 中屏固定700px
lg: "700px" // 大屏固定700px lg: "700px" // 大屏固定700px
}); },
{ fallback: "700px", ssr: false }
// 响应式水平边距 );
const modalMx = useBreakpointValue({
base: 4, // 移动端左右各16px边距
md: "auto" // 桌面端:自动居中
});
// 响应式垂直边距
const modalMy = useBreakpointValue({
base: 8, // 移动端上下各32px边距
md: 8 // 桌面端上下各32px边距
});
// 条件渲染:只在打开时才渲染 Modal避免创建不必要的 Portal
if (!isAuthModalOpen) {
return null;
}
// ✅ 使用 Ant Design Modal完全避开 Chakra UI Portal 的 AnimatePresence 问题
// Ant Design Modal 不使用 Framer Motion不会有 React 18 并发渲染的 insertBefore 错误
return ( return (
<Modal <Modal
isOpen={isAuthModalOpen} open={isAuthModalOpen}
onClose={closeModal} onCancel={closeModal}
size={modalSize} footer={null}
isCentered width={modalMaxW}
closeOnOverlayClick={false} // 防止误点击背景关闭 centered
closeOnEsc={true} // 允许ESC键关闭 destroyOnHidden={true}
scrollBehavior="inside" // 内容滚动 maskClosable={false}
zIndex={999} // 低于导航栏(1000),不覆盖导航 keyboard={true}
zIndex={999}
styles={{
body: {
padding: '24px',
maxHeight: 'calc(90vh - 120px)',
overflowY: 'auto'
},
mask: {
backdropFilter: 'blur(10px)',
backgroundColor: 'rgba(0, 0, 0, 0.7)'
}
}}
> >
{/* 半透明背景 + 模糊效果 */}
<ModalOverlay
bg="blackAlpha.700"
backdropFilter="blur(10px)"
/>
{/* 弹窗内容容器 */}
<ModalContent
bg="white"
boxShadow="2xl"
borderRadius="2xl"
maxW={modalMaxW}
mx={modalMx}
my={modalMy}
position="relative"
>
{/* 关闭按钮 */}
<ModalCloseButton
position="absolute"
right={4}
top={4}
zIndex={9999}
color="gray.500"
bg="transparent"
_hover={{ bg: "gray.100" }}
borderRadius="full"
size="lg"
onClick={closeModal}
/>
{/* 弹窗主体内容 */}
<ModalBody p={6}>
<AuthFormContent /> <AuthFormContent />
</ModalBody>
</ModalContent>
</Modal> </Modal>
); );
} }