更新记录
1.0.0(2026-09-15) 下载此版本
初版
平台兼容性
其他
| 多语言 | 暗黑模式 | 宽屏模式 |
|---|---|---|
| √ | √ | √ |
SL-WX-TextDiff 文本对比组件
组件简介
基于 LCS(最长公共子序列)算法实现的字符级文本对比组件。左右两个输入框分别输入文本,组件自动计算差异并以红/绿色高亮标记不一致的字符,同时输出差异字符数、相同字符数和相似度百分比。H5 / 微信小程序通用。
设计说明:组件内置输入框与对比结果展示,差异结果通过
left/right两个具名插槽暴露分段数据(segments),业务侧可完全自定义结果渲染样式。
目录结构
components/SL-WX-TextDiff
└── SL-WX-TextDiff.vue
核心特性
- LCS 字符级 Diff:基于动态规划求最长公共子序列,回溯得出精确的增删差异,而非简单的逐位比较。
- 双栏对比展示:左侧红色背景显示文本1(标记删除/变更字符),右侧绿色背景显示文本2(标记新增/变更字符),前缀
-/+标识操作类型。 - 连续段合并:相邻的同类型字符自动合并为一段,避免逐字符碎片化渲染。
- 相似度统计:底部显示差异字符数、相同字符数、相似度百分比(
相同字符 / max(len1, len2) × 100)。 - 主题色可配置:
diffColor1/diffColor2分别控制左右两侧差异高亮色。 - 插槽自定义:
left/right两个具名插槽透传segments和text,可完全替换默认渲染。
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
text1 |
String | '' |
左侧文本,支持 .sync / v-model 双向绑定 |
text2 |
String | '' |
右侧文本,支持 .sync / v-model 双向绑定 |
label1 |
String | '文本1' |
左侧输入框标签 |
label2 |
String | '文本2' |
右侧输入框标签 |
placeholder1 |
String | '请输入文本1' |
左侧输入框占位提示 |
placeholder2 |
String | '请输入文本2' |
右侧输入框占位提示 |
diffColor1 |
String | '#f8d7da' |
左侧差异字符高亮背景色 |
diffColor2 |
String | '#d4edda' |
右侧差异字符高亮背景色 |
showStats |
Boolean | true |
是否显示底部统计信息行 |
Events
| 事件名 | 参数 | 说明 |
|---|---|---|
update:text1 |
String — 更新后的文本1 |
文本1变化时触发 |
update:text2 |
String — 更新后的文本2 |
文本2变化时触发 |
change |
{ text1: String, text2: String } |
任一文本变化时触发 |
Slots
| 插槽名 | 作用域参数 | 说明 |
|---|---|---|
left |
{ segments: Array, text: String } |
自定义左侧(文本1)对比结果渲染 |
right |
{ segments: Array, text: String } |
自定义右侧(文本2)对比结果渲染 |
segments 数据结构
[
{ text: '相同内容', type: 'same' },
{ text: '差异内容', type: 'diff' },
{ text: '又相同了', type: 'same' }
]
type === 'same':两段文本中相同的字符段type === 'diff':仅存在于当前侧的差异字符段
使用示例
示例 1:基础用法
<template>
<sl-wx-text-diff
:text1="text1"
:text2="text2"
@update:text1="text1 = $event"
@update:text2="text2 = $event"
/>
</template>
<script>
import SlWxTextDiff from '@/components/SL-WX-TextDiff/SL-WX-TextDiff.vue'
export default {
components: { SlWxTextDiff },
data() {
return {
text1: '今天天气真好,适合出去散步',
text2: '今天天气很好,适合出去走走'
}
}
}
</script>
示例 2:自定义差异色
<sl-wx-text-diff
:text1="text1"
:text2="text2"
diff-color1="#ffe0e0"
diff-color2="#d0f0c0"
@update:text1="text1 = $event"
@update:text2="text2 = $event"
/>
示例 3:插槽自定义渲染
<sl-wx-text-diff :text1="text1" :text2="text2">
<template v-slot:left="{ segments }">
<view class="my-bar">
<text
v-for="(seg, i) in segments"
:key="i"
:class="{ 'my-diff': seg.type === 'diff' }"
>{{ seg.text }}</text>
</view>
</template>
<template v-slot:right="{ segments }">
<view class="my-bar my-bar--right">
<text
v-for="(seg, i) in segments"
:key="i"
:class="{ 'my-add': seg.type === 'diff' }"
>{{ seg.text }}</text>
</view>
</template>
</sl-wx-text-diff>
注意事项
-
LCS 算法复杂度:时间复杂度 O(m×n),m/n 分别为两段文本长度。对于极长文本(数千字符以上)可能出现性能瓶颈,建议控制在合理长度内使用。
-
相似度计算:公式为
相同字符数 / max(text1长度, text2长度) × 100,两段文本完全相同时为 100%,完全不同时为 0%。 -
空文本处理:两段文本均为空时,segments 返回空数组,相似度显示 100%。
-
双向绑定:推荐使用
@update:text1/@update:text2事件配合手动赋值,或使用.sync修饰符(Vue 2)。

收藏人数:
下载插件并导入HBuilderX
赞赏(0)
下载 108
赞赏 1
下载 12603411
赞赏 1949
赞赏
京公网安备:11010802035340号