Я пытаюсь сделать памятку Modal
, и у меня здесь проблема.
При изменении ввода мне не нужно повторно визуализировать Модальный компонент.
Например:
Modal.tsx
выглядит так:
import React from "react";
import { StyledModalContent, StyledModalWrapper, AbsoluteCenter } from "../../css";
interface ModalProps {
open: boolean;
onClose: () => void;
children: React.ReactNode
};
const ModalView: React.FC<ModalProps> = ({ open, onClose, children }) => {
console.log("modal rendered");
return (
<StyledModalWrapper style={{ textAlign: "center", display: open ? "block" : "none" }}>
<AbsoluteCenter>
<StyledModalContent>
<button
style={{
position: "absolute",
cursor: "pointer",
top: -10,
right: -10,
width: 40,
height: 40,
border: 'none',
boxShadow: '0 10px 10px 0 rgba(0, 0, 0, 0.07)',
backgroundColor: '#ffffff',
borderRadius: 20,
color: '#ba3c4d',
fontSize: 18
}}
onClick={onClose}
>
X
</button>
{open && children}
</StyledModalContent>
</AbsoluteCenter>
</StyledModalWrapper>
);
};
export default React.memo(ModalView);
Вот пример того, как я обертываю это.
import React from 'react'
import Modal from './modal;
const App: React.FC<any> = (props: any) => {
const [test, setTest] = React.useState("");
const [openCreateChannelDialog, setOpenCreateChannelDialog] = React.useState(false);
const hideCreateModalDialog = React.useCallback(() => {
setOpenCreateChannelDialog(false);
}, []);
return (
<>
<input type="text" value={test} onChange={(e) => setTest(e.target.value)} />
<button onClick={() => setOpenCreateChannelDialog(true)}>Create channel</button>
<Modal
open={openCreateChannelDialog}
onClose={hideCreateModalDialog}
children={<CreateChannel onClose={hideCreateModalDialog} />}
/>
</>
};
Я знаю, Modal
перерисовывается, потому что children
ссылка создается каждый раз, когда App
компонент перерисовывается (когда я изменяю текст ввода).
Знайте, мне интересно, если я оберну <CreateChannel onClose={hideCreateModalDialog} />
внутри React.useMemo () hook
Например:
const MemoizedCreateChannel = React.useMemo(() => {
return <CreateChannel onClose={hideCreateModalDialog} />
}, [hideCreateModalDialog]);
И поменять дочерние реквизиты внутри Modal
с:
children={<CreateChannel onClose={hideCreateModalDialog} />}
до
children={MemoizedCreateChannel}
Работает нормально, но я в безопасности? И это единственное решение, что я пытаюсь запомнить модал?