|
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