Skip to content

Commit 69d1530

Browse files
committed
Demo: add pagemode + many improvements
1 parent dcf0fef commit 69d1530

File tree

2 files changed

+82
-45
lines changed

2 files changed

+82
-45
lines changed

docs-src/src/App.vue

Lines changed: 56 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,34 @@
11
<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">
49
<span>
510
<input v-model="countInput" type="number" min="0" max="500000" /> items
11+
<button @click="addItem()">+1</button>
612
</span>
713
<label>
814
<input v-model="enableLetters" type="checkbox" /> variable height
915
</label>
16+
<label>
17+
<input v-model="pageMode" type="checkbox" /> page mode
18+
</label>
1019
<span>
1120
<input v-model.number="buffer" type="number" min="1" max="500000" /> buffer
1221
</span>
13-
<span>
22+
<span v-if="!recycleList">
1423
<input v-model.number="poolSize" type="number" min="1" max="500000" /> poolSize
1524
</span>
16-
<span v-if="generateTime !== null">
17-
Items generation: {{ generateTime }} ms
18-
</span>
19-
<span>
20-
Updates: {{ updateCount }}
21-
</span>
2225
<span>
2326
<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>
2528
<label><input type="checkbox" v-model="recycleList" /> Use recycle list</label>
2629
</span>
27-
2830
</div>
31+
2932
<div class="content" v-if="showScroller">
3033
<div class="wrapper">
3134
<template v-if="!recycleList">
@@ -34,7 +37,7 @@
3437
v-if="scopedSlots"
3538
class="scroller"
3639
:item-height="itemHeight"
37-
:items="items"
40+
:items="list"
3841
main-tag="section"
3942
content-tag="table"
4043
:buffer="buffer"
@@ -61,26 +64,27 @@
6164
v-else
6265
class="scroller"
6366
:item-height="itemHeight"
64-
:items="items"
67+
:items="list"
6568
:renderers="renderers"
6669
type-field="type"
67-
key-field="index"
70+
key-field="id"
6871
main-tag="section"
6972
content-tag="table"
7073
:buffer="buffer"
7174
:pool-size="poolSize"
72-
emit-update
73-
@update="onUpdate"
75+
:page-mode="pageMode"
7476
/>
7577
</template>
7678

77-
<template>
79+
<template v-else>
7880
<recycle-list
7981
ref="scroller"
8082
class="scroller"
81-
:items="items"
83+
:items="list"
8284
:item-height="itemHeight"
8385
:buffer="buffer"
86+
:page-mode="pageMode"
87+
key-field="id"
8488
>
8589
<template slot-scope="props">
8690
<tr
@@ -105,7 +109,7 @@
105109
</template>
106110

107111
<script>
108-
import { getData } from './data.js'
112+
import { getData, addItem } from './data.js'
109113
110114
import Letter from './Letter.vue'
111115
import Item from './Item.vue'
@@ -125,14 +129,12 @@ export default {
125129
items: [],
126130
renderers,
127131
count: 10000,
128-
generateTime: null,
129-
updateTime: null,
130132
showScroller: true,
131133
scopedSlots: false,
132134
buffer: 200,
133135
poolSize: 2000,
134136
enableLetters: true,
135-
updateCount: 0,
137+
pageMode: false,
136138
recycleList: true,
137139
}),
138140
@@ -163,15 +165,14 @@ export default {
163165
itemHeight () {
164166
return this.enableLetters ? null : 50
165167
},
166-
},
167168
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+
},
175176
},
176177
177178
mounted () {
@@ -184,13 +185,15 @@ export default {
184185
console.log('Generating ' + this.count + ' items...')
185186
let time = Date.now()
186187
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')
190189
this._dirty = true
191190
this.items = items
192191
},
193192
193+
addItem () {
194+
addItem(this.items)
195+
},
196+
194197
onUpdate (startIndex, endIndex) {
195198
this.updateCount++
196199
},
@@ -202,10 +205,14 @@ export default {
202205
html,
203206
body,
204207
#app {
205-
height: 100%;
206208
box-sizing: border-box;
207209
}
208210
211+
html,
212+
body {
213+
height: 100%;
214+
}
215+
209216
body {
210217
font-family: 'Avenir', Helvetica, Arial, sans-serif;
211218
-webkit-font-smoothing: antialiased;
@@ -221,14 +228,26 @@ body {
221228
padding: 12px;
222229
}
223230
224-
.counter {
231+
#app:not(.page-mode) {
232+
height: 100%;
233+
}
234+
235+
.toolbar {
225236
flex: auto 0 0;
226237
text-align: center;
227238
margin-bottom: 12px;
228239
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;
229248
}
230249
231-
.counter > *:not(:last-child) {
250+
.toolbar > *:not(:last-child) {
232251
margin-right: 24px;
233252
}
234253
@@ -238,7 +257,7 @@ body {
238257
position: relative;
239258
}
240259
241-
.wrapper {
260+
#app:not(.page-mode) .wrapper {
242261
overflow: hidden;
243262
position: absolute;
244263
top: 0;

docs-src/src/data.js

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
import faker from 'faker'
22

3+
let uid = 0
4+
5+
function generateItem () {
6+
return {
7+
name: faker.name.findName(),
8+
avatar: faker.internet.avatar(),
9+
}
10+
}
11+
312
export function getData (count, letters) {
413
const raw = {}
514

@@ -10,29 +19,28 @@ export function getData (count, letters) {
1019
}
1120

1221
for (var i = 0; i < count; i++) {
13-
const item = {
14-
name: faker.name.findName(),
15-
avatar: faker.internet.avatar(),
16-
}
22+
const item = generateItem()
1723
const letter = item.name.charAt(0).toLowerCase()
1824
raw[letter].push(item)
1925
}
2026

21-
const data = []
27+
const list = []
2228
let index = 1
2329

2430
for (const l of alphabet) {
2531
raw[l] = raw[l].sort((a, b) => a.name < b.name ? -1 : 1)
2632
if (letters) {
27-
data.push({
33+
list.push({
34+
id: uid++,
2835
index: index++,
2936
type: 'letter',
3037
value: l,
3138
height: 200,
3239
})
3340
}
3441
for (var item of raw[l]) {
35-
data.push({
42+
list.push({
43+
id: uid++,
3644
index: index++,
3745
type: 'person',
3846
value: item,
@@ -41,5 +49,15 @@ export function getData (count, letters) {
4149
}
4250
}
4351

44-
return data
52+
return list
53+
}
54+
55+
export function addItem (list) {
56+
list.push({
57+
id: uid++,
58+
index: list.length + 1,
59+
type: 'person',
60+
value: generateItem(),
61+
height: 50,
62+
})
4563
}

0 commit comments

Comments
 (0)