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.js结合SortableJS实现树形数据拖拽

    Vue.js结合SortableJS实现树形数据拖拽

    本文主要介绍了Vue.js结合SortableJS实现树形数据拖拽,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Vue 菜单栏点击切换单个class(高亮)的方法

    Vue 菜单栏点击切换单个class(高亮)的方法

    今天小编就为大家分享一篇Vue 菜单栏点击切换单个class(高亮)的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 如何巧用Vue缓存函数浅析

    如何巧用Vue缓存函数浅析

    有时候不希望已经请求过的数据,再次请求重复执行刷新操作,我们就需要使用数据缓存,这篇文章主要给大家介绍了关于如何巧用Vue缓存函数的相关资料,需要的朋友可以参考下
    2021-09-09
  • vue3+vite项目跨域配置踩坑实战篇

    vue3+vite项目跨域配置踩坑实战篇

    vue3是一个流行的前端框架,vite是一个快速的构建工具,下面这篇文章主要给大家介绍了关于vue3+vite项目跨域配置踩坑实战的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • vue+vant 上传图片需要注意的地方

    vue+vant 上传图片需要注意的地方

    这篇文章主要介绍了vue+vant 上传图片需要注意的地方,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下
    2021-01-01
  • vue实现顶部左右滑动导航

    vue实现顶部左右滑动导航

    这篇文章主要为大家详细介绍了vue实现顶部左右滑动导航,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Vue router 路由安装及使用过程

    Vue router 路由安装及使用过程

    vue-router 是 Vue 的一个插件库,适用于构建单页面应用,这篇文章主要介绍了Vue router 路由安装以及使用,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • vue 对axios get pust put delete封装的实例代码

    vue 对axios get pust put delete封装的实例代码

    在本篇文章里我们给各位整理的是一篇关于vue 对axios get pust put delete封装的实例代码内容,有需要的朋友们可以参考下。
    2020-01-01
  • vue3中ref绑定dom或者组件失败的原因及分析

    vue3中ref绑定dom或者组件失败的原因及分析

    这篇文章主要介绍了vue3中ref绑定dom或者组件失败的原因及分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • vue-cli webpack 开发环境跨域详解

    vue-cli webpack 开发环境跨域详解

    本篇文章主要介绍了vue-cli webpack 开发环境跨域详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05

最新评论