1
1
<template >
2
- <div id =" app" >
3
- <div class =" counter" >
2
+ <div
3
+ id =" app"
4
+ :class =" {
5
+ 'page-mode': pageMode
6
+ }"
7
+ >
8
+ <div class =" toolbar" >
4
9
<span >
5
10
<input v-model =" countInput" type =" number" min =" 0" max =" 500000" /> items
11
+ <button @click =" addItem()" >+1</button >
6
12
</span >
7
13
<label >
8
14
<input v-model =" enableLetters" type =" checkbox" /> variable height
9
15
</label >
16
+ <label >
17
+ <input v-model =" pageMode" type =" checkbox" /> page mode
18
+ </label >
10
19
<span >
11
20
<input v-model.number =" buffer" type =" number" min =" 1" max =" 500000" /> buffer
12
21
</span >
13
- <span >
22
+ <span v-if = " !recycleList " >
14
23
<input v-model.number =" poolSize" type =" number" min =" 1" max =" 500000" /> poolSize
15
24
</span >
16
- <span v-if =" generateTime !== null" >
17
- Items generation: {{ generateTime }} ms
18
- </span >
19
- <span >
20
- Updates: {{ updateCount }}
21
- </span >
22
25
<span >
23
26
<button @mousedown =" showScroller = !showScroller" >Toggle scroller</button >
24
- <label ><input type =" checkbox" v-model =" scopedSlots" :disabled =" recycleList" /> Scoped slots</label >
27
+ <label v-if = " !recycleList " ><input type =" checkbox" v-model =" scopedSlots" :disabled =" recycleList" /> Scoped slots</label >
25
28
<label ><input type =" checkbox" v-model =" recycleList" /> Use recycle list</label >
26
29
</span >
27
-
28
30
</div >
31
+
29
32
<div class =" content" v-if =" showScroller" >
30
33
<div class =" wrapper" >
31
34
<template v-if =" ! recycleList " >
34
37
v-if =" scopedSlots"
35
38
class =" scroller"
36
39
:item-height =" itemHeight"
37
- :items =" items "
40
+ :items =" list "
38
41
main-tag =" section"
39
42
content-tag =" table"
40
43
:buffer =" buffer"
61
64
v-else
62
65
class =" scroller"
63
66
:item-height =" itemHeight"
64
- :items =" items "
67
+ :items =" list "
65
68
:renderers =" renderers"
66
69
type-field =" type"
67
- key-field =" index "
70
+ key-field =" id "
68
71
main-tag =" section"
69
72
content-tag =" table"
70
73
:buffer =" buffer"
71
74
:pool-size =" poolSize"
72
- emit-update
73
- @update =" onUpdate"
75
+ :page-mode =" pageMode"
74
76
/>
75
77
</template >
76
78
77
- <template >
79
+ <template v-else >
78
80
<recycle-list
79
81
ref =" scroller"
80
82
class =" scroller"
81
- :items =" items "
83
+ :items =" list "
82
84
:item-height =" itemHeight"
83
85
:buffer =" buffer"
86
+ :page-mode =" pageMode"
87
+ key-field =" id"
84
88
>
85
89
<template slot-scope="props">
86
90
<tr
105
109
</template >
106
110
107
111
<script >
108
- import { getData } from ' ./data.js'
112
+ import { getData , addItem } from ' ./data.js'
109
113
110
114
import Letter from ' ./Letter.vue'
111
115
import Item from ' ./Item.vue'
@@ -125,14 +129,12 @@ export default {
125
129
items: [],
126
130
renderers,
127
131
count: 10000 ,
128
- generateTime: null ,
129
- updateTime: null ,
130
132
showScroller: true ,
131
133
scopedSlots: false ,
132
134
buffer: 200 ,
133
135
poolSize: 2000 ,
134
136
enableLetters: true ,
135
- updateCount : 0 ,
137
+ pageMode : false ,
136
138
recycleList: true ,
137
139
}),
138
140
@@ -163,15 +165,14 @@ export default {
163
165
itemHeight () {
164
166
return this .enableLetters ? null : 50
165
167
},
166
- },
167
168
168
- updated () {
169
- if ( this ._dirty ) {
170
- const time = Date . now ()
171
- this . updateTime = time - this . _time
172
- console . log ( ' update ' , this . updateTime , ' ms ' )
173
- this . _dirty = false
174
- }
169
+ list () {
170
+ return this .items . map (
171
+ item => Object . assign ({}, {
172
+ random : Math . random (),
173
+ }, item )
174
+ )
175
+ },
175
176
},
176
177
177
178
mounted () {
@@ -184,13 +185,15 @@ export default {
184
185
console .log (' Generating ' + this .count + ' items...' )
185
186
let time = Date .now ()
186
187
const items = getData (this .count , this .enableLetters )
187
- this ._time = Date .now ()
188
- this .generateTime = this ._time - time
189
- console .log (' Generated ' + items .length + ' in ' + this .generateTime + ' ms' )
188
+ console .log (' Generated ' + items .length + ' in ' + (Date .now () - time) + ' ms' )
190
189
this ._dirty = true
191
190
this .items = items
192
191
},
193
192
193
+ addItem () {
194
+ addItem (this .items )
195
+ },
196
+
194
197
onUpdate (startIndex , endIndex ) {
195
198
this .updateCount ++
196
199
},
@@ -202,10 +205,14 @@ export default {
202
205
html ,
203
206
body ,
204
207
#app {
205
- height : 100% ;
206
208
box-sizing : border-box ;
207
209
}
208
210
211
+ html ,
212
+ body {
213
+ height : 100% ;
214
+ }
215
+
209
216
body {
210
217
font-family : ' Avenir' , Helvetica , Arial , sans-serif ;
211
218
-webkit-font-smoothing : antialiased ;
@@ -221,14 +228,26 @@ body {
221
228
padding : 12px ;
222
229
}
223
230
224
- .counter {
231
+ #app :not (.page-mode ) {
232
+ height : 100% ;
233
+ }
234
+
235
+ .toolbar {
225
236
flex : auto 0 0 ;
226
237
text-align : center ;
227
238
margin-bottom : 12px ;
228
239
line-height : 32px ;
240
+ position : sticky ;
241
+ top : 0 ;
242
+ z-index : 9999 ;
243
+ background : white ;
244
+ }
245
+
246
+ #app .page-mode .toolbar {
247
+ border-bottom : solid 1px #e0edfa ;
229
248
}
230
249
231
- .counter > * :not (:last-child ) {
250
+ .toolbar > * :not (:last-child ) {
232
251
margin-right : 24px ;
233
252
}
234
253
@@ -238,7 +257,7 @@ body {
238
257
position : relative ;
239
258
}
240
259
241
- .wrapper {
260
+ #app :not ( .page-mode ) .wrapper {
242
261
overflow : hidden ;
243
262
position : absolute ;
244
263
top : 0 ;
0 commit comments