Переход CSS из React Transition Group не работает, и я не могу понять, почему

У меня есть приложение, в котором я пытаюсь вывести меню с левой стороны. Я могу заставить его просто появляться при нажатии кнопки меню. Однако я использую CSSTransition из React Transition Group для создания эффекта слайда, но это не сработает. Когда я нажимаю кнопку меню, меню появляется немедленно (без задержки), но когда я снова нажимаю кнопку меню, меню исчезает после тайм-аута (задержка 500 мс). Однако нет перехода ни для открытия, ни для закрытия меню. Я не уверен, почему задержка происходит только при закрытии меню. Я попытался посмотреть, что произойдет, если я избавлюсь от «unmountOnExit» в CSSTransition, но это просто заставило меню постоянно появляться без каких-либо изменений после нажатия кнопки.

Вот как выглядит мой код:

import './App.css';

import React, { useState } from 'react';
import { CSSTransition } from 'react-transition-group';

function App() {

   const [open, setOpen] = useState(false);

   function toggleOpen() {
        setOpen(!open);
    }

      return (
          <NavBar toggleOpen = {toggleOpen} open = {open}></NavBar>
      )
}

function NavBar(props) {

  function DropdownMenu() {
    return (
      <div className = "DropdownMenu">
      </div>  
    )
  }

    return (
      <div className = "NavBar">
        <div className = "Menu-button" onClick = {props.toggleOpen}>
          <div></div>
          <div></div>
          <div></div>
        </div>
        <CSSTransition
          in = {props.open}
          timeout = {500}
          className = "Menu-open"
          unmountOnExit>
          <DropdownMenu/>
        </CSSTransition>
      </div>
    )  
}            

export default App;

Код CSS следующий:

.NavBar {
  position: fixed;
  display: flex;
  justify-content: flex-end;
  align-items: center;
  top: 0;
  width: 100%;
  height: 60px;
  background-color: gray;
  border-bottom: solid black 1px;
}

.Menu-button {
  background-color: transparent;
  padding-top: 0.5rem;
  cursor: pointer;
  margin: 20px;
  padding: 0;
}

.Menu-button div {
  width: 35px;
  height: 5px;
  background-color: #fff;
  margin: 6px 0;
  transition: 0.4s;
}

.DropdownMenu {
  position: fixed;
  top: 58px;
  right: 5px;
  width: 34%;
  height: 500px;
  border-radius: 5px;
  background-color: lightgray;
}

.menu-open-enter {
  position: absolute;
  transform: translateX(-110%);
}
.menu-open-enter-active {
  transform: translateX(0%);
  transition: all 500ms ease;
}
.menu-open-exit {
  position: absolute;
}
.menu-open-exit-active {
  transform: translateX(-110%);
  transition: all 500ms ease;
}

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

motto 02.04.2023 23:30

@motto: Вы правы, в этом коде были ошибки. Мое приложение намного сложнее, поэтому я пытался скопировать только ту проблему, которая у меня была, но я поторопился с ней. Я отредактировал пост, и теперь он должен работать без проблем.

Bruno Oliveira 03.04.2023 02:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь есть пара вопросов:

Согласно документам группы реагирования, компонент CSSTransition принимает свойство classNames — не путать с реквизитом className, используемым для передачи стилей CSS непосредственно в элементы HTML.

В качестве отдельной проблемы вы предоставляете имя класса Menu-open, которое react-transition-group будет суффиксом, чтобы сделать Menu-open-enter, Menu-open-exit и т. д. Идентификаторы CSS чувствительны к регистру, поэтому это не будет соответствовать вашим объявлениям стиля .menu-open-enter, .menu-open-exit ....

Изменение этой строки на classNames = "menu-open" приводит к тому, что анимация начинает работать, хотя скольжение между центром страницы и правым краем выглядит немного странно. Я подозреваю, что вы хотите использовать transform: translateX(110%), а не -110%.

Песочница

Большое спасибо! В моем исходном приложении объявления стиля соответствуют className, но большая проблема заключалась в том, что я пропустил букву «s» в конце. Я потратил часы, пытаясь понять это, и оказалось, что это единственное, чего мне не хватало. Я ценю вашу помощь! И да, это должно было быть 110%, а не -110%.

Bruno Oliveira 03.04.2023 16:43

Другие вопросы по теме