全部组件

MotionSwap

内容交叉淡入淡出,尺寸随之变化。

WebReact Native内容与尺寸

动手试试

正在准备示例…

最简用法

SaveButton.jsx
<button onClick={save}>
  <MotionSwap value={status} effect="up">
    {status === 'saving' ? 'Saving…' : status === 'saved' ? 'Saved' : 'Save'}
  </MotionSwap>
</button>;

它替你处理的事

  • 元素会从屏幕上的当前尺寸变化到新内容的自然尺寸,所以按钮从不跳动。
  • 旧内容在原处淡出,新内容同时淡入;切换期间两者都不会重新排版。
  • 切换中途改回去,会从屏幕上的当前状态继续,而不会叠出多个副本。
  • 纯文本子元素本身就是它的 value;其他内容请传入 value。

适用场景

  • 保存 → 保存中… → 已保存。
  • 骨架屏变成个人资料卡。
  • 播放按钮变成暂停按钮。

Props

Prop类型默认值说明
valueunknown内容的标识;新的值会触发切换。纯文本子元素本身就是标识。
childrenReactNode内容。
aselement'span'要渲染的元素。
inlinebooleanas === 'span'true 按内容决定尺寸(标签、图标);false 撑满父元素宽度并为高度添加动画。
align'start' | 'center' | 'end''center'尺寸变化时内容所在的位置。
effect'fade' | 'up' | 'down' | 'scale''fade'内容如何进出:up 上升,down 下落,scale 放大。
transitionTransitionspring时间曲线 { duration, easing } 或弹簧 { tempo: 'spring', spring }。弹簧被打断时会保留动量。
onMotionComplete(value) => void动效停稳时运行。

其他 props 会传给渲染的元素,所以 className、style 和事件处理函数照常可用。

Web 与 React Native

inline(以 span 渲染时的默认值)会对宽度和高度添加动画;inline={false} 会撑满父元素宽度,只对高度添加动画。

在 React Native 上,行内切换会按单行测量新内容;会换行的内容请使用 inline={false}。

用到它的示例

搜索

输入关键词搜索文档。