react-diff-viewer依赖的是react16,对于17版本来说,只能使用react-diff-view做文本对比(目前只发现了这个)
效果:

代码:
import React, { Component } from "react";
import "react-diff-view/style/index.css";
const {
parseDiff,
Diff,
Hunk,
Decoration,
tokenize,
markEdits,
} = require("react-diff-view");
const { diffLines, formatLines } = require("unidiff");
//@ts-ignore
const Appdiff = ({ oldVal, newVal }) => {
//比较新值和旧值的方法
const diffText = formatLines(diffLines(oldVal, newVal), {
context: 3,
});
const files = parseDiff(diffText, { nearbySequences: "zip" });
const renderFile = ({
//@ts-ignore
oldRevision, //@ts-ignore
newRevision, //@ts-ignore
type, //@ts-ignore
hunks,
}) => {
//不一样的地方用高亮表示
const options = {
highlight: false,
enhancers: [markEdits(hunks, { type: "block" })],
};
const token = tokenize(hunks, options);
return (
<div key={oldRevision + "-" + newRevision} className="file-diff">
{/* split就是分左右两个区域做对比 */}
<Diff viewType="split" diffType={type} hunks={hunks} tokens={token}>
{/* @ts-ignore */}
{(hunks) =>
hunks.map((hunk: { content: {} | null | undefined }) => [
// 作用未知
// <Decoration key={"deco-" + hunk.content}>
// <div className="hunk-header">{hunk.content}</div>
// </Decoration>,
//这里是核心的渲染区
<Hunk key={hunk.content} hunk={hunk} />,
])
}
</Diff>
</div>
);
};
return <div>{files.map(renderFile)}</div>;
};
function App(props: { oldVal: string; newVal: string }) {
return (
<div className="App">
<Appdiff oldVal={props.oldVal} newVal={props.newVal} />
</div>
);
}
export default React.memo(App);
测试:
import React, { useState } from "react";
import 文本对比 from "./文本对比";
const Index = () => {
const [oldVal, setOldVal] = useState("");
const [newVal, setNewVal] = useState("");
return (
<div>
旧的
<input
type="text"
value={oldVal}
onChange={(v) => {
setOldVal(v.target.value);
}}
/>
新的
<input
type="text"
value={newVal}
onChange={(v) => {
setNewVal(v.target.value);
}}
/>
<文本对比 oldVal={oldVal} newVal={newVal} />
</div>
);
};
export default React.memo(Index);
