用法一: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);