如何使用React过渡组为每个项目使用不同的延迟



我使用TransitionGroupCSSTransition(具有淡出效果(来对一系列项目的条目进行动画化。我希望这些物品在它们之间出现略有延迟,而不是同时出现。请注意,延迟可以低于动画的持续时间。

使用我当前的代码,所有项目都同时逐渐淡入(如预期(。在我的渲染功能中,我有以下内容来对组件的输入和退出进行动画:

<TransitionGroup>
    items.map((item,index) => ( 
        <CSSTransition
            key={item.id}
            timeout={1000}
            classNames="fade"
                <ItemPreview item={item} />
         </CSSTransition>
    ))
</TransitionGroup>

和CSS:

.fade-enter{
    opacity: 0;
    visibility: hidden;
    transition: all ease 1s;
}
.fade-enter.fade-enter-active{
    opacity: 1;
    visibility: visible;
    transition: all ease 1s;
}
.fade-exit {
    visibility: visible;
    opacity: 0;
}
.fade-exit.fade-exit-active{
    opacity: 0;
    visibility: hidden;
    transition: all ease 1s;
}

我将如何为每个项目添加不同的延迟?

我通过以ItemPreview的样式添加transitionDelay并为每个项目动态更改超时,从而解决了我的问题。

棘手的部分是计算每个项目的实际延迟,尤其是在后来加载新项目时。我最终在还原器中的items中添加了isNew字段,该字段仅针对新加载的项目设置为true。这不是理想的选择,因为它仅用于动画更改我的数据。

render(){
    const { items } = this.props;
    let delay_index = -1;
    let delay_jump = 100;
    return (
        <TransitionGroup>
            items.map((item,index) => { 
                delay_index += offer.isNew ? 1 : 0;
                const delay = Math.max(0, delay_index*100);
                return (
                    <CSSTransition
                        key={item.id}
                        timeout={1000 + delay}
                        classNames="fade">
                            <ItemPreview
                                item={item} 
                                style={{transitionDelay: `${delay}ms`}} />             
                    </CSSTransition>
                )
            })
        </TransitionGroup>
    )
}

我可能为时已晚,但是我在进入动画方面面临同样的问题,我的解决方案可能对别人有用。

我正在使用<Transition>,并且我使用SCSS中的for循环解决了:

.fade {
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.5s ease-in, visibility 0.5s;
    // adjust for loop to total number of elements
    @for $i from 1 through 5 {
      &:nth-child(#{$i}n) {
        transition-delay: #{$i * 0.25}s;
      }
    }
    &.entering,
    &.entered {
      opacity: 1;
      visibility: visible;
    }
  }

相关内容

  • 没有找到相关文章

最新更新