【问题标题】:ReactJS ReactCSSTransitionGroup only animating on initial loadReactJS ReactCSSTransitionGroup 仅在初始加载时动画
【发布时间】:2017-03-13 15:23:17
【问题描述】:

我正在尝试在我的 React / Redux 应用程序中设置路由更改的动画转换。我一直在使用 SO 上的示例和官方教程作为指南,但到目前为止只能使淡入效果在第一次加载时起作用。更改路线时,组件显示时没有任何动画进出。

我是否遗漏了一些明显的东西 - 这是尝试为内容输入/输出动画时遵循的最佳路径吗?

/*
**  Loop through ACF components to layout page
*/

blocks = () => {
 if (this.props.pages.pages[0]) {
  return this.props.pages.pages[0].acf.components &&
    this.props.pages.pages[0].acf.components.map((block, index) => {
      let Component = componentMapping[block.acf_fc_layout];
      return <Component key={index} data={block} id={index} />;
    });
  }
};

/*
**  Render page on state change
*/

render() {
 return (
  <div className="App">
    <NavContainer />
    <ReactCSSTransitionGroup
      transitionName="example"
      transitionAppear={true}
      transitionAppearTimeout={500}
      transitionEnterTimeout={500}
      transitionLeaveTimeout={300}
    >
      {this.blocks()}
    </ReactCSSTransitionGroup>
  </div>
 );
}

我包含的css如下:

.example-enter {
 opacity: 0.01;
}

.example-enter.example-enter-active {
 opacity: 1;
 transition: opacity 500ms ease-in;
}

.example-leave {
 opacity: 1;
}
.example-appear {
 opacity: 0.01;
}

.example-appear.example-appear-active {
 opacity: 1;
 transition: opacity .5s ease-in;
}
.example-leave.example-leave-active {
 opacity: 0.01;
 transition: opacity 300ms ease-in;
}

感谢任何人提供的任何帮助。提前致谢!

【问题讨论】:

  • 仅凭您提供的代码很难判断。我想你已经包含了所有必要的 CSS 来“淡出”和“淡入”?
  • 抱歉!上面添加的css
  • 这可能是因为您在&lt;ReactCSSTransitionGroup/&gt; 中使用了一个函数调用... 只使用blocks = this.props.pages.pages[0].acf.components.map((block, index) =&gt; {...} 尝试一下,看看您是否有运气
  • 感谢您的建议,不幸的是,我在没有函数调用的情况下进行了测试,结果相同。

标签: javascript reactjs animation redux


【解决方案1】:

让我们通过一些故障排除步骤来深入了解这一点,但首先,让我给你一些关于 ReactCSSTransitionGroup 组件如何工作的基本提示。

&lt;ReactCSSTransitionGroup/&gt; 需要出现在页面上,并在装载后添加和删除它的子级。例如您有一个基于输入框过滤的员工列表。由于过滤器控制添加和删除的内容,这些项目来来去去并被动画化。 &lt;ReactCSSTransitionGroup/&gt; 必须首先存在并且必须安装组件。

使用 React Router,您可以在更改路由时安装和卸载组件。如果&lt;ReactCSSTransitionGroup/&gt; 位于每个正在安装和卸载的组件内,则转换不会触发。我想这就是你正在经历的。我建议您试试这个NPM package 来帮助您处理路线变化的动画。

动画只触发一次的问题是与上述不同的问题。我担心这部分:

return this.props.pages.pages[0].acf.components &&
    this.props.pages.pages[0].acf.components.map((block, index) => {
        let Component = componentMapping[block.acf_fc_layout];
        return <Component key={index} data={block} id={index} />;
    });

使用 && 运算符返回一个变量会给你带来有趣的结果。尝试做一些明确的if 语句。或者老实说,只需将您的代码更改为:

if (this.props.pages.pages[0]) {
    return this.props.pages.pages[0].acf.components.map((block, index) => {
        let Component = componentMapping[block.acf_fc_layout];
        return <Component key={index} data={block} id={index} />;
    });
}

我的另一个想法是看看当您省略该组件创建 (componentMapping[block.afc_fc_layout]) 并返回 &lt;div&gt; 时会发生什么。看看会发生什么,看看是不是给你带来了麻烦。

【讨论】:

  • 感谢您的详尽回复!经过更多测试,我发现只有当组件数量不同时才会出现动画 - 例如,如果页面上有 3 个组件,然后路由更改并且有两个,则只有最后一个组件淡出。当下一条路由中有更多组件时也会发生同样的情况,因此具有 2 个组件的页面仅在转到具有 4 个组件的页面时才为最后两个设置动画。我删除了返回的 && 部分,我将查看 npm 包你推荐的。谢谢。
  • 太棒了!请务必让我知道这些建议是否有效!祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 2013-12-10
  • 2018-08-07
  • 1970-01-01
相关资源
最近更新 更多