动手试试
最简用法
Answer.jsx<MotionStream text={answerSoFar} initial />
<MotionStream text={answerSoFar}>
{visible => <Markdown>{visible}</Markdown>}
</MotionStream>
它替你处理的事
- 成批到达也能顺畅阅读:文本以每秒
speed 个字符的速度显示,而不是一块一块地蹦出来。 - 积压的内容会加快显示,在大约
catchUp 毫秒内全部呈现。 - 表情符号、旗帜和组合字符绝不会被拆开,只收到一半的表情符号会等待其余部分。
- 回答被重写时,会从共同的开头继续,而不是从头再来。
- 显示的字符直接写入页面;React 每秒只渲染几次。
Props
| Prop | 类型 | 默认值 | 说明 |
|---|
text | string | —必需 | 目前为止的文本。增长的文本以稳定节奏显示;被重写时从共同的开头继续。 |
|---|
speed | number | 90 | 基础显示速度,单位为每秒字符数。 |
|---|
catchUp | number | 900 | 积压的内容会加速显示,在大约这么多毫秒内全部呈现。 |
|---|
initial | boolean | false | 挂载时已有的文本也逐步显示(否则立即显示)。 |
|---|
effect | 'fade' | 'none' | 'fade' | fade 让新字符淡入;none 直接显示。 |
|---|
children | (visible: string) => ReactNode | | 接收按节奏输出的文本的函数,例如用于渲染 Markdown。 |
|---|
as | element | 'span' | 要渲染的元素。 |
|---|
onMotionComplete | (text) => void | | 每当显示进度追上 text 时运行。 |
|---|
其他 props 会传给渲染的元素,所以 className、style 和事件处理函数照常可用。