Анимация реакции: удвоенный элемент при изменении состояния

#animation #reactjs #reactcsstransitiongroup

#Анимация #reactjs #reactcsstransitiongroup

Вопрос:

Я создаю автоматическое слайд-шоу, в котором изображения переключаются каждые 5 секунд. Я использую ReactCSSTransitionGroup для создания метода fade in при поступлении нового изображения. Проблема в том, что когда новое изображение исчезает, старое изображение все еще присутствует, и оба изображения отображаются на экране, старое изображение не исчезнет, пока новое изображение не появится полностью. Как мне это исправить?

Это мой слайд-компонент для отображения изображения:

 import React from 'react';    
const Slide = ({picture}) => {
  if(!picture){
    return <div>Loading...</div>;
  }    
  return (
      <div className='row'>
        <img src={picture.url} alt={picture.title} />
      </div>
  );
};    
export default Slide;
  

Это часть родительского компонента, где я называю этот слайд компонентом

   <ReactCSSTransitionGroup {...transitionOptions}>
    <Slide key={this.props.active} picture={this.props.active}/>
  </ReactCSSTransitionGroup>
  

Это делается в методе render() родительского элемента для установки параметров перехода

 const transitionOptions = {
  transitionName: "fade",
  transitionEnterTimeout: 500,
  transitionLeaveTimeout: 500
}
  

И это стиль

 .fade-enter{
  opacity: 0;
}
.fade-enter-active{
  opacity: 1;
  transition: 0.5s ease-in all;
}
  

В принципе, в родительском компоненте у меня есть метод setInterval, который изменяет активное изображение каждые 5 секунд. Итак, как мне заставить старое изображение исчезнуть в тот момент, когда новое начинает исчезать, чтобы оно не изменило мою страницу?
Спасибо

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

1. Этот ключ может быть проблемой. Зачем вам там нужен ключ?

2. Без ключа в коде, который я написал, не было бы никакой анимации. Я думаю, что react ищет что-то уникальное, чтобы знать, какой элемент он анимирует. И я где-то видел видео, если у вас есть 2 точных элемента, это может анимировать неправильный

Ответ №1:

Удалите анимацию выхода, установив для transitionLeave свойства значение false , и удалите transitionLeaveTimeout свойство полностью. Вы настроили ReactCSSTransitionGroup анимацию на enter и leave с таймером 500 мс.

На мой взгляд, переход был бы приятнее, если бы выход Slide затухал, а вход Slide затухал. Для этого эффекта вам понадобятся оба Slide элемента, чтобы они располагались друг над другом посредством абсолютного позиционирования. Вот пример этого: http://codepen.io/yeahjohnnn/pen/rrobvR

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

1. это работает! Спасибо. Но есть момент, когда экран мерцает, как мне сделать его плавным?

2. Можете ли вы поделиться своим кодом? Мерцание может быть вызвано рядом причин. Я подозреваю, что, вероятно, воспринимаемое мерцание изображения немедленно исчезает, в то время как следующее изображение начинает исчезать. Посмотрите на этот пример, где я заставил слайды исчезать при выходе и исчезать при входе, без мерцания: codepen.io/yeahjohnnn/pen/rrobvR . Или, если вы используете изображения, возможно, мерцание связано с загрузкой изображения, но я сомневаюсь в этом (вы могли бы предварительно загрузить изображения и кэшировать их, если это так).

3. Я обнаружил проблему с мерцанием. Итак, когда происходит переключение изображения, изображение все еще загружалось, поэтому была доля секунды, когда оно ничего не показывало. Это приводит к тому, что div, который у меня есть, сворачивается. Что я сделал, так это установил родительский div с нужными мне шириной и высотой вместо дочернего div, который содержит изображение. Таким образом, когда он все еще загружается, сторона пустого div остается той же, и это остановило изменение размера страницы. И спасибо за ваш пример в code pen. Я попытаюсь использовать это в качестве ориентира, чтобы мои появлялись и исчезали, а не только появлялись.