Vue里怎么实现两个版本JSON数据的差异对比高亮显示?
我在做一个配置管理功能,需要对比用户修改前后的JSON数据,并把差异部分高亮出来。试了用deep-diff库拿到差异,但不知道怎么在页面上直观地展示出来,特别是嵌套对象的情况。
现在我的模板是这样写的,但diff结果一复杂就乱了,有没有更好的做法?
<template>
<div>
<div v-for="(item, index) in diffResult" :key="index">
{{ item.kind }}: {{ item.path.join('.') }} → {{ item.lhs }} vs {{ item.rhs }}
</div>
</div>
</template>
首先安装两个库:
然后可以这样实现:
模板改成这样:
CSS的话可以这样定义差异样式:
vue-json-compare这个库已经帮你处理了递归渲染的问题,比手动写v-for要省事多了。它会把新增字段标绿,删除字段标红,修改的字段标黄,嵌套结构会自动展开。
如果不想用第三方库,自己写递归组件也行,但处理各种边界情况会比较麻烦,特别是数组差异的情况。我建议先用现成方案,真有特殊需求再考虑自己造轮子。