Реакция JS: Как анимировать условно визуализированные компоненты? - PullRequest
2 голосов
/ 25 апреля 2020

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

Для этого я сохранил две локальные переменные состояния: render и fadeIn, которые вычисляются на основе show реквизита, переданного компоненту Example .

То, что я сделал, это:

  • Когда show поддержать его true , я устанавливаю render как true , поэтому div визуализируется условно и по истечении времени ожидания 10ms I установите fadeIn как true , что установит CSS имя класса для моего div как show.
  • Когда show prop it false , я установил fadeIn как false , который установит CSS имя класса для моего div как hide и после тайм-аута 200ms (время перехода в CSS) я установлю render как false , поэтому div условно скрыт.

Код:

interface Props {
  show: boolean;
}

const Example: React.FC<Props> = ({ show, }) => {
  const [render, setRender] = useState(false);
  const [fadeIn, setFadeIn] = useState(false);

  useEffect(() => {
    if (show) {
      // render component conditionally
      setRender(show);

      // change state to for conditional CSS classname which will
      // animate opacity, I had to give a timeout of 10ms else the
      // component shows up abruptly
      setTimeout(() => {
        setFadeIn(show);
      }, 10);
    } else {
      // change state to change component classname for opacity animation
      setFadeIn(false);

      // hide component conditionally after 200 ms
      // because that's the transition time in CSS
      setTimeout(() => {
        setRender(false);
      }, 200);
    }
  }, [
    show,
  ]);

  return (
    <div>
      {render && (
        <div className={`container ${fadeIn ? 'show' : 'hide'}`} />
      )}
    </div>
  );
};

Таблица стилей:

.container {
  width: 100px;
  height: 100px;
  background-color: black;
  transition: opacity 0.2s ease;
}

.show {
  opacity: 1;
}

.hide {
  opacity: 0;
}

Я считаю, что это не очень хорошая практика кодирования для AC достичь функциональности и должен поддерживать только одно локальное состояние в моем компоненте. Мне нужны ваши предложения о том, как я могу решить эту проблему лучшим способом без использования сторонней библиотеки . Спасибо:)

1 Ответ

1 голос
/ 25 апреля 2020
const [render, setRender] = useState(false);

useEffect(() => {
   if(show) {
     setTimeout(() => {
       setRender(true);
     }, 2000);
   } else {
     setRender(false);
   }
}, [show]);

<div className={cs(s.render, render ? 'show' : undefined)}>
  <p>{content}</p>
</div>

Css:

.render {
  ...,
  visibility: hidden;
  opacity: 0;
  transition: all 0.6s ease;
}

.show {
  visibility: visible;
  opacity: 1;
}

Надеюсь, будет полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...