|
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