|
62 | 62 | var keeps = this.remain + (this.bench || this.remain) |
63 | 63 |
|
64 | 64 | this.delta = { |
| 65 | + direction: '', // current scroll direction, D: down, U: up. |
| 66 | + scrollTop: 0, // current scroll top, use to direction. |
65 | 67 | start: start, // start index. |
66 | 68 | end: start + keeps - 1, // end index. |
67 | 69 | keeps: keeps, // nums keeping in real dom. |
|
75 | 77 | } |
76 | 78 | }, |
77 | 79 |
|
| 80 | + // use alter to identify which prop change. |
78 | 81 | watch: { |
79 | 82 | size: function () { |
80 | 83 | this.alter = 'size' |
|
106 | 109 | var vsl = this.$refs.vsl |
107 | 110 | var offset = (vsl.$el || vsl).scrollTop || 0 |
108 | 111 |
|
| 112 | + delta.direction = offset > delta.scrollTop ? 'D' : 'U' |
| 113 | + delta.scrollTop = offset |
| 114 | + |
109 | 115 | if (delta.total > delta.keeps) { |
110 | 116 | this.updateZone(offset) |
111 | 117 | } else { |
|
133 | 139 |
|
134 | 140 | // update render zone by scroll offset. |
135 | 141 | updateZone: function (offset) { |
| 142 | + var delta = this.delta |
136 | 143 | var overs = this.variable |
137 | 144 | ? this.getVarOvers(offset) |
138 | 145 | : Math.floor(offset / this.size) |
139 | 146 |
|
140 | | - var delta = this.delta |
| 147 | + // if scroll up, we'd better decrease it's numbers. |
| 148 | + if (delta.direction === 'U') { |
| 149 | + overs = overs - this.remain + 1 |
| 150 | + } |
| 151 | + |
141 | 152 | var zone = this.getZone(overs) |
142 | 153 | var bench = this.bench || this.remain |
143 | 154 |
|
|
160 | 171 | } |
161 | 172 | }, |
162 | 173 |
|
| 174 | + // return the right zone info base on `start/index`. |
| 175 | + getZone: function (index) { |
| 176 | + var start, end |
| 177 | + var delta = this.delta |
| 178 | + |
| 179 | + index = parseInt(index, 10) |
| 180 | + index = Math.max(0, index) |
| 181 | + |
| 182 | + var lastStart = delta.total - delta.keeps |
| 183 | + var isLast = (index <= delta.total && index >= lastStart) || (index > delta.total) |
| 184 | + if (isLast) { |
| 185 | + end = delta.total - 1 |
| 186 | + start = Math.max(0, lastStart) |
| 187 | + } else { |
| 188 | + start = index |
| 189 | + end = start + delta.keeps - 1 |
| 190 | + } |
| 191 | + |
| 192 | + return { |
| 193 | + end: end, |
| 194 | + start: start, |
| 195 | + isLast: isLast |
| 196 | + } |
| 197 | + }, |
| 198 | + |
163 | 199 | // public method, force render ui list if we needed. |
164 | 200 | // call this before the next repaint to get better performance. |
165 | 201 | forceRender: function () { |
|
292 | 328 | this.getVarOffset(index, true) |
293 | 329 | }, |
294 | 330 |
|
295 | | - // return the right zone info base on `start/index`. |
296 | | - getZone: function (index) { |
297 | | - var start, end |
298 | | - var delta = this.delta |
299 | | - |
300 | | - index = parseInt(index, 10) |
301 | | - index = Math.max(0, index) |
302 | | - |
303 | | - var lastStart = delta.total - delta.keeps |
304 | | - var isLast = (index <= delta.total && index >= lastStart) || (index > delta.total) |
305 | | - if (isLast) { |
306 | | - end = delta.total - 1 |
307 | | - start = Math.max(0, lastStart) |
308 | | - } else { |
309 | | - start = index |
310 | | - end = start + delta.keeps - 1 |
311 | | - } |
312 | | - |
313 | | - return { |
314 | | - end: end, |
315 | | - start: start, |
316 | | - isLast: isLast |
317 | | - } |
318 | | - }, |
319 | | - |
320 | 331 | // trigger a props event on parent. |
321 | 332 | fireEvent: function (event) { |
322 | 333 | if (this[event]) { |
|
0 commit comments