react-diff-viewer -- 代码diff工具

一、先上效果图

二、上代码

下载依赖包

pnpm install react-diff-viewer@3.1.1
import { Row, Col } from 'antd';
import ReactDiffViewer, { DiffMethod } from 'react-diff-viewer';

//props接收新旧值
export default function diffModel({ oldData , newData }:any) {
    
  //把数据转化成JSON字符串的形式
  //因为数据转化成字符串后会堆积成一行,这里封装一个格式化的函数
  const toJsonStr=(value:any) => {
    const result = JSON.stringify(value)
                       .replaceAll(',', ',\n')
                       .replaceAll('{', '{\n')
                       .replaceAll('}', '\n}')
                       .replaceAll('\\', '');
    //清除两边的引号
    return result.slice(1, result.length - 1)
  }

  //获取格式化后的JSON数据
  const oldVerifyConf = toJsonStr(oldData)
  const newVerifyConf = toJsonStr(newData)

  //样式
  const newStyles = {
    variables: {
      dark: {
        highlightBackground: '#fefed5',
        highlightGutterBackground: '#ffcd3c',
      },
    },
    line: {
      padding: '10px 2px',
      '&:hover': {
        background: '#a26ea1',
      },
    },
    contentText: {
      width: '390px',
    },
  };

  return (
     <Row>
       <Col span={12}>
         <p>旧值</p>
       </Col>
       <Col span={12}>
         <p>新值</p>
       </Col>
       <Col span={24}>
         <ReactDiffViewer
           oldValue={oldVerifyConf}
           newValue={newVerifyConf}
           styles={newStyles}
           splitView
           compareMethod={DiffMethod.LINES}
           showDiffOnly={false}//对比结果相同是是否隐藏(true隐藏false不隐藏)
           codeFoldMessageRenderer={(num) => <>展开隐藏的 {num} 行...</>}
         />
       </Col>
     </Row>
  );
}

三、ReactDiffViewer属性

属性名类型默认值介绍
oldValuestring''字符串形式的旧值
newValuestring''字符串形式的新值
splitViewbooleantrue在统一视图和拆分视图之间切换
disableWordDiffbooleanfalse在差异行中显示和隐藏单词差异
compareMethodDiffMethodDiffMethod.CHARS用于区分字符串的JsDiff文本diff方法。查看指南以使用不同的方法
hideLineNumbersbooleanfalse显示和隐藏行号
renderContentfunctionundefined渲染Prop API以在diff查看器中渲染代码。有助于语法突出显示,参考文档
onLineNumberClickfunctionundefined

行号单击的事件处理程序

(lineId: string) => void

highlightLinesarray[string][]要高亮显示的行列表。与onLineNumberClick配合使用。对于diff查看器的左侧和右侧部分,行号分别以L和R作为前缀。例如,L-20表示左侧窗格中的第20行。要高亮显示一系列行号,请将带前缀的行号作为数组传递。例如,[L-2,L-3,L-4,L-5]将突出显示左侧窗格中的2-5行
showDiffOnlybooleantrue仅显示不同的行并折叠未更改的行
extraLinesSurroundingDiffnumber3围绕diff的额外未更改行数。与showDiffOnly一起使用
codeFoldMessageRendererfunctionExpand {number} of lines ...呈现Prop API以呈现代码折叠消息
stylesobject{}替代样式变量和样式。了解有关替代样式的详细信息
useDarkThemebooleantrue启用/禁用深色主题
leftTitlestringundefined拆分视图中差异左侧部分的列标题。这将用作内联视图中的唯一标题
rightTitlestringundefined拆分视图中差异右侧部分的列标题。这将在内联视图中被忽略
linesOffsetnumber0开始计数代码行的编号

四、关于数据量过大问题

1. 数据处理的角度 

让后段同学在数据中保留换行符、空格符号等,避免前端处理数据。

2. 渲染的角度

使用ReactDiffViewer的showDiffOnly属性,仅显示不同的行并折叠未更改的行。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王布尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值