React JS:如何为条件渲染的组件设置动画?

Vin*_*rma 8 css css-transitions reactjs conditional-rendering react-hooks

示例是一个功能组件,我在其中有条件地渲染div。我希望它div在有条件渲染时淡入,反之亦然淡出。

为此,我维护了两个本地状态变量:renderfadeIn,它们是根据show传递给示例组件的 prop 计算的。

我所做的是:

  • showprop it true时,我设置rendertrue,因此div有条件地渲染,并且在超时后10ms我设置fadeIntrue,这会将我的 div 的 CSS 类名设置为show
  • showprop it false时,我设置fadeInfalse,这会将我的 div 的 CSS 类名设置为hide超时200ms(CSS 中的过渡时间)后,我将其设置renderfalse,以便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>
  );
};
Run Code Online (Sandbox Code Playgroud)

样式表:

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

.show {
  opacity: 1;
}

.hide {
  opacity: 0;
}

Run Code Online (Sandbox Code Playgroud)

我认为这不是实现该功能的良好编码实践,并且应该在我的组件中仅维护一个本地状态。我需要您关于如何在不使用任何第三方库的情况下以更好的方式解决此问题的建议。谢谢 :)

Fat*_*ani 4

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>
Run Code Online (Sandbox Code Playgroud)

CSS:

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

.show {
  visibility: visible;
  opacity: 1;
}
Run Code Online (Sandbox Code Playgroud)

希望有帮助。

  • 实际上,它不是条件渲染,而是条件可见性 (20认同)
  • 参考这个问题:/sf/ask/2804497461/ (2认同)