@@ -49,6 +49,10 @@ export default {
49
49
type: Number ,
50
50
default: null ,
51
51
},
52
+ keyField: {
53
+ type: String ,
54
+ default: null ,
55
+ },
52
56
},
53
57
54
58
data () {
@@ -104,7 +108,7 @@ export default {
104
108
},
105
109
106
110
methods: {
107
- addView (index , item ) {
111
+ addView (pool , index , item , key , type ) {
108
112
const view = {
109
113
item,
110
114
top: 0 ,
@@ -113,18 +117,20 @@ export default {
113
117
id: uid++ ,
114
118
index,
115
119
used: true ,
120
+ key,
121
+ type,
116
122
}
117
123
Object .defineProperty (view, ' nr' , {
118
124
configurable: false ,
119
125
value: nonReactive,
120
126
})
121
- this . pool .push (view)
127
+ pool .push (view)
122
128
return view
123
129
},
124
130
125
131
unuseView (view , fake = false ) {
126
132
const unusedViews = this .$_unusedViews
127
- const type = view .item [ this . typeField ]
133
+ const type = view .nr . type
128
134
let unusedPool = unusedViews .get (type)
129
135
if (! unusedPool) {
130
136
unusedPool = []
@@ -134,7 +140,7 @@ export default {
134
140
if (! fake) {
135
141
view .nr .used = false
136
142
view .top = - 9999
137
- this .$_views .delete (view .item )
143
+ this .$_views .delete (view .nr . key )
138
144
}
139
145
},
140
146
@@ -183,6 +189,7 @@ export default {
183
189
184
190
const itemHeight = this .itemHeight
185
191
const typeField = this .typeField
192
+ const keyField = this .keyField
186
193
const items = this .items
187
194
const count = items .length
188
195
const heights = this .heights
@@ -246,7 +253,7 @@ export default {
246
253
247
254
let view
248
255
249
- const continuous = startIndex < this .$_endIndex && endIndex > this .$_startIndex
256
+ const continuous = startIndex <= this .$_endIndex && endIndex >= this .$_startIndex
250
257
let unusedIndex
251
258
252
259
if (this .$_continuous !== continuous) {
@@ -264,7 +271,9 @@ export default {
264
271
view = pool[i]
265
272
if (view .nr .used ) {
266
273
// Update view item index
267
- if (checkItem) view .nr .index = items .indexOf (view .item )
274
+ if (checkItem) view .nr .index = items .findIndex (
275
+ item => keyField ? item[keyField] == view .item [keyField] : item === view .item
276
+ )
268
277
269
278
// Check if index is still in visible range
270
279
if (
@@ -286,7 +295,8 @@ export default {
286
295
let v
287
296
for (let i = startIndex; i < endIndex; i++ ) {
288
297
item = items[i]
289
- view = views .get (item)
298
+ const key = keyField ? item[keyField] : item
299
+ view = views .get (key)
290
300
291
301
if (! itemHeight && ! heights[i].height ) {
292
302
if (view) this .unuseView (view)
@@ -305,8 +315,10 @@ export default {
305
315
view .item = item
306
316
view .nr .used = true
307
317
view .nr .index = i
318
+ view .nr .key = key
319
+ view .nr .type = type
308
320
} else {
309
- view = this .addView (i, item, type)
321
+ view = this .addView (pool, i, item, key , type)
310
322
}
311
323
} else {
312
324
unusedPool = unusedViews .get (type)
@@ -319,14 +331,16 @@ export default {
319
331
view .item = item
320
332
view .nr .used = true
321
333
view .nr .index = i
334
+ view .nr .key = key
335
+ view .nr .type = type
322
336
unusedIndex .set (type, v + 1 )
323
337
} else {
324
- view = this .addView (i, item, type)
338
+ view = this .addView (pool, i, item, key , type)
325
339
this .unuseView (view, true )
326
340
}
327
341
v++
328
342
}
329
- views .set (item , view)
343
+ views .set (key , view)
330
344
} else {
331
345
view .nr .used = true
332
346
}
0 commit comments