当前位置:首页 > 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中实现文字对比功能,可以通过多种方式实现,以下是几种常见的方法: 使用v-for和v-if指令 通过遍历两个字符串的字符数组,比较每个位置的字符是否相同,然后根据比…

vue代码核心实现

vue代码核心实现

Vue 核心实现原理 Vue.js 的核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是关键实现要点: 响应式系统 通过 Object.defineProperty(Vue 2)…

vue实现参数对比

vue实现参数对比

Vue 实现参数对比的方法 在 Vue 中实现参数对比通常涉及监听数据变化或比较新旧值,以下是几种常见场景的实现方式: 使用 watch 监听器对比新旧值 通过 Vue 的 watch 可以监听特定…

vue实现文件对比

vue实现文件对比

Vue实现文件对比的方法 使用第三方库实现差异对比 推荐使用diff-match-patch或jsdiff库,它们专为文本差异对比设计,支持高亮显示差异部分。安装后可直接在Vue组件中调用。…

vue实现代码插件

vue实现代码插件

Vue 实现代码插件的方法 使用第三方库(如 Prism.js 或 Highlight.js) 安装 Prism.js 或 Highlight.js 库,这些库专门用于代码高亮显示。在 Vue 项目中…

vue实现左右滑动代码

vue实现左右滑动代码

以下是一个基于 Vue 3 实现左右滑动功能的代码示例,结合手势识别和动画效果: 基础实现(使用 CSS 和事件监听) <template> <div class="slide…