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

用法一: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);
相关推荐
苏宸啊7 分钟前
Linux权限
linux·运维·服务器
xqhoj35 分钟前
Linux——make、makefile
linux·运维·服务器
qq_316837751 小时前
uni.chooseMedia 读取base64 或 二进制
开发语言·前端·javascript
张童瑶1 小时前
Linux 在线安装编译Python3.11
linux·运维·python3.11
Shi_haoliu1 小时前
SolidTime 在 Rocky Linux 9.5 上的完整部署流程
linux·运维·nginx·postgresql·vue·php·laravel
Zoey的笔记本1 小时前
2026告别僵化工作流:支持自定义字段的看板工具选型与部署指南
大数据·前端·数据库
小二·1 小时前
Python Web 开发进阶实战:混沌工程初探 —— 主动注入故障,构建高韧性系统
开发语言·前端·python
Lkygo1 小时前
LlamaIndex使用指南
linux·开发语言·python·llama
gis开发1 小时前
【无标题】
java·前端·javascript
小二·1 小时前
Python Web 开发进阶实战:低代码平台集成 —— 可视化表单构建器 + 工作流引擎实战
前端·python·低代码