Svelte中无法包裹组件时如何给组件传递animate:flip动画?
解决方案
你只需要把animate:flip指令从父组件移到Widget组件内部的根DOM元素上即可,不需要额外添加包裹容器,完全不会破坏CSS Grid的直接子元素结构。
具体实现步骤
- 父组件正常遍历渲染Widget,不需要加任何外层包裹元素
{#each widgets as widget (widget.id)} <Widget {...widget} /> {/each}
- 在Widget组件内部的根元素上绑定flip动画
<!-- Widget.svelte --> <script> import { flip } from 'svelte/animate' // 原有组件props export let id export let widgetContent // 可选:加参数控制动画开关和配置,方便组件复用 export let enableFlip = true export let flipConfig = { duration: 250 } </script> <!-- 直接在根元素上加动画,这个元素就是Grid的直接子节点 --> <div class="widget-item" animate:flip={enableFlip ? flipConfig : null} > {widgetContent} <!-- 组件原有内容 --> </div> <style> .widget-item { /* 你原来给Widget设置的Grid相关样式都放在这里即可 */ } </style>
注意:
#each循环的唯一key(示例中为widget.id)必须保留,否则flip动画无法正常识别元素位置变化。
适配行组件封装场景
你把每行三个单元格封装为单个组件的情况逻辑完全一致,只需要给行组件的根DOM元素加上animate:flip指令即可,行组件根节点本身就是外层Grid的直接子元素,不会影响布局,也能得到和封装前完全一致的flip动画效果。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

