Dify Markdown 组件使用指南

详细介绍 Dify Markdown 组件的功能与用法,包括标准 Markdown 语法、代码块、思考块、按钮、表单、图片、链接、LaTeX 等扩展组件,以及综合示例和注意事项。

📚 概述

Dify 的 Markdown 组件是一个功能强大的渲染工具,支持标准 Markdown 语法的同时,还扩展了多种交互式组件,如按钮、表单、思考块等。本指南详细介绍了如何使用这些组件来创建丰富的交互式内容。

🔍 基础用法

将 Markdown 字符串传递给 Markdown 组件的 content 属性即可渲染内容:

📋 支持的格式和组件

1. 标准 Markdown 语法

支持所有标准 Markdown 语法,包括:

  • 标题 (# 标题) + 列表 (- 项目1. 项目) + 引用 (> 引用内容) + 粗体/斜体 (**粗体**, *斜体*) + 表格 + 任务列表 (- [ ] 待办事项)

2. 代码块

使用标准 Markdown 代码块语法,支持语法高亮:

javascript console.log(‘Hello World’);

JavaScript 代码块示例:

  • 基本函数示例

javascript // 箭头函数示例 const greet = (name) => { return 你好,${name}!; };

// 异步函数示例 async function fetchData() { try { const response = await fetch(‘https://api.example.com/data’); const data = await response.json(); return data; } catch (error) { console.error(‘获取数据失败:’, error); } }

  • 类与对象示例

javascript // ES6 类定义 class Person { constructor(name, age) { this.name = name; this.age = age; }

sayHello() { console.log(你好,我是 ${this.name},今年 ${this.age} 岁); }

static createAnonymous() { return new Person(‘匿名’, 0); } }

// 类的使用 const alice = new Person(‘爱丽丝’, 28); alice.sayHello();

  • 现代 JavaScript 特性示例

javascript // 解构赋值 const person = { name: ‘张三’, age: 30, job: ‘开发者’ }; const { name, age } = person;

// 数组方法 const numbers = [1, 2, 3, 4, 5]; const doubled = numbers.map(num => num * 2); const sum = numbers.reduce((total, num) => total + num, 0);

// 可选链操作符 const user = null; const username = user?.profile?.username || ‘游客’;

// 空值合并运算符 const count = 0; const defaultCount = count ?? 10; // 结果为 0

特殊支持的语言:

Mermaid 流程图

mermaid graph TD A[开始] –> B[处理] B –> C[结束]

ECharts 图表

echarts { “title”: { “text”: “示例图表” }, “xAxis”: { “type”: “category”, “data”: [“Mon”, “Tue”, “Wed”, “Thu”, “Fri”, “Sat”, “Sun”] }, “yAxis”: { “type”: “value” }, “series”: [{ “data”: [820, 932, 901, 934, 1290, 1330, 1320], “type”: “line” }] }

SVG 渲染

使用 SVG 代码块可以直接渲染 SVG 图形:

svg

更多 SVG 示例:

  • 基本图形

svg

  • 文本和路径

svg SVG 文本示例

  • 渐变和动画

svg

3. 思考块(Think Block)

创建一个可折叠的思考过程区块,带有计时器。注意:<think>** 和 </think> 标签必须独占一行,且必须严格按照以下格式**:

重要: 不要在 <think> 前后使用其他 Markdown 语法标记,思考块必须按照上述格式精确书写,否则无法正确渲染。

4. 按钮组件

创建可点击的交互式按钮。注意:按钮必须使用 HTML 标签格式

属性说明:

  • data-variant - 按钮样式(可选值:primary, secondary, outline等) + data-message - 点击按钮时发送的消息 + data-link - 点击按钮时打开的链接(如果是有效URL) + data-size - 按钮大小(可选值:small, medium, large

按钮示例:

  • 发送消息的按钮

  • 打开链接的按钮

  • 不同样式的按钮

5. 表单组件

创建交互式表单,支持多种输入类型。注意:表单必须使用正确的 HTML 标签格式,每个标签必须正确闭合

重要:

  • 表单必须使用 HTML 标签格式,而非普通 Markdown 格式
  • 标签之间不要有空行或缩进,每个标签必须紧跟前一个标签
  • 确保每个标签均正确闭合,属性值使用双引号
  • 不要在标签之间添加空白行或空格,否则会被解析为 <p> 标签并导致“Unsupported tag: p”错误

表单属性:

  • data-format - 提交格式,可以是 text(默认)或 json + data-api-url - 指定表单提交的服务接口URL (暂不支持) + data-method - HTTP请求方法,如 POSTGETPUT 等(暂不支持) + data-headers - 请求头信息,JSON格式字符串(暂不支持)

提交到服务接口示例:

注意: 当前实现中,表单提交会将数据作为消息发送。如需提交到外部API,可能需要进行额外的开发实现。

支持的输入类型:

类型 描述 示例
text 文本输入 <input type="text" name="username" />
password 密码输入 <input type="password" name="password" />
email 邮箱输入 <input type="email" name="email" />
number 数字输入 <input type="number" name="age" />
date 日期选择器 <input type="date" name="birthday" />
time 时间选择器 <input type="time" name="meeting" />
datetime 日期时间选择器 <input type="datetime" name="appointment" />
checkbox 复选框 <input type="checkbox" name="agree" data-tip="我同意条款" />
select 下拉选择框 <input type="select" name="country" data-options='["中国", "美国", "英国"]' />
textarea 多行文本输入 <textarea name="description" placeholder="详细描述"></textarea>

6. 图片和多媒体

图片

使用标准 Markdown 语法:

视频

音频

7. 链接

标准链接:

特殊的缩写链接(点击后发送隐藏文本作为消息):

8. LaTeX 数学公式

支持多种格式的 LaTeX 数学公式:

行内公式

块级公式

传统 LaTeX 语法

🌟 综合示例

下面是一个结合多种组件的综合示例,注意每个组件的格式必须严格遵循要求:

echarts { “title”: { “text”: “用户年龄分布” }, “tooltip”: {}, “xAxis”: { “data”: [“18-24”, “25-34”, “35-44”, “45-54”, “55+”] }, “yAxis”: {}, “series”: [{ “name”: “用户数”, “type”: “bar”, “data”: [5, 20, 36, 10, 10] }] }

mermaid graph TD A[开始] –> B[填写表单] B –> C{是否完成?} C –>|是| D[提交] C –>|否| B D –> E[结束]

xml 问卷完成率

70%

javascript // 表单验证函数 function validateForm(formData) { const errors = {};

if (!formData.name || formData.name.trim() === ‘’) { errors.name = ‘姓名不能为空’; }

if (!formData.age || isNaN(formData.age) || formData.age < 18) { errors.age = ‘年龄必须大于或等于 18 岁’; }

if (!formData.country) { errors.country = ‘请选择国家/地区’; }

return { isValid: Object.keys(errors).length === 0, errors }; }

