Vue如何比较字符串变化并高亮变化的部分

 更新时间:2023年12月29日 08:40:22   作者:williamyi74  
这篇文章主要介绍了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工具类.用来封装:

// 因为导出的构造函数为下划线命名,这里改为驼峰
import { diff_match_patch as DiffMatchPatch } from 'diff_match_patch';
 
const createDiffMatchPatch = () => {
    const diffMatchPatch = new DiffMatchPatch();
    const DIFF_IDENTIFIER = {
        INSERTION: 1, // 新增的
        DELETION: -1, // 删除的
        EQUALITY: 0, // 公共的
    }
    return {
        DIFF_IDENTIFIER,
        /**
         * diff字符串的变更
         * @param {String} prevText 上一次的内容
         * @param {String} currentText 这次要diff的内容
         * @return {{Array.<Array.<number|string>>}} diff后的结果 为一个二维数组
         */
        diffText(prevText, currentText) {
            const diffResults = diffMatchPatch.diff_main(prevText, currentText);
            return diffResults;
        },
    }
}
// 初始化后导出
export default createDiffMatchPatch();

使用时直接导入:

import diff from "@/utils/diff";
            const diffResults = diff.diffText(
              record.prevDetail,
              record.currentDetail
            );

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

import { CHANGE_EVENT_TYPE } from "@/constant/services/detail";
import { DOG_TEXT, DOG_TYPE } from '@/constant/services/detail';
import diff from "@/utils/diff";
 
/**
 * 高亮变更的内容
 * @param {{Array.<Array.<number|string>>}} diffResults diff后的结果 为一个二维数组
 * @return {String} 返回高亮的富文本片段
 */
const useHighlightCurrentDetail = (diffResults) => {
    const richTextFragments = [];
    const { DIFF_IDENTIFIER } = diff;
    for (let i = 0; i < diffResults.length; i++) {
        const [identifier, text] = diffResults[i];
        switch (identifier) {
            case DIFF_IDENTIFIER.INSERTION:
                richTextFragments.push(`<em class="highlight-insertion">${text}</em>`);
                break;
            case DIFF_IDENTIFIER.DELETION:
                richTextFragments.push(`<del class="highlight-deletion">${text}</del>`);
                break;
            case DIFF_IDENTIFIER.EQUALITY:
                richTextFragments.push(text);
                break;
            default:
                break;
        }
    }
    return richTextFragments.join("");
};

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue serve及其与vue-cli-service serve之间的关系解读

    vue serve及其与vue-cli-service serve之间的关系解读

    这篇文章主要介绍了vue serve及其与vue-cli-service serve之间的关系,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue+canvas实现视频截图功能

    Vue+canvas实现视频截图功能

    这篇文章主要为大家详细介绍了Vue+canvas实现视频截图功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Vue如何循环提取对象数组中的值

    Vue如何循环提取对象数组中的值

    这篇文章主要介绍了Vue如何循环提取对象数组中的值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • vue视图不更新情况详解

    vue视图不更新情况详解

    这篇文章主要介绍了vue视图不更新情况详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • webpack4打包vue前端多页面项目

    webpack4打包vue前端多页面项目

    这篇文章主要介绍了webpack4打包vue前端多页面项目的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • vscode 开发Vue项目的方法步骤

    vscode 开发Vue项目的方法步骤

    这篇文章主要介绍了vscode 开发Vue项目的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • vue axios用法教程详解

    vue axios用法教程详解

    axios是vue-resource后出现的Vue请求数据的插件。下面我们通过本文给大家介绍vue axios用法教程详解,感兴趣的朋友一起看看吧
    2017-07-07
  • Vuejs实现购物车功能

    Vuejs实现购物车功能

    这篇文章主要为大家详细介绍了Vuejs实现购物车功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • Vue.js中extend选项和delimiters选项的比较

    Vue.js中extend选项和delimiters选项的比较

    这篇文章主要介绍了Vue.js中extend选项和delimiters选项的比较的相关资料,需要的朋友可以参考下
    2017-07-07
  • Vue虚拟dom被创建的方法

    Vue虚拟dom被创建的方法

    这篇文章主要介绍了Vue虚拟dom是如何被创建的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10

最新评论