Angular子元素:leave动画出现级联延迟问题求解决方案
解决方案:让Angular父子组件离开动画同步触发
核心思路是利用Angular动画API的query()、animateChild()和group(),实现父组件离开动画与子组件离开动画并行执行,避免子组件因父组件提前销毁导致动画中断。
1. 确认子组件动画配置
假设你的可复用子组件已在宿主元素上绑定了离开动画,触发器名为childLeaveAnim(需替换为你实际的触发器名称),子组件代码示例:
@Component({ selector: 'app-reusable-child', template: `<div>子组件内容</div>`, animations: [ trigger('childLeaveAnim', [ transition(':leave', [ style({opacity: 1}), animate('0.35s ease-out', style({opacity: 0})) // 这里是子组件自身的离开动画逻辑 ]) ]) ], host: { '[@childLeaveAnim]': 'true' } }) export class ReusableChildComponent {}
2. 修改父组件动画配置
在父组件的:leave过渡中,使用group()将父组件自身动画与子组件动画触发逻辑并行执行:
animations: [ trigger('barSlideInOut', [ transition(':enter', [ style({transform: 'translateY(80px)'}), animate('0.4s cubic-bezier(0.05, 0.7, 0.1, 1.0)', style({transform: 'translateY(0px)'})) ]), transition(':leave', [ group([ // 父组件自身的离开动画 animate('0.35s cubic-bezier(0.3, 0.0, 0.8, 0.15)', style({transform: 'translateY(80px)'})), // 查询子组件动画触发器并触发,optional: true避免无匹配子组件时报错 query('@childLeaveAnim', animateChild(), {optional: true}) ]) ]) ]) ]
关键说明
group():强制多个动画步骤并行启动,保证父子动画同时触发。query('@childLeaveAnim'):在父组件模板中定位带有指定动画触发器的子元素(即子组件的宿主元素)。animateChild():触发子组件的动画,并让Angular等待该动画完成后再结束父组件的:leave过渡,彻底避免子组件提前销毁。{optional: true}:当父组件模板中无匹配子组件时,不会抛出错误,提升代码健壮性。
如果父子组件动画时长不同,group()会自动等待所有并行动画执行完毕后,再完成父组件的销毁流程。
内容的提问来源于stack exchange,提问作者Michał B
相关产品推荐
相关产品推荐

