cb-vue-virtual-scroller v1.0.2-0.beta
Vue Virtual Scroller 中文翻译文档
Copyright (c) 2020 Guillaume Chau, Cheng Bin
版本说明
这是一个修改版的 Vue Virtual Scroller,修改了滚动到底的函数 scrollToBottom () 实现。 使其可以在滚动到底的时候实现平滑滚动,而不是瞬间到底。
安装
npm install --save cb-vue-virtual-scroller@next
yarn add cb-vue-virtual-scroller@next
默认导入
安装所有组件:
import VueVirtualScroller from 'cb-vue-virtual-scroller'
app.use(VueVirtualScroller)
使用特定组件:
import { RecycleScroller } from 'cb-vue-virtual-scroller'
app.component('RecycleScroller', RecycleScroller)
⚠️ 导入包时应包含以下行:
import 'cb-vue-virtual-scroller/dist/vue-virtual-scroller.css'
浏览器
<link rel="stylesheet" href="cb-vue-virtual-scroller/dist/vue-virtual-scroller.css"/>
<script src="vue.js"></script>
<script src="cb-vue-virtual-scroller/dist/vue-virtual-scroller.min.js"></script>
安装组件:
app.use(VueVirtualScroller)
或使用自定义名称注册:
app.component('RecycleScroller', VueVirtualScroller.RecycleScroller)
使用
cb-vue-virtual-scroller
提供了几个组件:
RecycleScroller 是一个仅渲染列表中可见项目的组件。它还重用组件和 DOM 元素,以尽可能高效和高性能地运行。
DynamicScroller 是一个包装 RecycleScroller 组件并扩展其功能以包括动态大小管理的组件。其主要用例是在您无法提前知道项目大小时。Dynamic Scroller 在滚动过程中渲染新项目时自动“发现”项目尺寸。
DynamicScrollerItem 必须包装在 DynamicScroller 中的每个项目,以处理尺寸计算。
IdState 是一个混入,用于简化在 RecycleScroller 中重用组件的本地状态管理。
RecycleScroller
RecycleScroller 是一个虚拟滚动器,仅渲染可见项目。当用户滚动时,RecycleScroller 重用所有组件和 DOM 节点以保持最佳性能。
基本用法
使用作用域插槽渲染列表中的每个项目:
<template>
<RecycleScroller
class="scroller"
:items="list"
:item-size="32"
key-field="id"
v-slot="{ item }"
>
<div class="user">
{{ item.name }}
</div>
</RecycleScroller>
</template>
<script>
export default {
props: {
list: Array,
},
}
</script>
<style scoped>
.scroller {
height: 100%;
}
.user {
height: 32%;
padding: 0 12px;
display: flex;
align-items: center;
}
</style>
重要注意事项
- ⚠️ 您需要设置虚拟滚动器元素和项目元素的大小(例如,通过 CSS)。除非您使用可变大小模式,否则所有项目应具有相同的高度(或在水平模式下的宽度)以防止显示故障。
- ⚠️ 如果项目是对象,滚动器需要能够识别它们。默认情况下,它将查找项目上的
id
字段。如果您使用其他字段名称,可以通过keyField
属性进行配置。 - 不建议在 RecycleScroller 中使用函数式组件,因为组件会被重用(因此实际上会更慢)。
- 列表项组件必须对
item
属性的更新具有反应性,而无需重新创建(使用计算属性或观察者来正确响应属性更改!)。 - 您不需要在列表内容上设置
key
(但您应该在所有嵌套的<img>
元素上设置,以防止加载故障)。 - 浏览器对 DOM 元素的大小有限制,这意味着当前虚拟滚动器无法显示超过约 500k 个项目,具体取决于浏览器。
- 由于 DOM 元素被重用于项目,建议使用提供的
hover
类而不是:hover
状态选择器定义悬停样式(例如.vue-recycle-scroller__item-view.hover
或.hover .some-element-inside-the-item-view
)。
它是如何工作的?
- RecycleScroller 创建视图池以向用户呈现可见项目。
- 视图持有一个渲染的项目,并在其池中重用。
- 对于每种类型的项目,将创建一个新的池,以便为相同类型重用相同的组件(和 DOM 树)。
- 如果视图离开屏幕,它们可以被停用,并且可以随时重用于新可见项目。
以下是 RecycleScroller 在垂直模式下的内部结构:
<RecycleScroller>
<!-- 包装元素,具有预先计算的总高度 -->
<wrapper
:style="{ height: computedTotalHeight + 'px' }"
>
<!-- 每个视图被转换到计算的位置 -->
<view
v-for="view of pool"
:style="{ transform: 'translateY(' + view.computedTop + 'px)' }"
>
<!-- 您的元素将在此处呈现 -->
<slot
:item="view.item"
:index="view.nr.index"
:active="view.nr.used"
/>
</view>
</wrapper>
</RecycleScroller>
当用户在 RecycleScroller 中滚动时,视图主要只是移动以填充新的可见空间,并更新默认插槽属性。这样,我们获得了最小的组件/元素创建和销毁,并利用 Vue 虚拟 DOM 差异算法的全部功能来优化 DOM 操作!
属性
items
:您希望在滚动器中显示的项目列表。direction
(默认:'vertical'
):滚动方向,可以是'vertical'
或'horizontal'
。itemSize
(默认:null
):项目的显示高度(或在水平模式下的宽度),以像素为单位,用于计算滚动大小和位置。如果设置为null
(默认值),将使用可变大小模式。gridItems
:在同一行上显示多个项目以创建网格。您必须为itemSize
设置一个值才能使用此属性(不支持动态大小)。itemSecondarySize
:项目在网格中的大小(在垂直模式下为宽度,在水平模式下为高度),以像素为单位。当设置了gridItems
时使用。如果未设置itemSecondarySize
,将使用itemSize
的值。minItemSize
:如果项目的高度(或在水平模式下的宽度)未知,则使用的最小大小。sizeField
(默认:'size'
):在可变大小模式下用于获取项目大小的字段。typeField
(默认:'type'
):用于区分列表中不同类型组件的字段。对于每种不同类型,将创建一个重用项目的池。keyField
(默认:'id'
):用于标识项目并优化管理渲染视图的字段。pageMode
(默认:false
):启用页面模式。prerender
(默认:0
):为服务器端渲染(SSR)渲染固定数量的项目。buffer
(默认:200
):在滚动可见区域的边缘添加的像素数量,以开始渲染更远的项目。emitUpdate
(默认:false
):每次虚拟滚动器内容更新时发出'update'
事件(可能影响性能)。updateInterval
(默认:0
):滚动后检查视图更新的间隔时间(以毫秒为单位)。当设置为0
时,检查将在下一个动画帧期间进行。listClass
(默认:''
):添加到项目列表包装器的自定义类。itemClass
(默认:''
):添加到每个项目的自定义类。listTag
(默认:'div'
):要渲染为列表包装器的元素。itemTag
(默认:'div'
):要渲染为列表项的元素(默认插槽内容的直接父级)。
事件
resize
:当滚动器大小更改时发出。visible
:当滚动器认为自己在页面中可见时发出。hidden
:当滚动器在页面中隐藏时发出。update (startIndex, endIndex, visibleStartIndex, visibleEndIndex)
:每次视图更新时发出,仅当emitUpdate
属性为true
时。scroll-start
:当第一个项目被渲染时发出。scroll-end
:当最后一个项目被渲染时发出。
默认作用域插槽属性
item
:在视图中渲染的项目。index
:反映每个项目在items
数组中的位置。active
:视图是否处于活动状态。活动视图被视为可见并由RecycleScroller
定位。非活动视图不被视为可见,并且对用户隐藏。如果视图处于非活动状态,应跳过任何与渲染相关的计算。
其他插槽
<main>
<slot name="before"></slot>
<wrapper>
<!-- 重用的视图池在此处 -->
<slot name="empty"></slot>
</wrapper>
<slot name="after"></slot>
</main>
示例:
<RecycleScroller
class="scroller"
:items="list"
:item-size="32"
>
<template #before>
嘿!我是显示在项目之前的消息!
</template>
<template v-slot="{ item }">
<div class="user">
{{ item.name }}
</div>
</template>
</RecycleScroller>
页面模式
页面模式扩展了虚拟滚动器,并使用页面视口来计算哪些项目是可见的。这样,您可以在一个大页面中使用它,并在其前后添加 HTML 元素(如页眉和页脚)。将 page-mode
属性设置为 true
:
<header>
<menu></menu>
</header>
<RecycleScroller page-mode>
<!-- ... -->
</RecycleScroller>
<footer>
版权所有 2017 - Cat
</footer>
可变大小模式
⚠️ 这种模式在项目较多时可能会影响性能。请谨慎使用。
如果 itemSize
属性未设置或设置为 null
,虚拟滚动器将切换到可变大小模式。然后,您需要在项目对象上公开一个数字字段,该字段表示项目元素的大小。
⚠️ 您仍然需要使用 CSS 正确设置项目的大小(例如,通过类)。
使用 sizeField
属性(默认为 'size'
)来设置滚动器用于获取每个项目大小的字段。
示例:
const items = [
{
id: 1,
label: 'Title',
size: 64,
},
{
id: 2,
label: 'Foo',
size: 32,
},
{
id: 3,
label: 'Bar',
size: 32,
},
]
缓冲区
您可以在虚拟滚动器上设置 buffer
属性(以像素为单位),以扩展在确定可见项目时考虑的视口。例如,如果您设置了 1000 像素的缓冲区,虚拟滚动器将开始渲染滚动器可见区域底部以下 1000 像素的项目,并将保留可见区域顶部以上 1000 像素的项目。
默认值为 200
。
<RecycleScroller :buffer="200" />
服务器端渲染
可以将 prerender
属性设置为虚拟滚动器中服务器上渲染的项目数量:
<RecycleScroller
:items="items"
:item-size="42"
:prerender="10"
>
DynamicScroller
这与 RecycleScroller 的工作方式相同,但它可以渲染大小未知的项目!
基本用法
<template>
<DynamicScroller
:items="items"
:min-item-size="54"
class="scroller"
>
<template v-slot="{ item, index, active }">
<DynamicScrollerItem
:item="item"
:active="active"
:size-dependencies="[
item.message,
]"
:data-index="index"
>
<div class="avatar">
<img
:src="item.avatar"
:key="item.avatar"
alt="avatar"
class="image"
>
</div>
<div class="text">{{ item.message }}</div>
</DynamicScrollerItem>
</template>
</DynamicScroller>
</template>
<script>
export default {
props: {
items: Array,
},
}
</script>
<style scoped>
.scroller {
height: 100%;
}
</style>
重要注意事项
minItemSize
是项目初始渲染所必需的。DynamicScroller
不会自行检测大小变化,但您可以在 DynamicScrollerItem 上使用size-dependencies
放置可能影响项目大小的值。- 您不需要在项目上有一个
size
字段。
属性
扩展了所有 RecycleScroller 属性。
- 不建议更改
sizeField
属性,因为所有大小管理都是在内部完成的。
事件
扩展了所有 RecycleScroller 事件。
默认作用域插槽属性
扩展了所有 RecycleScroller 作用域插槽属性。
其他插槽
扩展了所有 RecycleScroller 其他插槽。
DynamicScrollerItem
应包装在 DynamicScroller 中的所有项目的组件。
属性
item
(必需):在滚动器中渲染的项目。active
(必需):RecycleScroller 中的持有视图是否处于活动状态。将防止不必要的大小重新计算。sizeDependencies
:可能影响项目大小的值。此属性将被监视,如果某个值发生变化,大小将重新计算。推荐使用而不是watchData
。watchData
(默认:false
):深度监视item
的变化以重新计算大小(不推荐,可能影响性能)。tag
(默认:'div'
):用于渲染组件的元素。emitResize
(默认:false
):每次重新计算大小时发出resize
事件(可能影响性能)。
事件
resize
:每次重新计算大小时发出,仅当emitResize
属性为true
时。
IdState
这是一个方便的混入,可以替换在 RecycleScroller 中渲染的组件中的 data
。
为什么这很有用?
由于 RecycleScroller 中的组件是重用的,您不能直接使用 Vue 标准的 data
属性:否则它们将与列表中的不同项目共享!
IdState 将提供一个 idState
对象,相当于 $data
,但它与具有其标识符的单个项目相关联(您可以通过 idProp
参数更改哪个字段)。
示例
在此示例中,我们使用 item
的 id
来为项目提供“作用域”状态:
<template>
<div class="question">
<p>{{ item.question }}</p>
<button @click="idState.replyOpen = !idState.replyOpen">回复</button>
<textarea
v-if="idState.replyOpen"
v-model="idState.replyText"
placeholder="输入您的回复"
/>
</div>
</template>
<script>
import { IdState } from 'cb-vue-virtual-scroller'
export default {
mixins: [
IdState({
// 您可以自定义此项
idProp: vm => vm.item.id,
}),
],
props: {
// 列表中的项目
item: Object,
},
// 这替代了 data () { ... }
idState () {
return {
replyOpen: false,
replyText: '',
}
},
}
</script>
参数
idProp
(默认:vm => vm.item.id
):组件上的字段名称(例如:'id'
)或返回 id 的函数。
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago
11 months ago