当前位置:首页 > React

react实现代码对比

2026-01-27 16:26:52React

React 实现代码对比的方法

在 React 中实现代码对比功能,可以通过多种方式完成。以下是几种常见的方法:

使用现成的库(如 react-diff-viewer)

react-diff-viewer 是一个专门用于 React 的代码对比库,支持语法高亮和多种对比模式。

react实现代码对比

import React from 'react';
import ReactDiffViewer from 'react-diff-viewer';

const DiffViewer = () => {
  const oldCode = `const a = 10;
const b = 20;`;

  const newCode = `const a = 15;
const b = 20;`;

  return (
    <ReactDiffViewer
      oldValue={oldCode}
      newValue={newCode}
      splitView={true}
    />
  );
};

export default DiffViewer;

使用 Monaco Editor 的对比功能

Monaco Editor 是 VS Code 使用的编辑器,内置了强大的代码对比功能。

react实现代码对比

import React, { useEffect, useRef } from 'react';
import * as monaco from 'monaco-editor';

const DiffEditor = () => {
  const editorRef = useRef(null);

  useEffect(() => {
    const originalModel = monaco.editor.createModel(
      'const a = 10;\nconst b = 20;',
      'javascript'
    );

    const modifiedModel = monaco.editor.createModel(
      'const a = 15;\nconst b = 20;',
      'javascript'
    );

    const diffEditor = monaco.editor.createDiffEditor(
      editorRef.current,
      {
        readOnly: true,
        automaticLayout: true,
      }
    );

    diffEditor.setModel({
      original: originalModel,
      modified: modifiedModel,
    });

    return () => {
      diffEditor.dispose();
      originalModel.dispose();
      modifiedModel.dispose();
    };
  }, []);

  return <div ref={editorRef} style={{ height: '400px' }} />;
};

export default DiffEditor;

使用 CodeMirror 的合并视图

CodeMirror 是另一个流行的代码编辑器,支持合并视图。

import React, { useEffect, useRef } from 'react';
import { EditorView } from '@codemirror/view';
import { EditorState } from '@codemirror/state';
import { defaultHighlightStyle } from '@codemirror/highlight';
import { mergeView } from '@codemirror/merge';

const MergeEditor = () => {
  const editorRef = useRef(null);

  useEffect(() => {
    const left = EditorState.create({
      doc: 'const a = 10;\nconst b = 20;',
      extensions: [defaultHighlightStyle],
    });

    const right = EditorState.create({
      doc: 'const a = 15;\nconst b = 20;',
      extensions: [defaultHighlightStyle],
    });

    const merge = mergeView({
      a: left,
      b: right,
      parent: editorRef.current,
    });

    return () => {
      merge.destroy();
    };
  }, []);

  return <div ref={editorRef} />;
};

export default MergeEditor;

自定义实现简单的对比功能

如果需要简单的对比功能,可以自行实现基于行的对比算法。

import React from 'react';

const SimpleDiff = ({ oldText, newText }) => {
  const oldLines = oldText.split('\n');
  const newLines = newText.split('\n');

  return (
    <div>
      {newLines.map((line, i) => {
        const oldLine = oldLines[i];
        const isChanged = oldLine !== line;

        return (
          <div key={i} style={{ 
            backgroundColor: isChanged ? '#ffcccc' : 'transparent',
            margin: '2px 0',
          }}>
            {line}
          </div>
        );
      })}
    </div>
  );
};

export default SimpleDiff;

选择建议

  1. react-diff-viewer 适合需要快速实现、功能完整的对比场景
  2. Monaco Editor 适合需要强大编辑功能的专业场景
  3. CodeMirror 适合需要轻量级解决方案的项目
  4. 自定义实现 适合只需要简单对比功能的场景

每种方法都有其适用场景,根据项目需求选择合适的方案。

标签: 对比代码
分享给朋友:

相关文章

代码雨实现vue

代码雨实现vue

实现代码雨效果(Vue版) 使用Vue实现代码雨效果可以通过Canvas绘制结合动画帧实现。以下是完整实现方案: 核心代码结构 <template> <div class="c…

vue实现代码实例

vue实现代码实例

以下是一个基于 Vue 3 的完整代码实例,包含核心功能实现和常见开发场景的示例: 基础组件示例 <template> <div> <h1>{{ ti…

如何建立运行react代码

如何建立运行react代码

安装 Node.js 和 npm React 项目需要 Node.js 环境来运行,同时 npm(Node Package Manager)用于管理依赖。从 Node.js 官网 下载并安装最新稳定版…

react项目代码如何上生产环境

react项目代码如何上生产环境

构建生产环境代码 运行以下命令生成优化后的生产版本代码,该命令会启用代码压缩、tree-shaking等优化措施: npm run build 构建完成后会在项目根目录生成build文件夹,包含所有…

react实现代码提示

react实现代码提示

实现代码提示的基本思路 在React中实现代码提示功能通常需要结合文本编辑器组件(如CodeMirror、Monaco Editor)和语言服务工具(如TypeScript编译器、自定义语法分析器)。…