【问题标题】:ReactJS - Fade between 2 different componentsReactJS - 在 2 个不同的组件之间淡入淡出
【发布时间】:2020-09-13 20:28:23
【问题描述】:

我试图弄清楚如何在 2 个不同的组件之间通过一个简单的 1 秒过渡来淡入淡出。我玩过 SwitchTransition 和 CSSTransition 和 TransitionGroup ,但似乎没有什么适合我。看起来 SwitchTransition 是我正在寻找的东西,但我能找到的唯一示例只是换出文本而不是整个组件。

所以这是我的两个组件的代码,它们根据状态变量有条件地显示。每个组件都有一个用于交换状态变量值的按钮,因此它当前会在两者之间交换,但看起来并不漂亮。

<div className="login col-md-6 mt-5 mx-auto">
  {showLogin && (
    <LoginForm
      onLoginSubmit={onLoginSubmit}
      email={email}
      setEmail={setEmail}
      password={password}
      setPassword={setPassword}
      showPasswordReset={showPasswordReset}
    />
  )}
  {showForgotPassword && (
    <ForgotPasswordForm
      onPasswordResetSubmit={onPasswordResetSubmit}
      setShowForgotPassword={setShowForgotPassword}
    />
  )}
</div>

【问题讨论】:

  • 你也可以分享过渡的 CSS 吗?
  • 这是我正在努力解决的部分问题。我的意思是我可以在两个 div 中添加类似 transition: all 1s ease-in; 的内容,但这似乎对我不起作用。

标签: reactjs css-transitions transition


【解决方案1】:

您可以首先使用 react-spring 为您的组件设置动画

import { animated, useTransition } from "react-spring";

然后在你的组件中

const [showLogin, set] = useState(false);

const toggle = () => {
    set(!showLogin);
};

const transitions = useTransition(showLogin, null, {
        from: { position: "absolute", opacity: 0 },
        enter: { opacity: 1 },
        leave: { opacity: 0 }
      });

然后您将渲染您的组件,确保将div 替换为animated.div

<div className="login col-md-6 mt-5 mx-auto">
    {transitions.map(({ item, key, props }) =>
        item ? (
            <LoginForm //animated.div
                onLoginSubmit={onLoginSubmit}
                email={email}
                setEmail={setEmail}
                password={password}
                setPassword={setPassword}
                showPasswordReset={showPasswordReset}
            />
        ) : (
            <ForgotPasswordForm //animated.div
                onPasswordResetSubmit={onPasswordResetSubmit}
                setShowForgotPassword={toggle}
            />
        )
    )}
</div>

我做了一个简单的例子,大家可以看看here

【讨论】:

  • 如何增加淡入淡出时间?
  • 没关系,从谷歌上想出来的。 const transitions = useTransition(show, null, { from: { position: "absolute", opacity: 0 }, enter: { opacity: 1 }, leave: { opacity: 0 }, config: { duration: 1000 } });非常感谢!
  • 将配置添加到过渡 const transitions = useTransition(showLogin, null, { from: { position: "absolute", opacity: 0 }, enter: { opacity: 1 }, leave: { opacity: 0 }, config: { duration: 300 } // 这里可以修改时间 });
  • 还有一个问题,你知道有没有办法让它在页面加载时不淡入?
  • 将“initial”添加到“transitions”,它只会在第一次加载时覆盖“from”,因此页面加载时不会出现动画initial: { position: "absolute", opacity: 1 }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2013-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多