|
10 | 10 | > |
11 | 11 | <div |
12 | 12 | class="vue-diff-viewer-inner" |
13 | | - :style="{ minHeight: minHeight ? minHeight + 'px' : undefined }" |
| 13 | + :style="{ minHeight }" |
14 | 14 | > |
15 | 15 | <Line |
16 | 16 | v-for="(data, index) in visible" |
|
19 | 19 | :language="language" |
20 | 20 | :meta="meta[data.index]" |
21 | 21 | :render="render[data.index]" |
22 | | - :virtualScroll="scrollOptions" |
| 22 | + :scrollOptions="scrollOptions" |
23 | 23 | @setLineHeight="setLineHeight" |
24 | 24 | /> |
25 | 25 | </div> |
|
31 | 31 | import { |
32 | 32 | computed, |
33 | 33 | defineComponent, |
34 | | - onMounted, |
35 | 34 | ref, |
36 | | - watch |
| 35 | + toRaw |
37 | 36 | } from 'vue' |
38 | | -import debounce from 'lodash-es/debounce' |
39 | | -import { useVirtualScroll } from './hooks' |
40 | | -import { renderLines } from './utils' |
| 37 | +import { useVirtualScroll, useRender } from './hooks' |
41 | 38 | import Line from './Line.vue' |
42 | 39 |
|
43 | 40 | import type { PropType } from 'vue' |
44 | | -import type { Meta, VirtualScroll, Mode, Theme, Lines } from './types' |
| 41 | +import type { Mode, Theme, VirtualScroll } from './types' |
45 | 42 |
|
46 | 43 | export default defineComponent({ |
47 | 44 | components: { |
@@ -79,45 +76,17 @@ export default defineComponent({ |
79 | 76 | }, |
80 | 77 | setup (props) { |
81 | 78 | const viewer = ref<null|HTMLElement>(null) |
82 | | - const meta = ref<Array<Meta>>([]) |
83 | | - const render = ref<Array<Lines>>([]) |
84 | | - const visible = computed(() => meta.value.filter(item => item.visible)) |
85 | | - const { minHeight, scrollOptions, setMeta } = useVirtualScroll({ |
86 | | - meta, |
87 | | - viewer, |
88 | | - virtualScroll: props.virtualScroll, |
89 | | - render |
90 | | - }) |
91 | | -
|
92 | | - const setData = () => { |
93 | | - render.value = renderLines(props.mode, props.prev, props.current) |
94 | | - meta.value.splice(render.value.length) |
95 | | - render.value.map((v, index: number) => { |
96 | | - const item = meta.value[index] |
97 | | - meta.value[index] = { |
98 | | - index, |
99 | | - visible: item?.visible || !props.virtualScroll, |
100 | | - top: item?.top || undefined, |
101 | | - height: item?.height || 24 |
102 | | - } |
103 | | - }) |
104 | | - setMeta() |
105 | | - } |
106 | | -
|
107 | | - onMounted(() => { |
108 | | - watch( |
109 | | - [ |
110 | | - () => props.mode, |
111 | | - () => props.prev, |
112 | | - () => props.current |
113 | | - ], |
114 | | - debounce(setData, props.inputDelay), |
115 | | - { |
116 | | - immediate: true, |
117 | | - deep: true |
118 | | - } |
119 | | - ) |
| 79 | + const scrollOptions = computed(() => { |
| 80 | + if (!props.virtualScroll) return false |
| 81 | + return { |
| 82 | + height: 500, |
| 83 | + lineMinHeight: 24, |
| 84 | + scrollDelay: 250, |
| 85 | + ...(typeof props.virtualScroll === 'object' ? toRaw(props.virtualScroll) : {}) |
| 86 | + } |
120 | 87 | }) |
| 88 | + const { meta, render, visible } = useRender(props, viewer, scrollOptions) |
| 89 | + const { minHeight } = useVirtualScroll(props, viewer, scrollOptions, meta) |
121 | 90 |
|
122 | 91 | const setLineHeight = (index: number, height: number) => { |
123 | 92 | if (meta.value[index]) { |
|
0 commit comments