Package Exports
- ds-markdown
- ds-markdown/style.css
Readme
ds-markdown
ds-markdown是一个React组件, 类似deepseek官网风格的 Markdown
特性
- 🛠 自带打字效果
- 🦮 内部封装了常用的
markdown格式的文本显示 - 🔤 对大文档进行了性能优化,进行分批处理,生成打字效果的时候不会对页面造成卡顿现象
期待中的功能
- 支持多种主题(开发中)
- 增加测试用例(开发中)
- 支持H5端(未开始,预计2025年5月底完成)
- 支持微信、支付宝小程序端(未开始,预计2025年6月底完成)
由于本页面仔写业务写的飞起,只能在闲暇之余来开发本库,也希望各位小伙伴一起来共建😘
安装
npm install ds-markdownprops
默认导出
| 属性名 | 类型 | 说明 | 默认值 |
|---|---|---|---|
interval |
number |
打字的速度ms |
30 |
answerType |
thinking | answer |
markdown类型 |
answer |
onEnd |
() => void |
打字结束后回调,可能会触发多次 | - |
onStart |
(isFirst: boolean) => void |
打字开始回调 可能会触发多次 | - |
使用示例 - default export
import { useState } from 'react';
import DsMarkdown from 'ds-markdown';
import 'ds-markdown/style.css';
const markdown = `# ds-markdown
\`ds-markdown\`是一个[React](https://react.dev)组件, 类似[deepseek官网](https://chat.deepseek.com/)风格的 \`Markdown\`
## 特性
- 🛠 自带打字效果
- 🦮 内部封装了常用的\`markdown\`格式的文本显示
- 🔤 对大文档进行了性能优化,进行分批处理,生成打字效果的时候不会对页面造成卡顿现象
`;
function App() {
const [thinkingContent, setThinkingContent] = useState('');
const [answerContent, setAnswerContent] = useState('');
const onClick = () => {
// 如果重复点击,则会清空之前的效果
setThinkingContent('这是我思考的内容,我已经思考完成,下面是我的答案');
};
console.log(answerContent);
return (
<div>
<button onClick={onClick}>点击显示文字效果</button>
<DsMarkdown
answerType="thinking"
interval={5}
onEnd={() => {
console.log('思考完成');
setAnswerContent(markdown);
}}
>
{thinkingContent}
</DsMarkdown>
{!!answerContent && (
<DsMarkdown answerType="answer" interval={5}>
{answerContent}
</DsMarkdown>
)}
</div>
);
}
export default App;命令式示例
上面的示例中使用声明式方式来进行markdown的打字效果,当我们用流式拉取到数据时,文字是一个不断变化的过程,我们可以进行命令式的方式来加入文字,这样可以减少markdown的rerender
使用方式:
import { MarkdownCMD } from 'ds-markdown';
import { useRef, useState } from 'react';
import { MarkdownCMD } from 'ds-markdown';
import 'ds-markdown/style.css';
const markdown = `# ds-markdown
\`ds-markdown\`是一个[React](https://react.dev)组件, 类似[deepseek官网](https://chat.deepseek.com/)风格的 \`Markdown\`
## 特性
- 🛠 自带打字效果
- 🦮 内部封装了常用的\`markdown\`格式的文本显示
- 🔤 对大文档进行了性能优化,进行分批处理,生成打字效果的时候不会对页面造成卡顿现象
`;
function App() {
const ref = useRef();
const onClick = () => {
// 如果重复点击,则会清空之前的效果
ref.current.clear();
// 显示思考过程
ref.current.push('这是思考过程:我正在思考 ds-markdown是什么\n\n思考完成,准备发送答案', 'thinking');
// 显示结果
ref.current.push(markdown, 'answer');
};
return (
<div>
<button onClick={onClick}>点击显示文字效果</button>
<MarkdownCMD ref={ref} />
</div>
);
}
export default App;兼容性
由于本组件采用react hooks编写,所以react版本最低为v16.8.0
License
MIT