|
52 | 52 |
|
53 | 53 | created: function () { |
54 | 54 | var start = this.start >= this.remain ? this.start : 0 |
55 | | - var height = this.size * this.remain |
56 | | - var bench = this.bench || this.remain |
57 | | - var keeps = this.remain + bench |
| 55 | + var keeps = this.remain + (this.bench || this.remain) |
58 | 56 |
|
59 | 57 | this.delta = { |
60 | 58 | start: start, // start index. |
61 | 59 | end: start + keeps, // end index. |
62 | 60 | keeps: keeps, // nums keeping in real dom. |
63 | | - bench: bench, // nums scroll pass should force update. |
64 | 61 | total: 0, // all items count, update in render filter. |
65 | 62 | offset: 0, // cache scrollTop offset. |
66 | 63 | direct: 'd', // cache scroll direction. |
67 | | - height: height, // container wrapper viewport height. |
68 | 64 | fireTime: 0, // cache last event fire time avoid compact. |
69 | 65 | paddingTop: 0, // container wrapper real padding-top. |
70 | 66 | paddingBottom: 0, // container wrapper real padding-bottom. |
|
82 | 78 | }, |
83 | 79 |
|
84 | 80 | watch: { |
85 | | - start: function (index) { |
86 | | - var delta = this.delta |
87 | | - var zone = this.getZone(index) |
88 | | - |
89 | | - var scrollTop = this.variable |
90 | | - ? this.getVarOffset(zone.overflow ? delta.total : zone.start) |
91 | | - : zone.overflow ? delta.total * this.size : zone.start * this.size |
92 | | - |
93 | | - delta.end = zone.end |
94 | | - delta.start = zone.start >= this.remain ? zone.start : 0 |
95 | | - |
96 | | - this.$forceUpdate() |
97 | | - Vue2.nextTick(this.setScrollTop.bind(this, scrollTop)) |
| 81 | + start: function () { |
| 82 | + this.alter = 'start' |
| 83 | + }, |
| 84 | + remain: function () { |
| 85 | + this.alter = 'remain' |
| 86 | + }, |
| 87 | + bench: function () { |
| 88 | + this.alter = 'bench' |
98 | 89 | } |
99 | 90 | }, |
100 | 91 |
|
|
134 | 125 |
|
135 | 126 | var delta = this.delta |
136 | 127 | var zone = this.getZone(overs) |
| 128 | + var bench = this.bench || this.remain |
137 | 129 |
|
138 | 130 | // for better performance, if scroll pass items within now bench, do not update. |
139 | | - if (!zone.overflow && (overs > delta.start) && (overs - delta.start <= delta.bench)) { |
| 131 | + if (!zone.overflow && (overs > delta.start) && (overs - delta.start <= bench)) { |
140 | 132 | return |
141 | 133 | } |
142 | 134 |
|
|
234 | 226 | // avoid overflow range. |
235 | 227 | isOverflow: function (start) { |
236 | 228 | var delta = this.delta |
237 | | - var overflow = (delta.total > delta.keeps) && (start + this.remain >= delta.total) |
| 229 | + var overflow = (delta.total > delta.keeps && start + this.remain >= delta.total) || (start >= delta.total) |
238 | 230 | if (overflow && delta.direct === 'd') { |
239 | 231 | this.triggerEvent('tobottom') |
240 | 232 | } |
|
263 | 255 | // if overflow range return the last zone. |
264 | 256 | if (overflow) { |
265 | 257 | end = delta.total |
266 | | - start = delta.total - delta.keeps |
| 258 | + start = Math.max(0, delta.total - delta.keeps) |
267 | 259 | } else { |
268 | 260 | start = index |
269 | 261 | end = start + delta.keeps |
|
313 | 305 | } |
314 | 306 | }, |
315 | 307 |
|
| 308 | + // update delta and zone when prorps change. |
| 309 | + beforeUpdate: function () { |
| 310 | + var delta = this.delta |
| 311 | + delta.keeps = this.remain + (this.bench || this.remain) |
| 312 | + |
| 313 | + var alterStart = this.alter === 'start' |
| 314 | + var oldStart = alterStart ? this.start : delta.start |
| 315 | + var zone = this.getZone(oldStart) |
| 316 | + |
| 317 | + // if changing start, update scroll position after update. |
| 318 | + if (alterStart) { |
| 319 | + this.$nextTick(this.setScrollTop.bind(this, this.variable |
| 320 | + ? this.getVarOffset(zone.overflow ? delta.total : zone.start) |
| 321 | + : zone.overflow ? delta.total * this.size : zone.start * this.size) |
| 322 | + ) |
| 323 | + } |
| 324 | + |
| 325 | + // if points out difference, force update once again. |
| 326 | + if (oldStart !== zone.start || this.alter) { |
| 327 | + this.alter = '' |
| 328 | + delta.end = zone.end |
| 329 | + delta.start = zone.start |
| 330 | + this.$forceUpdate() |
| 331 | + } |
| 332 | + }, |
| 333 | + |
316 | 334 | render: function (h) { |
317 | 335 | var list = this.filter() |
318 | 336 | var delta = this.delta |
|
323 | 341 | 'style': { |
324 | 342 | 'display': 'block', |
325 | 343 | 'overflow-y': 'auto', |
326 | | - 'height': delta.height + 'px' |
| 344 | + 'height': this.size * this.remain + 'px' |
327 | 345 | }, |
328 | 346 | 'on': { |
329 | 347 | 'scroll': dbc ? _debounce(this.onScroll.bind(this), dbc) : this.onScroll |
|
0 commit comments