两段文本比对,高亮出差异部分

用法一:computed

html 复制代码
<div class="card" v-if="showFlag">
	<div class="info">*红色背景为已删除内容,绿色背景为新增内容</div>
	<el-form-item label="与上季度比对:">
		<div class="compareCss" v-html="highlightedLastQuarteDiff"></div>
	</el-form-item>
</div>

安装插件:diff

bash 复制代码
npm install diff
typescript 复制代码
import diff from 'diff';
// 与上季度比对
const highlightedLastQuarteDiff = computed(() => {
	const oldText = state.jsonContent ?? ''; // 旧值(原内容)
	const newText = state.content ?? ''; // 新值(修改后内容)

	const differences = diff.diffChars(oldText, newText); // 字符级差异对比
	let result = '';

	differences.forEach(part => {
		// 被删除的内容(旧值有,新值无)
		if (part.removed) {
			result += `<span style="text-decoration: line-through; background:#fbe9eb;color: red;  text-decoration-color: #777;">${part.value}</span>`;
		}
		// 新增的内容(旧值无,新值有)
		else if (part.added) {
			result += `<span style="background-color: #a6f3a6; color: #777;">${part.value}</span>`;
		}
		// 未改动的内容
		else {
			result += part.value;
		}
	});

	return result;
});

用法二:封装成方法

html 复制代码
<div class="compareTableCss">
	<div v-for="cItem in compareTable" :key="cItem.line">
		<p>{{ cItem.title }}</p>
		<p v-html="cItem.content"></p>
	</div>
</div>
javascript 复制代码
function highlightTextDifferences(oldText: string | null | undefined, newText: string | null | undefined): string {

	// 处理 null/undefined 情况
	const safeOldText = oldText ?? '';
	const safeNewText = newText ?? '';
	
	try {
		const differences = diff.diffChars(safeOldText, safeNewText);
		let result = '';
	
		differences.forEach((part:any) => {
			if (part.removed) {
				result += `<span style="text-decoration: line-through; background:#fbe9eb;color: red; text-decoration-color: #777;">${escapeHtml(part.value)}</span>`;
			} else if (part.added) {
				result += `<span style="background-color: #a6f3a6; color: #777;">${escapeHtml(part.value)}</span>`;
			} else {
				result += escapeHtml(part.value);
			}
		});
	
		return result;
	} catch (error) {
		console.error('Error in text comparison:', error);
		return escapeHtml(safeNewText); // 出错时返回新文本
	}
}
	
function escapeHtml(text: string): string {
	const div = document.createElement('div');
	div.textContent = text;
	return div.innerHTML;
}


// 使用
state.compareTable[1].content = highlightTextDifferences(fItem.windMuBiao, fItem.muBiao);
相关推荐
程序猿乐锅15 小时前
面向对象练习:图书借阅系统里的封装、抽象类与多态
开发语言·前端·数据库·后端·python·学习·1024程序员节
DYWorker00115 小时前
第 1-2 课:进程与调度:CPU 空出来时,内核选谁?
linux
老木避暑研究所15 小时前
负氧离子数据的采集、清洗与可视化:一套可复用的环境监测数据分析模板
前端·人工智能·数据分析
Soneswy15 小时前
Linux系统篇--用户切换与文件权限
linux·服务器
Ruiery15 小时前
Linux 6.6内核内存管理深度解析(三·补):页表项(PTE)结构与地址翻译
linux·运维·服务器
五块钱的方便面15 小时前
ubuntu下networkmanager不让管理解决办法
linux·运维·ubuntu
计算机魔术师16 小时前
AI 推翻了一个当了30年地基的假设,查的人恰好是立论者
前端
范同学~16 小时前
项目添加水印
java·前端·javascript
鬼手点金16 小时前
缓存作为架构约束
开发语言·前端·人工智能·python·microsoft·缓存·架构
月夏16 小时前
前端第一次接自己的后端:mock 切真接口踩了 2 个坑,组件只改了一行 import
前端·后端·node.js