react-transition-group延迟执行:CSSTransition延后1秒启动求助
我明白你的需求了——你想让整个CSSTransition的入场/退场动画都延迟1秒再启动,而不是现在的立即触发,同时还要和GameQuestions组件内延迟1秒的setState动作同步,对吧?咱们来一步步解决这个问题。
问题根源分析
你当前的CSS里给transition属性加了延迟,但CSSTransition组件会立即添加动画类名(比如slide-enter和slide-enter-active),所以元素的初始状态(透明、缩小)会立刻生效,只是动画的过渡效果延迟了1秒。这和你想要的“整个动画1秒后才启动”的需求不符,咱们需要调整动画的触发时机。
解决方案:控制CSSTransition的挂载时机
最直接的方法是通过状态控制CSSTransition组件的渲染,延迟1秒后再挂载它,这样动画类名才会在1秒后添加,真正实现动画整体延迟启动。
步骤1:添加状态控制动画就绪状态
在你的组件state里新增一个状态,用来控制是否渲染CSSTransition:
constructor(props) { super(props); this.state = { answers: [], isTransitionReady: false // 控制动画是否就绪 }; }
步骤2:触发动画时添加1秒延迟
在需要切换问题/触发动画的方法里,先重置状态,再延迟1秒启用动画:
startQuestionTransition() { // 先重置状态,确保每次切换都能触发延迟 this.setState({ isTransitionReady: false }, () => { setTimeout(() => { this.setState({ isTransitionReady: true }); // 如果GameQuestions内的setState需要同步触发,也可以放在这里 // 比如调用组件内的相关方法启动延迟状态更新 }, 1000); }); }
步骤3:根据状态渲染CSSTransition
在render方法里,只有当isTransitionReady为true时,才渲染CSSTransition组件:
<TransitionGroup> {this.state.isTransitionReady && ( <CSSTransition key={uuidv4()} timeout={1300} classNames="slide"> <GameQuestions gameOption={this.props.option} answers={this.state.answers} questionName={this.answer.name} handleUserAnswer={this.handleUserAnswer} /> </CSSTransition> )} </TransitionGroup>
注意:这里的
timeout要设置为动画时长+过渡延迟(如果保留CSS延迟的话),现在我们去掉了CSS里的延迟,所以设置为300ms(入场动画时长)即可,我写1300是留了冗余空间,你可以根据实际调整。
步骤4:调整CSS移除多余延迟
因为我们已经通过挂载延迟了1秒,所以可以去掉CSS中transition的延迟参数,让动画在组件挂载后立即执行:
.slide-enter { opacity: 0; transform: scale(0.97); z-index: 1; } .slide-enter.slide-enter-active { opacity: 1; transform: scale(1) translateY(0); transition: opacity 300ms linear, transform 300ms ease-in-out; } .slide-exit { opacity: 1; transform: scale(1) translateY(0); } .slide-exit.slide-exit-active { opacity: 0; transform: scale(0.97) translateY(5px); transition: opacity 150ms linear, transform 150ms ease-out; } .slide-exit-done { opacity: 0; }
额外说明
如果你的GameQuestions组件内的延迟setState是在组件挂载后触发的,那现在动画挂载延迟1秒,刚好和组件内的setState同步,完美匹配你的需求。如果需要更精准的同步,可以把setState的触发放在setTimeout的回调里,确保两者完全同时执行。
内容的提问来源于stack exchange,提问作者maaajo

