当前位置:   article > 正文

Vue比较字符串变化并高亮变化的部分_vue匹配两个字符串找出不同的内容高亮

vue匹配两个字符串找出不同的内容高亮

最近有个需求为只展示一个字段变更前和变更后变化的部分,新增为红色,删除的灰色加上删除线展示,最终效果如下:

 其实本质上就是两个文本的diff,找到新增的和删除的然后加上样式,这里用的库为diff_match_patch

1.install

npm i diff_match_patch -S

2.初始化

这个库提供了一个构造函数diff_match_patch,返回一个diff实例供我们使用他的api,官方有很多方法,这里需求只用到了它的字符串对比:

 diff_main方法提供了两个入参为需要对比的字符串,返回一个二维数组,数组的第一项为内容类型,0为公共的也就是没有变化的部分,1为新增,2为删除的,因此,我们可以对其进行封装

3.封装

在utils文件夹下建立一个diff.js工具类.用来封装:

  1. // 因为导出的构造函数为下划线命名,这里改为驼峰
  2. import { diff_match_patch as DiffMatchPatch } from 'diff_match_patch';
  3. const createDiffMatchPatch = () => {
  4. const diffMatchPatch = new DiffMatchPatch();
  5. const DIFF_IDENTIFIER = {
  6. INSERTION: 1, // 新增的
  7. DELETION: -1, // 删除的
  8. EQUALITY: 0, // 公共的
  9. }
  10. return {
  11. DIFF_IDENTIFIER,
  12. /**
  13. * diff字符串的变更
  14. * @param {String} prevText 上一次的内容
  15. * @param {String} currentText 这次要diff的内容
  16. * @return {{Array.<Array.<number|string>>}} diff后的结果 为一个二维数组
  17. */
  18. diffText(prevText, currentText) {
  19. const diffResults = diffMatchPatch.diff_main(prevText, currentText);
  20. return diffResults;
  21. },
  22. }
  23. }
  24. // 初始化后导出
  25. export default createDiffMatchPatch();

使用时直接导入:

  1. import diff from "@/utils/diff";
  2. const diffResults = diff.diffText(
  3. record.prevDetail,
  4. record.currentDetail
  5. );

将比较好的diffResults这个二维数组进行解析拼接成富文本

  1. import { CHANGE_EVENT_TYPE } from "@/constant/services/detail";
  2. import { DOG_TEXT, DOG_TYPE } from '@/constant/services/detail';
  3. import diff from "@/utils/diff";
  4. /**
  5. * 高亮变更的内容
  6. * @param {{Array.<Array.<number|string>>}} diffResults diff后的结果 为一个二维数组
  7. * @return {String} 返回高亮的富文本片段
  8. */
  9. const useHighlightCurrentDetail = (diffResults) => {
  10. const richTextFragments = [];
  11. const { DIFF_IDENTIFIER } = diff;
  12. for (let i = 0; i < diffResults.length; i++) {
  13. const [identifier, text] = diffResults[i];
  14. switch (identifier) {
  15. case DIFF_IDENTIFIER.INSERTION:
  16. richTextFragments.push(`<em class="highlight-insertion">${text}</em>`);
  17. break;
  18. case DIFF_IDENTIFIER.DELETION:
  19. richTextFragments.push(`<del class="highlight-deletion">${text}</del>`);
  20. break;
  21. case DIFF_IDENTIFIER.EQUALITY:
  22. richTextFragments.push(text);
  23. break;
  24. default:
  25. break;
  26. }
  27. }
  28. return richTextFragments.join("");
  29. };

提前定义好高亮的样式,然后进行拼接即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/132645?site
推荐阅读
相关标签
  

闽ICP备14008679号