Анимация при размонтировании с помощью React и react-transition-group

Я работаю с React, и я пытаюсь создать компонент Fade с React-transition-group для постепенного появления и исчезновения элемента в зависимости от условия, хранящегося в состоянии: http://reactcommunity.org/react-transition-group/css-transition/

Вот что у меня сейчас:

import React from "react";
import ReactDOM from "react-dom";
import { CSSTransition } from "react-transition-group";

import "./styles.css";

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      mounted: false
    };
  }
  componentDidMount() {
    setTimeout(() => {
      this.setState({
        mounted: true
      });
    }, 10);
  }
  render() {
    return (
      <div className = "root">
        <CSSTransition
          in = {this.state.mounted}
          appear = {true}
          unmountOnExit
          classNames = "fade"
          timeout = {1000}
        >
          {this.state.mounted ? (
            <div>
              <button
                onClick = {() => {
                  this.setState({
                    mounted: !this.state.mounted
                  });
                }}
              >
                Remove
              </button>
              <div>COMPONENT</div>
            </div>
          ) : (
            <div />
          )}
        </CSSTransition>
      </div>
    );
  }
}

Вот CSS

.fade-enter {
    opacity: 0;
    transition: opacity .5s ease;
}

.fade-enter-active {
    opacity: 1;
    transition: opacity .5s ease;
}

.fade-exit {
    opacity: 1;
    transition: opacity .5s ease;
}

.fade-exit-active {
    opacity: 0;
    transition: opacity .5s ease;
}

Когда компонент установлен, непрозрачность изменяется от 0 до 1 с 0,5 с. Но когда он размонтирован, он не анимируется: компонент исчезает без перехода.

Я сделал песочницу с этим компонентом, чтобы проверить это: https://codesandbox.io/s/k027m33y23 Я уверен, что это частый случай, но я не могу найти способ оживить компонент при размонтировании. Если у кого-то есть идеи, мы будем очень рады!

-- РЕДАКТИРОВАТЬ -- Как сказал @IPutuYogaPermana, условный рендеринг внутри CSSTransition не требуется. Итак, это:

{this.state.mounted ? (
<div>
    <button
    onClick = {() => {
        this.setState({
        mounted: !this.state.mounted
        });
    }}
    >
    Remove
    </button>
    <div>COMPONENT</div>
</div>
) : (
<div />
)}

Должно быть так:

<div>
    <button
    onClick = {() => {
        this.setState({
        mounted: !this.state.mounted
        });
    }}
    >
    Remove
    </button>
    <div>COMPONENT</div>
</div>

Компонент будет автоматически монтироваться или размонтироваться в зависимости от атрибута in в компоненте CSSTransition. Вот последний код в кодовой ячейке: https://codesandbox.io/s/62m86nm7qw

Поведение ключевого слова "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) для оценки ваших знаний,...
4
0
11 031
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Это ожидаемо, потому что при изменении состояния анимация еще не запущена, а дочерние элементы уже ушли.

Так что это похоже на волшебное мгновенное исчезновение. Нам просто нужно это скрыть, верно? удалить условный рендер.

Я проверил, узел удаляется автоматически после завершения анимации. Так что нет необходимости использовать условный рендеринг. К счастью! Код становится:

import React from "react";
import ReactDOM from "react-dom";
import { CSSTransition } from "react-transition-group";

import "./styles.css";

class Example extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      logoIntro: true,
      mounted: false
    };
  }
  componentDidMount() {
    this.setState({
      mounted: true
    });
  }
  render() {
    return (
      <div className = "root">
        <CSSTransition
          in = {this.state.mounted}
          appear = {true}
          unmountOnExit
          classNames = "fade"
          timeout = {1000}
        >
          <div>
            <button
              onClick = {() => {
                this.setState({
                  mounted: !this.state.mounted
                });
              }}
            >
              Remove
            </button>
            <div>SOME COMPONENT</div>
          </div>
        </CSSTransition>
      </div>
    );
  }
}

ReactDOM.render(<Example />, document.getElementById("root"));

Спасибо @IPutuYogaPermana. Вы имеете в виду, что "react-transition-group" не заботится об этом случае, и я должен реализовать это сам? Странно, ведь это очень частый случай, правда?

user9870937 09.08.2018 17:52

ну, на самом деле проблема в том, что дочерний узел удален, даже до анимация началась. Нужен лучший способ обхода.

I Putu Yoga Permana 09.08.2018 17:54

Хорошо, я понял. Но тогда, помимо этого решения, что было бы наиболее распространенным способом затухания анимации непосредственно перед размонтированием?

user9870937 09.08.2018 17:56

Я обновляю свой ответ, я просто понимаю, проблема в том, что дочерний узел имеет условную визуализацию. Просто удалите условный рендер. Поэтому, когда анимация завершена, дети автоматически удаляются.

I Putu Yoga Permana 09.08.2018 18:04

Ааааааааааааааааааааааааааауд всего в CSSTransition! Нет необходимости в условном рендеринге… хорошо! Кстати, даже когда ваш код работает в CodeSandbox, он не работает во фрагменте; Не знаю, должно ли там работать ...

user9870937 09.08.2018 18:34

Я не знаком с тем, как фрагменты SO. Только чтобы показать пример кода. Пожалуйста, отметьте это как принятый ответ, если это решит вашу проблему;) @AdCorrea

I Putu Yoga Permana 09.08.2018 18:43

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