Vue:使用vue-codemirror编写文本比对功能
1.问题描述:对两个文件的文本进行差异比对,文件大小为:小于5M。
2.前端组件调研:
①vue-code-diff:优点:该组件可一次渲染所有差异(差异行有红色和绿色的背景色),差异一目了然。缺点:文本量大时,例如10000行,页面直接崩溃,所以该组件不适合数据量大的文本。不符合要求。
②vue-codemirror :优点:vue-codemirror搭配diff-match-patch可进行大数据量的文本比对(几百万行也不在话下)。缺点:滚动渲染,不会一次渲染所有差异,而是滚动到哪里,稍停片刻,或者缓慢滚动,才会看到差异(差异行有淡黄色背景色,差异文字有红色和绿色波浪线)。所以,拖动滚动条过快时,可能差异还没渲染出来,就已经滚动过去了,不能一目了然的知道有几处差异。
3.解决方案:鉴于vue-code-diff对大数据量不不友好,直接pass掉。选用vue-codemirror搭配diff-match-patch。为了改善“滚动渲染,不会一次渲染所有差异,不能一目了然的知道有几处差异”的缺点,增加文字描述,示例如下:共4处差异,每处差异的开始行号为:2、589、2904、12328。这样用户可拖动滚动条到这些行,当滚动停止时,差异渲染出来,可看到这些行的具体差异。
4.实现效果:
使用codeMorror进行文本比对
使用codeMirror实现文本比对
5.实现步骤如下:
(1)安装插件
npm install vue-codemirror@4.0.6 -S
npm install diff-match-patch -S
(2)导入包
import { codemirror } from "vue-codemirror";
require("codemirror/mode/javascript/javascript.js");
import CodeMirror from "codemirror";
import "codemirror/lib/codemirror.css";
import "codemirror/addon/merge/merge.js"
import "codemirror/addon/merge/merge.css"
import DiffMatchPatch from "diff-match-patch";
window.diff_match_patch = DiffMatchPatch;
window.DIFF_DELETE = -1;
window.DIFF_INSERT = 1;
window.DIFF_EQUAL = 0;
(3)template中
<div><div>{{ diffDescription }}</div><div ref="contrastDiv"></div>
</div>
(4)script中
data() {return {leftText: "", //左侧展示文本rightText: "", //右侧展示文本diffDescription: "", //差异内容描述};},mounted() {this.prepareData()this.contrast();},methods: {prepareData(){for(let i=0;i<10;i++){this.leftText+='a\n'this.rightText+='b\n'}for(let i=0;i<100;i++){this.leftText+='a\n'this.rightText+='a\n'}for(let i=0;i<10;i++){this.leftText+='abbbbbbbbbbfadsfasfasfasfasfadsfadsfds\n'this.rightText+='bweefdrrsxsssffasfsadfadsfadsfadsfasdfa\n'}for(let i=0;i<10000;i++){this.leftText+='bbb\n'this.rightText+='bbb\n'}for(let i=0;i<10;i++){this.leftText+='a\n'this.rightText+='b\n'}},contrast() {this.$nextTick(() => {const target = this.$refs.contrastDiv;target.innerHTML = "";let difference = CodeMirror.MergeView(target, {value: this.leftText,originLeft: null,orig: this.rightText,lineNumbers: true,mode: "text/html",hightlightDifference: true,connect: "align",readOnly: true,theme: "dracula",smartIndent: true,});let diffCount = difference.right.chunks.length;console.log(diffCount)let description = "";if (diffCount === 0) {description = "左右文本内容一致";} else if (diffCount === 1) {description ="共1处差异,差异的开始行号为:" +(difference.right.chunks[0].origFrom + 1);} else {description = "共" + diffCount + "处差异,每处差异的开始行号为:";for (let i = 0; i < diffCount; i++) {description += difference.right.chunks[i].origFrom + 1;if (i !== diffCount - 1) {description += "、";}}}this.diffDescription=description});},},
有需要的小伙伴快去试试吧!
Vue:使用vue-codemirror编写文本比对功能相关推荐
- Vue的常用指令(v-html {{}}文本插值,v-bind绑定属性,v-if条件渲染,v-for列表渲染,v-on @ 事件绑定,v-model表单绑定)
Vue的常用指令(文本插值,绑定属性,条件渲染,列表渲染,事件绑定,表单绑定) Vue 的介绍 Vue 是一套构建用户界面的渐进式前端框架. 只关注视图层,并且非常容易学习,还可以很方便的与其它库或已 ...
- vue中使用CodeMirror解析yaml语言
vue中使用CodeMirror解析yaml语言 一.CodeMirror插件使用 1.CodeMirror插件安装 二.CodeMirror基本配置 三.CodeMirror具体使用 1.首先创建一 ...
- 基于 Vue 的移动端富文本编辑器 vue-quill-editor 实战
优秀的富文本编辑器有很多,比如:UEditor,wangEditor 等,但并不是每个都能在移动端有很好的表现. 我们暂且不讨论移动端是否真的需要富文本,既然有这需求,就把它实现出来. 失败的尝试 正 ...
- vue使用marked解析markdown文本遇到的坑及解决方法
vue使用marked解析markdown文本遇到的坑及解决方法 1. 前言 最近在搭建自己的博客网站 https://lyuanzhi.com,不免遇到了要把markdown文本转化为html代码的 ...
- Vue中使用quill富文本
安装 npm install vue-quill-editor --save 挂载 vue-quill-editor 插件 全局挂载 import Vue from 'vue' import VueQ ...
- Vue 中引入markdown富文本编辑器并根据md格式渲染
Vue 中引入markdown富文本编辑器 在vue组件中,比较好用的是mavon-editor,github文档地址 https://github.com/hinesboy/mavonEditor ...
- vue中使用element-tiptap富文本编辑器
element-tiptap富文本编辑器 npm安装 npm install element-tiptap --save yarn安装 yarn add element-tiptap 全局引入 imp ...
- Vue项目中tinymce富文本的安装以及配置
Vue项目中tinymce富文本的安装以及配置 对于目前网上存在的许多富文本插件中,个人还是觉得tinymce相对比较强大一些.在使用配置的过程中,可能会出现配置不完全,导致使用不了的情况,下面把我个 ...
- vue h5 端实现富文本图片预览(基于 Vant UI 的 ImagePreview 组件)
文章目录 vue h5 端实现富文本图片预览(基于 Vant UI 的 ImagePreview 组件) 预览效果 关键代码 使用案例 vue h5 端实现富文本图片预览(基于 Vant UI 的 I ...
最新文章
- 剑指offer:面试题07. 重建二叉树
- CORD重构边缘DC 开源社区推动多项研究将落地
- 龙蜥降世,神龙升级,阿里云投入 20 亿发力操作系统
- Python 三十大实践、建议和技巧(附代码链接)
- 朴素贝叶斯法(二)——基本方法
- 详解Node.js包的工程目录与NPM包管理器的使用_node.js
- C. Little Girl and Maximum Sum【差分 / 贪心】
- 计算机网络-思维导图(5)传输层
- c# 蓝牙虚拟串口_蓝牙模块——基础知识介绍
- 测试环境服务器硬盘塞满问题排查
- Python面向对象之反射
- Jmeter接口性能测试分布式的环境搭建
- 小红书种草营销的本质是什么?如何投入更有效?
- html表格背景图片格式,CSS常见样式(二)——列表,背景,边框,行高,表格,vertical-align...
- bzoj 4816 [Sdoi2017]数字表格——反演
- caution: filename not matched:xxx
- 图机器学习——2.1 节点嵌入:基于随机游走
- Deep Domain Confusion:Maximinzing for Domain Invariance阅读笔记
- android 华为mate 获取定位权限,【严重安全问题】开启了定位权限,但是软件还是没权限...
- 腾讯爬虫python_【Python爬虫+js逆向】Python爬取腾讯漫画!
热门文章
- 年处理两万亿条环保数据,埃睿迪要做中国最懂环保的大数据公司
- Unity 5 物理
- Android开发者选项之GPU过度绘制
- Windows 10 休眠后自动开机
- 匠人精神打磨六年 “中国制造” Hubble自然走向AI-Native数据库
- MySQL 监控(MySQL Monitoring )
- 国内云服务器厂商该怎么选择?那个比较好?
- QQ以及微信中当前网页提示已停止访问该如何解决,如何能恢复访问?
- 如何将风险应用加入白名单_我告诉你风险应用白名单怎么设置
- linux各个文件夹作用是什么,我的世界游戏文件夹目录作用介绍 各个文件夹都是什么用...