You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Next.js/React前端代码中向Markdown文本插入变量?

解决方案:Next.js前端与Markdown变量动态交互

一、核心逻辑梳理

你的需求本质是在前端维护可编辑变量,实时替换Markdown模板中的占位符,生成最终Markdown文件供后端使用。Turndown是HTML转Markdown的工具,对你的场景来说非必需;CodeMirror则是用于实现前端可视化Markdown编辑的组件,若需要用户直接编辑Markdown内容可选用。

二、基础场景实现(无需Turndown)

1. 定义带占位符的Markdown模板

先把需要替换的变量用统一标记(比如{{变量名}})定义成模板字符串或单独文件:

# 法律文书模板
当事人姓名:{{clientName}}
案件编号:{{caseId}}
诉求内容:{{claimContent}}

2. Next.js组件实现变量输入与替换

用React状态管理变量,编写替换函数将占位符替换为输入值,同时支持将生成的Markdown传给后端:

import { useState } from 'react';

export default function MarkdownGenerator() {
  // 维护变量状态
  const [variables, setVariables] = useState({
    clientName: '',
    caseId: '',
    claimContent: ''
  });
  
  // Markdown模板
  const markdownTemplate = `# 法律文书模板
当事人姓名:{{clientName}}
案件编号:{{caseId}}
诉求内容:{{claimContent}}`;

  // 替换占位符生成最终Markdown
  const getFinalMarkdown = () => {
    let result = markdownTemplate;
    Object.entries(variables).forEach(([key, value]) => {
      const regex = new RegExp(`{{${key}}}`, 'g');
      result = result.replace(regex, value);
    });
    return result;
  };

  // 处理输入变更
  const handleInputChange = (e) => {
    const { name, value } = e.target;
    setVariables(prev => ({ ...prev, [name]: value }));
  };

  return (
    <div className="container">
      {/* 变量输入表单 */}
      <div className="input-group">
        <label>当事人姓名:</label>
        <input 
          type="text" 
          name="clientName" 
          value={variables.clientName} 
          onChange={handleInputChange} 
        />
      </div>
      <div className="input-group">
        <label>案件编号:</label>
        <input 
          type="text" 
          name="caseId" 
          value={variables.caseId} 
          onChange={handleInputChange} 
        />
      </div>
      <div className="input-group">
        <label>诉求内容:</label>
        <textarea 
          name="claimContent" 
          value={variables.claimContent} 
          onChange={handleInputChange} 
          rows={5}
        />
      </div>

      {/* 预览生成的Markdown */}
      <div className="preview-section">
        <h3>生成结果:</h3>
        <pre>{getFinalMarkdown()}</pre>
      </div>

      {/* 提交到后端 */}
      <button onClick={() => {
        fetch('/api/save-markdown', {
          method: 'POST',
          body: JSON.stringify({ content: getFinalMarkdown() }),
          headers: { 'Content-Type': 'application/json' }
        });
      }}>保存至后端</button>
    </div>
  );
}

三、集成CodeMirror实现可视化编辑

如果需要用户直接编辑Markdown模板(同时保留变量替换功能),可以使用React版CodeMirror:

1. 安装依赖

npm install @uiw/react-codemirror @codemirror/lang-markdown

2. 组件实现

import { useState } from 'react';
import CodeMirror from '@uiw/react-codemirror';
import { markdown } from '@codemirror/lang-markdown';

export default function MarkdownEditor() {
  const [templateContent, setTemplateContent] = useState(`# 法律文书模板
当事人姓名:{{clientName}}
案件编号:{{caseId}}
诉求内容:{{claimContent}}`);
  const [variables, setVariables] = useState({
    clientName: '',
    caseId: '',
    claimContent: ''
  });

  // 变量替换预览
  const previewResult = () => {
    let result = templateContent;
    Object.entries(variables).forEach(([key, value]) => {
      const regex = new RegExp(`{{${key}}}`, 'g');
      result = result.replace(regex, value);
    });
    return result;
  };

  return (
    <div style={{ display: 'flex', gap: '20px', padding: '20px' }}>
      {/* Markdown编辑器 */}
      <div style={{ flex: 1 }}>
        <h3>编辑模板</h3>
        <CodeMirror
          value={templateContent}
          onChange={setTemplateContent}
          extensions={[markdown()]}
          height="500px"
        />
      </div>

      {/* 变量设置区 */}
      <div style={{ width: '250px' }}>
        <h3>变量配置</h3>
        <div style={{ marginBottom: '15px' }}>
          <label>当事人姓名:</label>
          <input 
            type="text" 
            value={variables.clientName} 
            onChange={(e) => setVariables(prev => ({...prev, clientName: e.target.value}))}
            style={{ width: '100%' }}
          />
        </div>
        <div style={{ marginBottom: '15px' }}>
          <label>案件编号:</label>
          <input 
            type="text" 
            value={variables.caseId} 
            onChange={(e) => setVariables(prev => ({...prev, caseId: e.target.value}))}
            style={{ width: '100%' }}
          />
        </div>
        <div>
          <label>诉求内容:</label>
          <textarea 
            value={variables.claimContent} 
            onChange={(e) => setVariables(prev => ({...prev, claimContent: e.target.value}))}
            rows={5}
            style={{ width: '100%' }}
          />
        </div>
      </div>

      {/* 预览区 */}
      <div style={{ flex: 1 }}>
        <h3>预览结果</h3>
        <pre style={{ height: '450px', overflow: 'auto', border: '1px solid #eee', padding: '10px' }}>{previewResult()}</pre>
        <button onClick={() => {
          fetch('/api/save-markdown', {
            method: 'POST',
            body: JSON.stringify({ content: previewResult() }),
            headers: { 'Content-Type': 'application/json' }
          });
        }}>保存至后端</button>
      </div>
    </div>
  );
}

四、参考项目思路

  • 核心参考「在线Markdown模板工具」的逻辑:通过占位符标记变量,前端维护变量状态,实时完成替换生成最终内容。
  • 若需复杂变量管理(如类型校验、批量导入),可添加对应逻辑,比如用zod做变量格式校验。

内容的提问来源于stack exchange,提问作者Gaurav Arora

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:15:05