当前位置:首页 > React

react实现代码对比

2026-01-27 16:26:52React

React 实现代码对比的方法

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

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

react-diff-viewer 是一个专门用于 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 使用的编辑器,内置了强大的代码对比功能。

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. 自定义实现 适合只需要简单对比功能的场景

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

react实现代码对比

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

相关文章

css网页制作代码

css网页制作代码

CSS网页制作基础代码 以下是一些常用的CSS代码片段,可用于网页制作的基本样式设置: 全局样式重置 * { margin: 0; padding: 0; box-sizing: bo…

vue本地查询代码实现

vue本地查询代码实现

Vue 本地查询代码实现 在Vue中实现本地查询功能,可以通过以下几种方式实现,具体取决于数据源和查询需求。 使用计算属性进行本地查询 计算属性是Vue中处理响应式数据查询的高效方式,适合基于现有数…

vue实现通讯录代码

vue实现通讯录代码

实现思路 Vue实现通讯录的核心在于数据管理和组件交互。通常需要包含联系人列表、搜索功能、分组索引以及添加/编辑功能。 基本结构 创建Vue组件时需包含以下部分: 数据模型:存储联系人数组 字…

h5实现响应式代码

h5实现响应式代码

响应式设计基础 HTML5实现响应式设计主要通过媒体查询(Media Queries)、弹性布局(Flexbox)、网格布局(Grid)和视口设置(Viewport Meta Tag)等技术。核心目标…

vue实现文字对比

vue实现文字对比

实现文字对比的常见方法 在Vue中实现文字对比功能,可以通过多种方式实现,以下是几种常见的方法: 使用v-for和v-if指令 通过遍历两个字符串的字符数组,比较每个位置的字符是否相同,然后根…

vue实现代码

vue实现代码

以下是Vue实现常见功能的代码示例,涵盖基础语法、组件通信、状态管理等核心内容: 基础模板语法 <template> <div> <h1>{{ me…