Используя свойство css «transition: all», я добавляю динамический класс: ( ), но моя анимация не работает

#reactjs

#reactjs

Вопрос:

Я пытаюсь создать Modal компонент. Я бы хотел, чтобы при появлении модального элемента он появлялся с переходом точно так же, как когда он исчезает. В настоящее время это очень сложно, почему и как я могу это исправить?

Я бы хотел, чтобы при отображении модала он отображался с анимацией и тем же поведением, когда модал исчезает (нажмите на button него).

большое вам спасибо за помощь, я знаю, что многому научусь.

 //content of styles.css
.modal {
  position: absolute;
  width: 100%;
  height: 100%;
  background: red;
  transition: all 300ms ease-out;
  transform: translateY(100%);
}

.show {
  transform: translateY(0%);
}

.hide {
  transform: translateY(100%);
}

app.js

import Modal from "./modal";
/*
const Modal = ({ show, children }) => {
 return <div className={`modal ${show ? "show" : "hide"}`}>. 
 {children} </div>;
};
export default Modal;
*/
import ModalContent from "./modalContent";
/*
  const ModalContent = ({ show }) => {
   const showModal = () => {
    show();
   };
  return <button onClick={showModal}> close modal</button>;
};
export default ModalContent;
*/
export default function App() {
 const [show, setShow] = useState(false);
 const closeModal = () => {
  setShow(false);
};

useEffect(() => setShow(true), []);

return (
  <div className="App">
    {show amp;amp; (
      <Modal show={show}>
        <ModalContent show={closeModal} />
      </Modal>
    )}
  </div>
 );
}
 

Я обновил свой код:

это мой живой код

Комментарии:

1. Изменение реквизитов компонента React приводит к его повторной визуализации, т. Е. Удалению старого поддерева DOM и добавлению нового с новыми атрибутами и т. Д. Вот почему старый <div class="modal show"> и новый <div class="modal hide"> — это разные элементы DOM, поэтому CSS transitions может обрабатывать не изменение свойства CSS одного и того же элемента

2. @IlyaStreltsyn что я могу сделать? спасибо, крэк!

Ответ №1:

Прежде всего, в вашей демонстрации модальный исчезает сразу, без какого-либо перехода. Кажется, что это вызвано повторным рендерингом всего компонента приложения при show изменении состояния. Извлечение Modal компонента из приложения делает свое дело для меня:

 const Modal = ({ show, children }) => {
  useEffect(() => {}, [show]);
  return <div className={`modal ${show ? "show" : "hide"}`}>{children} </div>;
};

export default function App() {
 

Второй момент — вы не можете управлять начальной настройкой только с помощью css transition. Переход появляется, когда что-то (класс, атрибут, псевдокласс) изменяется в данном элементе. Чтобы обойти это и иметь плавный модальный внешний вид, вы можете настроить одноразовый useEffect в компоненте приложения, который изменит show состояние с false на true . Мой общий фрагмент:

 const Modal = ({ show, children }) => {
    return <div className={`modal ${show ? "show" : "hide"}`}>{children}        </div>;
};

export default function App() {

const ModalContent = ({ show }) => {
  const showModal = () => {
    show();
  };
  return <button onClick={showModal}> close modal</button>;
};

const [show, setShow] = useState(false);
const closeModal = () => {
  setShow(false);
};

useEffect(() => setShow(true), [])

return (
  <div className="App">
    <Modal show={show}>
      <ModalContent show={closeModal} />
    </Modal>
  </div>
);
}
 

Комментарии:

1. ты молодец, я кое-что узнал. Послушайте, я слушал вас, но у меня есть сомнения в этом сценарии: {show amp;amp; (Modal.... мой модальный отображается без перехода, как я могу исправить это, чтобы иметь анимацию. Я обновил свой код: codesandbox.io/s/wonderful-wing-6m5uu

2.Ваш код работает просто отлично. Пожалуйста, удалите этот фрагмент из modal.js setShow((fdas) => { console.log(fdas); }); , и модальный появится с переходом, а также исчезнет.

3. При обновлении DOM или изменении части представления вы должны использовать useLayoutEffect для плавных переходов, это будет ждать загрузки DOM, а затем запускает события.