大佬们,求助一个前端问题, AI 流式输出做了一个打字机效果,然后正在输出的时候选中部分文字,选中区域总会闪来闪去,有啥优化方法么

62 天前
 xihhh98

好像是 dom 频繁刷新的问题,我看 deepseek 也会这样,但是豆包好些不会,有啥优化的方法么

1733 次点击
所在节点    程序员
7 条回复
chairuosen
62 天前
闪是选中字的 dom 被改了。试试每个字套一个 span 试试,这样新字出现不会改旧的 dom (我没试过)
dcsuibian
62 天前
#1 说的对,刚刚拿 vue 试过了。
<p>{{content}}</p> // 频繁闪
<span v-for="(content, index) in contents" :key="index">{{ content }}</span> //不会闪
但是问题也来了,如果你每次拿到字符串就渲染一个<span>,那跟 markdown 渲染出来的效果就不一致了。
ooo4
62 天前
https://www.npmjs.com/package/vue-mdr
如果是 vue 可以试试这个
lqm
62 天前
换个思路,正在输出的时候禁止选中
chairuosen
62 天前
@dcsuibian 可能 render 函数可解。每次拿到 md2html 的 html 后,用 xmlparser 转成结构化数据然后再转成 jsx ,这个过程纯文字部分也都套 span 解决
ooo4
62 天前
@ooo4 就是 react-markdown 的思路,大概就这个流程 markdown string-> markdwon ast -> html ast -> vue node ,然后再 vuenode 里面的文本再进行拆分,用 span 标签包裹,由于使用了 vue 进行渲染,那么 vue 的 diff 机制只会渲染新增的元素,相同的 vnode 就会跳过 dom 更新,这样就能保留状态
ljl024
62 天前
markdown 的渲染都是分行的,基本上大模型也不会输出特别大的单个文本块。
如果是把 markdown 算成 html 再渲染,可以用换行符做一下拆分。除了最后一行,应该不会发生变更。
然后再参考 #4 的,把输出中的最后一行改成不允许选中。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1146649

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX