Skip to content

Commit 343832c

Browse files
committed
feat: add prop syncScroll
1 parent 48886b1 commit 343832c

5 files changed

Lines changed: 92 additions & 45 deletions

File tree

README-zh.md

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ import {createApp} from 'vue'
3232
import CodeDiff from 'v-code-diff'
3333

3434
app
35-
.use(CodeDiff)
36-
.mount('#app')
35+
.use(CodeDiff)
36+
.mount('#app')
3737
```
3838

3939
然后
@@ -111,29 +111,30 @@ export default {
111111

112112
# 事件
113113

114-
| 事件名称 | 说明 | 回调参数 |
115-
|---------- |-------- |---------- |
116-
| before-render | 渲染前触发 | - |
117-
| after-render | 渲染后触发 | - |
114+
| 事件名称 | 说明 | 回调参数 |
115+
|---------------|---------|---------- |
116+
| before-render | 渲染前触发 | - |
117+
| after-render | 渲染后触发 | - |
118118

119119
# 参数
120120

121-
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
122-
|---------- |-------- |---------- |------------- |-------- |
123-
| highlight | 控制是否高亮代码| boolean | - | true |
124-
| language | 代码语言,如 `typescript`。不填会自动判断。 [查看全部支持语言](https://github.com/highlightjs/highlight.js/blob/main/SUPPORTED_LANGUAGES.md)| string | - | - |
125-
| old-string| 陈旧的字符串| string | - | - |
126-
| new-string| 新的字符串| string | - | - |
127-
| context| 不同地方上下间隔多少行不隐藏 | number | - | - |
128-
| outputFormat| 展示的方式 | string | line-by-line,side-by-side | line-by-line |
129-
| drawFileList | 展示对比文件列表 | boolean | - | false |
130-
| renderNothingWhenEmpty | 当无对比时不渲染 | boolean | - | false |
131-
| diffStyle | 差异风格, 单词级差异或字母级差异 | string | word, char | word |
132-
| fileName | 文件名 | string | - | - |
133-
| isShowNoChange | 当无对比时展示源代码 | boolean | - | false |
134-
| trim | 移除字符串前后空白字符 | boolean | - | false |
135-
| language | 对比的文本语言 | boolean | - | false |
136-
| noDiffLineFeed | 不 diff windows 换行符(CRLF)与 linux 换行符(LF) | boolean | - | false |
121+
| 参数 | 说明 | 类型 | 可选值 | 默认值 |
122+
|------------------------|-----------------------------------------------------------------------------------------------------------------------|---------- |------------- |--------------|
123+
| highlight | 控制是否高亮代码 | boolean | - | true |
124+
| language | 代码语言,如 `typescript`。不填会自动判断。 [查看全部支持语言](https://github.com/highlightjs/highlight.js/blob/main/SUPPORTED_LANGUAGES.md) | string | - | - |
125+
| old-string | 陈旧的字符串 | string | - | - |
126+
| new-string | 新的字符串 | string | - | - |
127+
| context | 不同地方上下间隔多少行不隐藏 | number | - | - |
128+
| outputFormat | 展示的方式 | string | line-by-line,side-by-side | line-by-line |
129+
| drawFileList | 展示对比文件列表 | boolean | - | false |
130+
| renderNothingWhenEmpty | 当无对比时不渲染 | boolean | - | false |
131+
| diffStyle | 差异风格, 单词级差异或字母级差异 | string | word, char | word |
132+
| fileName | 文件名 | string | - | - |
133+
| isShowNoChange | 当无对比时展示源代码 | boolean | - | false |
134+
| trim | 移除字符串前后空白字符 | boolean | - | false |
135+
| language | 对比的文本语言 | boolean | - | false |
136+
| noDiffLineFeed | 不 diff windows 换行符(CRLF)与 linux 换行符(LF) | boolean | - | false |
137+
| syncScroll | 是否同步滚动 | boolean | - | true |
137138

138139
# 与 vue-code-diff 的不同
139140

@@ -143,14 +144,22 @@ export default {
143144

144145
# 变更记录
145146

147+
### 0.3.11
148+
149+
1. 增加 prop `syncScroll` 用于控制横向滚动条是否同步滚动
150+
151+
### 0.3.10
152+
153+
1. 修复了导出时的类型错误
154+
146155
### 0.3.9
147156

148157
1. 调整 css,让引入的 highlight.js 的样式只在 .d2h-wrapper 内生效
149158

150159
### 0.3.8
151160

152-
1. 样式调整,隐藏 css `d2h-file-header`,对齐 vue-code-diff
153-
2. 添加 prop `noDiffLineFeed`,不 diff windows 换行符(CRLF)与 linux 换行符(LF)
161+
1. 样式调整,隐藏 css `d2h-file-header`,对齐 vue-code-diff
162+
2. 添加 prop `noDiffLineFeed`,不 diff windows 换行符(CRLF)与 linux 换行符(LF)
154163

155164
### 0.3.7
156165

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,14 @@ export default {
149149

150150
# ChangeLog
151151

152+
### 0.3.11
153+
154+
1. Add prop `syncScroll` to control whether the horizontal scroll bar needs to be scrolled synchronously
155+
156+
### 0.3.10
157+
158+
1. Fixed type error when exporting
159+
152160
### 0.3.9
153161

154162
1. Make the imported highlight.js style take effect only in `.d2h-wrapper` div

src/App.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
<a-form-item label="不 diff 换行符(noDiffLineFeed)">
4646
<a-switch v-model:checked="formState.noDiffLineFeed" />
4747
</a-form-item>
48+
<a-form-item label="同步滚动(syncScroll)">
49+
<a-switch v-model:checked="formState.syncScroll" />
50+
</a-form-item>
4851
<a-form-item>
4952
<a-button type="link" @click="resetText">重置文本(reset text)</a-button>
5053
</a-form-item>
@@ -65,6 +68,7 @@
6568
:is-show-no-change="formState.isShowNoChange"
6669
:trim="formState.trim"
6770
:no-diff-line-feed="formState.noDiffLineFeed"
71+
:sync-scroll="formState.syncScroll"
6872
@before-render="renderStart"
6973
@after-render="renderEnd" />
7074
</template>
@@ -97,7 +101,8 @@ export default defineComponent({
97101
renderNothingWhenEmpty: false,
98102
isShowNoChange: false,
99103
trim: false,
100-
noDiffLineFeed: false
104+
noDiffLineFeed: false,
105+
syncScroll: true
101106
})
102107
const renderStart = () => {
103108
console.log('render start: ' + new Date().toLocaleString())

src/lib/v-code-diff/util.ts

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,22 +83,40 @@ export async function highlightElements (element: Element, props, ctx: SetupCont
8383
ctx.emit('after-render')
8484
}
8585

86-
export function syncScroll (selector) {
86+
export function useSyncScroll (selector) {
8787
let active: HTMLElement = document.createElement('div')
88-
document.querySelectorAll(selector).forEach(function (element) {
89-
element.addEventListener('mouseenter', function (e) {
90-
active = e.target
88+
89+
function onScroll (e) {
90+
if (e.target !== active) return
91+
92+
document.querySelectorAll(selector).forEach(function (target) {
93+
if (active === target) return
94+
95+
target.scrollTop = active.scrollTop
96+
target.scrollLeft = active.scrollLeft
9197
})
98+
}
9299

93-
element.addEventListener('scroll', function (e) {
94-
if (e.target !== active) return
100+
function onMouseenter (e) {
101+
active = e.target
102+
}
95103

96-
document.querySelectorAll(selector).forEach(function (target) {
97-
if (active === target) return
104+
function addSyncScroll () {
105+
document.querySelectorAll(selector).forEach(function (element) {
106+
element.addEventListener('mouseenter', onMouseenter)
107+
element.addEventListener('scroll', onScroll)
108+
})
109+
}
98110

99-
target.scrollTop = active.scrollTop
100-
target.scrollLeft = active.scrollLeft
101-
})
111+
function removeSyncScroll () {
112+
document.querySelectorAll(selector).forEach(function (element) {
113+
element.removeEventListener('mouseenter', onMouseenter)
114+
element.removeEventListener('scroll', onScroll)
102115
})
103-
})
116+
}
117+
118+
return {
119+
addSyncScroll,
120+
removeSyncScroll
121+
}
104122
}

src/lib/v-code-diff/v-code-diff.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { defineComponent, isVue3, PropType, h, ref, watch, onUpdated, onMounted } from 'vue-demi'
2-
import { createHtml, highlightElements, syncScroll, useDebounceFn } from '@/lib/v-code-diff/util'
2+
import { createHtml, highlightElements, useDebounceFn, useSyncScroll } from '@/lib/v-code-diff/util'
33
import './styles'
44

55
export default defineComponent({
@@ -56,6 +56,10 @@ export default defineComponent({
5656
noDiffLineFeed: {
5757
type: Boolean,
5858
default: false
59+
},
60+
syncScroll: {
61+
type: Boolean,
62+
default: true
5963
}
6064
},
6165
emits: ['before-render', 'after-render'],
@@ -71,16 +75,19 @@ export default defineComponent({
7175
}
7276
}, 200)
7377
watch(props, cb, { deep: true, immediate: true })
74-
onMounted(() => {
75-
if (props.outputFormat === 'side-by-side') {
76-
syncScroll('.d2h-file-side-diff')
78+
79+
const { addSyncScroll, removeSyncScroll } = useSyncScroll('.d2h-file-side-diff')
80+
watch(() => props.syncScroll, (newVal, oldVal) => {
81+
removeSyncScroll()
82+
if (newVal) {
83+
addSyncScroll()
7784
}
7885
})
79-
onUpdated(() => {
80-
if (props.outputFormat === 'side-by-side') {
81-
syncScroll('.d2h-file-side-diff')
82-
}
86+
87+
onMounted(() => {
88+
addSyncScroll()
8389
})
90+
8491
return {
8592
html
8693
}

0 commit comments

Comments
 (0)