【问题标题】:React JS: How to animate conditionally rendered components?React JS:如何为有条件渲染的组件设置动画?
【发布时间】:2020-08-09 05:48:14
【问题描述】:

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

为此,我维护了两个局部状态变量:renderfadeIn,它们是根据传递给 Example 组件的 show 属性计算得出的。

我所做的是:

  • show 支持它true 时,我将render 设置为true,因此div 有条件地呈现,并且在10ms 超时后我设置fadeIn as true 这会将我的 div 的 CSS 类名设置为 show
  • show支持它false时,我将fadeIn设置为false,这会将我的div的CSS类名设置为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;
}

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

【问题讨论】:

  • 你应该去看看 React Transition Group。它基本上解决了你试图用一个非常干净的 API 做的事情。 reactcommunity.org/react-transition-group
  • @StephanOlsen 谢谢,但我不想集成任何第三方库。

标签: css reactjs react-hooks css-transitions conditional-rendering


【解决方案1】:
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;
}

希望对您有所帮助。

【讨论】:

  • 嗨,你能详细说明一下吗,我很难理解&lt;div className={cs(s.render, render ? 'show' : undefined)}&gt;中的cs
  • cs 代表 npm 中的类名包,它是一个有条件地将类名连接在一起的实用程序 ** import cs from 'classnames'; **
  • 在您的示例中,您只需全局添加类,样式也将适用。但是使用这个包,您可以在组件的 css 或 sass 文件中设置样式,并且只影响该组件。
  • 其实不是条件渲染,是条件可见性
猜你喜欢
  • 2015-05-02
  • 2020-01-16
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2020-03-22
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多