plain

📝 注意事项

  • 所有 HTML 标签必须正确闭合
  • 表单中的 name 属性是必需的,用于标识表单字段
  • 对于 select 类型的输入,data-options 必须是有效的 JSON 数组字符串
  • 思考块的 <think></think> 标签必须独占一行
  • 代码块的语言标识符区分大小写,请使用小写(如 javascript 而非 JavaScript

🔧 高级用法

自定义样式

可以通过 className 属性为 Markdown 组件添加自定义样式:

禁用特定元素

可以通过 customDisallowedElements 属性禁用特定 HTML 元素:


本指南涵盖了 Dify Markdown 组件的主要功能和用法。通过组合这些功能,可以创建丰富的交互式内容,提升用户体验。

MARKDOWN_COMPONENT_GUIDE.md

tsx4 行
import { Markdown } from '@/app/components/base/markdown'

// 在组件中使用
<Markdown content={markdownString} />
plain6 行
<think>
这是一个思考过程...
分析问题...
得出结论...
</think>
html2 行
<button data-variant="primary" data-message="要发送的消息">按钮文本</button>
html2 行
<button data-variant="primary" data-message="我需要更多信息">获取更多信息</button>
html2 行
<button data-variant="outline" data-link="https://example.com" data-size="small">访问网站</button>
html2 行
<button data-variant="secondary" data-message="选择了次要选项">次要选项</button>
html8 行
<form data-format="text">
<label for="name">姓名</label>
<input type="text" name="name" placeholder="请输入姓名" />
<label for="description">描述</label>
<textarea name="description" placeholder="请输入描述"></textarea>
<button data-variant="primary">提交</button>
</form>
html8 行
<form data-format="json" data-api-url="https://api.example.com/submit" data-method="POST" data-headers='{"Content-Type": "application/json", "Authorization": "Bearer YOUR_TOKEN"}'>
<label for="name">姓名</label>
<input type="text" name="name" placeholder="请输入姓名" />
<label for="email">电子邮件</label>
<input type="email" name="email" placeholder="请输入电子邮件" />
<button data-variant="primary">提交到API</button>
</form>
markdown
![alt文本](图片URL)
html2 行
<video src="视频URL"></video>
html2 行
<audio src="音频URL"></audio>
markdown
[显示文本](链接URL)
markdown
[显示文本](abbr:隐藏文本)
markdown
$E=mc^2$
markdown3 行
$$
\int_{a}^{b} f(x) \, dx = F(b) - F(a)
$$
markdown2 行
\(行内公式\)
\[块级公式\]
plain38 行
# 交互式问卷调查

这是一个使用 Dify Markdown 组件创建的交互式问卷示例。

## 思考过程

<think>
1. 首先分析用户需求
2. 设计合适的表单字段
3. 添加提交按钮和反馈机制
</think>
## 请填写以下信息

<form data-format="json">
<label for="name">您的姓名</label>
<input type="text" name="name" placeholder="请输入姓名" />
<label for="age">年龄</label>
<input type="number" name="age" placeholder="请输入年龄" />
<label for="birthday">出生日期</label>
<input type="date" name="birthday" />
<label for="country">国家/地区</label>
<input type="select" name="country" data-options='["中国", "美国", "加拿大", "英国", "澳大利亚", "其他"]' />
<label for="interests">兴趣爱好</label>
<textarea name="interests" placeholder="请描述您的兴趣爱好"></textarea>
<label for="newsletter">订阅通讯</label>
<input type="checkbox" name="newsletter" data-tip="我希望接收最新资讯" />
<button data-variant="primary">提交问卷</button>
</form>
## 按钮示例

<button data-variant="primary" data-message="我要提交问卷">提交问卷</button>
<button data-variant="outline" data-link="https://example.com/help" data-size="small">查看帮助</button>
## 更多信息

查看我们的 [隐私政策](https://example.com/privacy) 或 [联系我们](abbr:我想联系客服)。

## 数据分析结果
2 行

## 流程图
2 行

## SVG 图形示例
2 行

## JavaScript 交互示例
tsx
<Markdown content={markdownString} className="custom-markdown" />
tsx4 行
<Markdown 
  content={markdownString} 
  customDisallowedElements={['script', 'iframe']} 
/>