JSFiddle - React, Tailwind, and code Playground

vue-virtual-scroller try 2

by Christopher O

HTML

<link rel="stylesheet" href="https://cdn.rawgit.com/Akryum/vue-virtual-scroller/master/dist/vue-virtual-scroller.css" />

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
<script src="https://cdn.rawgit.com/Marak/faker.js/master/examples/browser/js/faker.js"></script>

<script src="https://cdn.rawgit.com/Akryum/vue-virtual-scroller/master/dist/vue-virtual-scroller.min.js"></script>

<div id="app">
  <input placeholder="Search" type="text" class="headSearchBox" v-model="headSearch" /> Records: {{dispCount}}
  <my-list :list="listSorted"></my-list>
  <p>{{someInfo}}</p>
</div>
<!-- {{ list }} -->

CSS

.scroller {
  overflow-y: scroll;
  overflow-x: none;
  height: 300px;
  width: 250px;
  border: 1px solid blue;
  margin-top:5px;
}

.user {
  height: 20px;
  border-bottom: 1px solid grey;
  white-space: nowrap;
}

.user:hover {
  background: green;
  color: white;
}

.headSearchBox{
  width:150px;
}

JavaScript

console.clear();

Vue.component('recycle-scroller', VueVirtualScroller.RecycleScroller)
//Vue.component('dynamic-scroller', VueVirtualScroller.DynamicScroller)
Vue.component('my-list', {
props:['list'],
template:`
<recycle-scroller
    class="scroller"
    :items="list"
    :item-height="20"
    keyField="i"
  >
    <div slot-scope="{item}" class="user" v-on:click="headClick(item.i)" v-on:dblclick="doubleClicky(item.i)">
      <strong>{{ item.i }}:</strong> {{ item.n }}
    </div>
  </recycle-scroller>
`,
/* template:`
  <DynamicScroller
    :items="list"
    :min-item-height="20"
    class="scroller"
  >
    <template slot-scope="{ item, index, active }">
      <DynamicScrollerItem
        :item="item"
        :active="active"
        :size-dependencies="[
          item.n,
        ]"
        :data-index="index"
      >
        <div class="text"><strong>{{ item.i }}:</strong> {{ item.n }}</div>
      </DynamicScrollerItem>
    </template>
  </DynamicScroller>
`, */
methods: {
    headClick(id){
        //console.log("Clicked: " + id)
        this.$parent.$data.someInfo = "You Clicked: " + id
        
        // Update the record (slow on big lists)
        this.$parent.$data.dict[id].n += '*'
        //vm1.dict[id].n += '*'
    },
    doubleClicky(id){
        this.$parent.$data.someInfo = "You Double-Clicked (deleted): " + id
        
        // Delete one record
    	delete(this.$parent.$data.dict[id])
    },
  },
})


var vm1 = new Vue({
  el: "#app",
  async created() {
  	createHowMany = 10000;
    
    // Create some fake records
    for (var i = 1; i <= createHowMany; i++) {
      let item = { i, n: faker.name.findName() }
      this.$set(this.dict, i, item)
    }
    
    // Wait for render, then make some changes
    // (demo that the browser updates in real-time)
    await timeout()
   
   	// Add 3 new records
   	for (var i = (createHowMany+1); i <= (createHowMany+3); i++) {
      // Create
      this.$set(this.dict, i, { i, n: i+" " +...