動手試試
最簡用法
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 與事件處理函式照常可用。