#javascript #reactjs #animation #framer-motion
#javascript #reactjs #Анимация #фреймер-движение
Вопрос:
Ситуация
Я создал модальный компонент React, используя порталы React (см. Документы выше). Перед отключением компонента при нажатии кнопки закрытия я хочу запустить exit
анимацию с движением фреймера, используя AnimatePresence. К сожалению, я не могу заставить это работать и нуждаюсь в помощи.
Ссылки
Что я пробовал
Я добавил
exit={{ opacity: 0 }}
дочерний элемент<RenderModal/>
. Ввод анимации с использованиемinitial
иanimate
работал так, как ожидалось.
- Оберните
<AnimatePresence>
вокруг модального корневого элемента
<div id="root"></div>
<AnimatePresence>
<div id="modal-root"></div>
</AnimatePresence>
- Перенос как дочерний элемент модального корня
Ошибка: целевому контейнеру требуется элемент DOM
<div id="modal-root">
<AnimatePresence></AnimatePresence>
</div>
- Оберните вокруг элемента component
const Modal = ({
title,
footer,
children,
}) => {
<AnimatePresence>
{isVisible
amp;amp; (
<RenderModal
title={title}
footer={footer}
hide={hide}
>
{children}
</RenderModal>
)}
</AnimatePresence>
};
- Оберните вокруг используемого компонента
return (
<>
<Button onClick={show}>Open Modal</Button>
<AnimatePresence>
<Modal {...args}></Modal>
</AnimatePresence>
<p>Lorem ipsum dolor sit amet...</p>
</>
);
Ответ №1:
Привет, я думаю, может быть поздно. но я решаю с помощью этого кода
import { ReactNode } from "react";
import ReactDOM from "react-dom";
import { AnimatePresence } from "framer-motion";
interface ModalWrapperProps {
children: ReactNode;
isShowing: boolean;
}
const ModalWrapper = ({ children, isShowing }: ModalWrapperProps) =>
ReactDOM.createPortal(
<AnimatePresence exitBeforeEnter>
{isShowing amp;amp; children}
</AnimatePresence>,
document.body
);
export default ModalWrapper;
Я вдохновил нижеприведенный пост
https://blog.logrocket.com/implementing-animated-toasts-in-react/
Ответ №2:
Вы не забыли включить key
реквизит для условно отображаемого элемента? Я не вижу этого в ваших фрагментах кода.
Из документов:
У каждого дочернего компонента motion должен быть уникальный ключ prop, чтобы AnimatePresence мог отслеживать их присутствие в дереве.