vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > 使用vue-virtual-scroller的问题

使用vue-virtual-scroller遇到的问题及解决

作者:言木土

这篇文章主要介绍了使用vue-virtual-scroller遇到的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

问题一

报错Error in nextTick: “Error: Key is undefined on item (keyField is ‘userid’)”

字面上的意思,keyField的参数设置不对,导致找不到唯一id,需要设置填充数据的唯一key,例如你的数据格式是:

list = [
	{ userId: 1001, username: "xiaoming"},
	{ userId: 1002, username: "liming"},
	...
]

那么key-field应该设置为userId

<RecycleScroller
      class="scroller"
      :items="list"
      :item-size="32"
      key-field="userId"
      v-slot="{ item }"
    >
      <div class="user">
        {{ item.username }}
      </div>
    </RecycleScroller>

问题二

报错Error in v-on handler: “Error: Rendered items limit reached”

外层div应该设置固定高度,不然虚拟列表不起作用。

<template>
  <div class="main">
    <RecycleScroller
      class="scroller"
      :items="list"
      :item-size="32"
      key-field="userId"
      v-slot="{ item }"
    >
      <div class="user">
          <div>{{ item.username }}</div>
      </div>
    </RecycleScroller>
  </div>
</template>

<style scoped>
.main {
  height: 100vh;
}
.scroller {
  height: 100%;
}
</style>

这里我固定高度设置为屏幕高度,在实际使用中,大家可以根据项目要求设置固定高度。

问题三

虚拟列表只显示了一部分

这里可能有两个原因引起:

<DynamicScroller
            :items="items"
            :min-item-size="54"
            keyField="userId"
            class="scroller">
            <template v-slot="{ item, index, active }">
                <DynamicScrollerItem
                    :item="item"
                    :active="active"
                    :size-dependencies="[item.UserName]"
                    :data-index="index"
                    class="user">
                    
                </DynamicScrollerItem>
            </template>
</DynamicScroller>

<style scoped>
.user {
  min-height: 54px;//这里不能低于54
  padding: 0 12px;
  display: flex;
  align-items: center;
}
</style>

这里min-item-size设置为54,如果DynamicScrollerItem的最小高度设置低于54,可能就只会显示开头部分item。

import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'

没有引入这个样式,也会导致item显示不全。

问题四

有空白的Item

可能大家发现,有些地方的item是空白的。

有空白item的原因就是你使用列表数据里面相邻数据有重复的key,拿上面的例子数据来说就是连续两个重复数据的userId是一样的。

题外话

大家如果想用大量数据测试成果,强烈推荐fakerjs,可以创建大量虚假数据,用于测试虚拟列表。

附上最简单使用

1、下载依赖

npm install --save-dev @faker-js/faker

2、生成数据

import { faker } from '@faker-js/faker'

Array.from({ length: 10000 }).forEach(() => {
      this.list.push(createRandomUser())
})

createRandomUser() {
      return {
        userId: faker.datatype.uuid(),
        username: faker.internet.userName(),
      }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文