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

用法一: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);
相关推荐
java_logo3 小时前
MySQL Server Docker 容器化部署指南
linux·运维·数据库·docker·容器
likuolei3 小时前
XSL-FO 软件
java·开发语言·前端·数据库
正一品程序员3 小时前
vue项目引入GoogleMap API进行网格区域圈选
前端·javascript·vue.js
j***89463 小时前
spring-boot-starter和spring-boot-starter-web的关联
前端
star_11123 小时前
Jenkins+nginx部署前端vue项目
前端·vue.js·jenkins
誰能久伴不乏3 小时前
Linux文件套接字AF_UNIX
linux·服务器·c语言·c++·unix
im_AMBER4 小时前
Canvas架构手记 05 鼠标事件监听 | 原生事件封装 | ctx 结构化对象
前端·笔记·学习·架构
JIngJaneIL4 小时前
农产品电商|基于SprinBoot+vue的农产品电商系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·毕设·农产品电商系统
a41324474 小时前
如何解决centos上oracle连接问题
linux·oracle·centos
h***34634 小时前
在linux(Centos)中Mysql的端口修改保姆级教程
linux·mysql·centos