virtual-list-common 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +183 -0
- package/README.md +348 -0
- package/dist/virtual-list.esm.js +2 -0
- package/dist/virtual-list.esm.js.map +1 -0
- package/dist/virtual-list.react.esm.js +2 -0
- package/dist/virtual-list.react.esm.js.map +1 -0
- package/dist/virtual-list.umd.js +2 -0
- package/dist/virtual-list.umd.js.map +1 -0
- package/dist/virtual-list.vue.esm.js +2 -0
- package/dist/virtual-list.vue.esm.js.map +1 -0
- package/package.json +63 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
## [0.1.0] - 2026-03-28
|
|
5
|
+
|
|
6
|
+
### Added
|
|
7
|
+
|
|
8
|
+
#### Vue3 和 React 组件支持
|
|
9
|
+
- **Vue 3 组件 (`VirtualListVue`)**
|
|
10
|
+
- 提供原生 Vue 组件支持,支持 `v-model` 风格的数据绑定
|
|
11
|
+
- 支持通过 `renderItem` 属性或默认插槽自定义渲染
|
|
12
|
+
- 提供完整的组件生命周期管理(自动初始化/销毁)
|
|
13
|
+
- 支持响应式数据更新,自动监听 `items` 变化
|
|
14
|
+
- 暴露 `ref` 方法:`scrollToIndex`, `scrollToBottom`, `scrollToTop`, `scrollTo`, `getFirstVisibleIndex`, `getLastVisibleIndex`, `updateItems`, `destroy`
|
|
15
|
+
- 新增组件属性:`height`, `className`, `style`, `preloadCount`, `scrollDamping`
|
|
16
|
+
- 支持事件:`@itemClick`, `@scroll`, `@update`
|
|
17
|
+
|
|
18
|
+
- **React 组件 (`VirtualListReact`)**
|
|
19
|
+
- 提供原生 React 组件支持,使用 Hooks 实现
|
|
20
|
+
- 支持通过 `renderItem` 属性自定义渲染
|
|
21
|
+
- 使用 `forwardRef` 暴露组件方法
|
|
22
|
+
- 自动处理 React 18 的 `createRoot` API
|
|
23
|
+
- 暴露方法:`scrollToIndex`, `scrollToBottom`, `scrollToTop`, `scrollTo`, `getFirstVisibleIndex`, `getLastVisibleIndex`, `updateItems`, `destroy`
|
|
24
|
+
- 新增组件属性:`height`, `className`, `style`, `preloadCount`, `scrollDamping`
|
|
25
|
+
- 支持回调:`onItemClick`, `onScroll`
|
|
26
|
+
|
|
27
|
+
#### 包导出配置
|
|
28
|
+
- 新增 `exports` 字段,支持更精细的模块导入
|
|
29
|
+
- `virtual-list-common` - 核心 VirtualList 类
|
|
30
|
+
- `virtual-list-common/vue` - Vue 3 组件
|
|
31
|
+
- `virtual-list-common/react` - React 组件
|
|
32
|
+
- 添加 `peerDependencies` 配置,将 Vue 和 React 标记为可选依赖
|
|
33
|
+
- 更新 `files` 字段,包含 `CHANGELOG.md`
|
|
34
|
+
|
|
35
|
+
#### 构建配置
|
|
36
|
+
- 更新 Rollup 配置,添加 Vue 和 React 组件的打包任务
|
|
37
|
+
- 为组件版本保留类名和函数名,便于调试
|
|
38
|
+
- 生成独立的 sourcemap 文件
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- 版本号从 `0.0.5` 升级到 `0.1.0`,标志着新增功能里程碑
|
|
43
|
+
- 更新 `keywords`,添加 `component` 标签
|
|
44
|
+
|
|
45
|
+
### Documentation
|
|
46
|
+
|
|
47
|
+
- 更新 README.md,添加 Vue 和 React 组件的详细使用说明
|
|
48
|
+
- 添加完整的 CHANGELOG.md 文档
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## [0.0.5] - 2026-03-27
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
|
|
56
|
+
- **IntersectionObserver 兼容性修复**
|
|
57
|
+
- 添加对不支持 IntersectionObserver 的浏览器环境的降级处理
|
|
58
|
+
- 在降级模式下使用滚动事件替代 IntersectionObserver
|
|
59
|
+
- 修复降级模式下事件监听器未正确清理的问题
|
|
60
|
+
- 确保 `destroy()` 方法能正确移除降级滚动监听器
|
|
61
|
+
|
|
62
|
+
### Improved
|
|
63
|
+
|
|
64
|
+
- 优化事件监听器清理逻辑,防止内存泄漏
|
|
65
|
+
- 改进私有字段 `#useIntersectionObserver` 的使用方式
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## [0.0.4] - 2026-03-26
|
|
70
|
+
|
|
71
|
+
### Performance
|
|
72
|
+
|
|
73
|
+
- **预加载集合内存优化**
|
|
74
|
+
- 添加 `cleanupPreloadedSet()` 方法,限制预加载集合大小
|
|
75
|
+
- 设置最大预加载项数为 500 (`CONFIG.MAX_PRELOADED_ITEMS`)
|
|
76
|
+
- 定期清理远离可见范围的预加载项,防止内存泄漏
|
|
77
|
+
|
|
78
|
+
- **图片加载版本防护**
|
|
79
|
+
- 添加 `_loadVersion` 机制,防止回收元素的回调污染
|
|
80
|
+
- 确保元素被回收再复用时,旧的加载回调自动失效
|
|
81
|
+
|
|
82
|
+
### Fixed
|
|
83
|
+
|
|
84
|
+
- 修复图片加载完成后可能错误地更新已回收元素的问题
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## [0.0.3] - 2026-03-25
|
|
89
|
+
|
|
90
|
+
### Added
|
|
91
|
+
|
|
92
|
+
- **Lenis 平滑滚动集成**
|
|
93
|
+
- 集成 Lenis 库提供平滑滚动体验
|
|
94
|
+
- 添加 `scrollDamping` 配置项控制滚动阻尼
|
|
95
|
+
- 支持 `scrollToIndex`, `scrollToBottom`, `scrollToTop`, `scrollTo` 方法
|
|
96
|
+
- 添加默认缓动函数(cubic ease-out)
|
|
97
|
+
|
|
98
|
+
### Changed
|
|
99
|
+
|
|
100
|
+
- 优化滚动性能,使用 `requestAnimationFrame` 进行节流
|
|
101
|
+
- 改进滚动事件处理机制
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## [0.0.2] - 2026-03-24
|
|
106
|
+
|
|
107
|
+
### Performance
|
|
108
|
+
|
|
109
|
+
- **DOM 元素池优化**
|
|
110
|
+
- 实现 DOM 元素池机制,复用 DOM 元素减少创建和销毁开销
|
|
111
|
+
- 添加 `maxPoolSize` 配置项(默认 50)
|
|
112
|
+
- 优化元素回收逻辑,限制池大小防止内存泄漏
|
|
113
|
+
|
|
114
|
+
- **位置缓存机制**
|
|
115
|
+
- 添加 `itemPositionCache` Map 缓存项目位置计算结果
|
|
116
|
+
- 仅在容器尺寸变化时清空缓存
|
|
117
|
+
|
|
118
|
+
- **批量 DOM 操作**
|
|
119
|
+
- 优化可见项目更新逻辑,减少重排次数
|
|
120
|
+
- 使用数组替代 Map 存储活跃元素,提高查找速度
|
|
121
|
+
|
|
122
|
+
### Added
|
|
123
|
+
|
|
124
|
+
- **性能检测**
|
|
125
|
+
- 添加 `isHighPerformanceDevice()` 方法检测设备性能
|
|
126
|
+
- 根据设备性能自动调整缓冲区大小
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## [0.0.1] - 2026-03-23
|
|
131
|
+
|
|
132
|
+
### Added
|
|
133
|
+
|
|
134
|
+
- **初始版本发布**
|
|
135
|
+
- 实现基础虚拟列表功能
|
|
136
|
+
- 支持大数据集的高效渲染(仅渲染可见区域)
|
|
137
|
+
- DOM 元素复用机制
|
|
138
|
+
- 图片懒加载(使用 IntersectionObserver)
|
|
139
|
+
- 支持多列布局
|
|
140
|
+
- 自定义渲染函数支持 (`onRenderItem`)
|
|
141
|
+
- 滚动事件回调 (`onScroll`)
|
|
142
|
+
- 项目点击事件 (`onItemClick`)
|
|
143
|
+
- 响应式布局支持(监听窗口 resize)
|
|
144
|
+
|
|
145
|
+
### Configuration
|
|
146
|
+
|
|
147
|
+
- 支持以下配置选项:
|
|
148
|
+
- `itemHeight`: 项目高度(默认 310px)
|
|
149
|
+
- `itemWidth`: 项目宽度(默认 200px)
|
|
150
|
+
- `columns`: 列数(默认 2)
|
|
151
|
+
- `gap`: 间距(默认 5px)
|
|
152
|
+
- `buffer`: 缓冲区大小(默认 2)
|
|
153
|
+
- `preloadCount`: 预加载数量(默认 24)
|
|
154
|
+
- `maxPoolSize`: 元素池最大大小(默认 50)
|
|
155
|
+
- `preloadDistance`: 预加载距离(默认 800px)
|
|
156
|
+
|
|
157
|
+
### Build
|
|
158
|
+
|
|
159
|
+
- 配置 Rollup 构建工具
|
|
160
|
+
- 生成 ESM 和 UMD 格式
|
|
161
|
+
- 生成压缩版本(.min.js)
|
|
162
|
+
- 配置 Terser 移除注释和 console
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 版本号说明
|
|
167
|
+
|
|
168
|
+
本项目遵循 [语义化版本控制](https://semver.org/lang/zh-CN/spec/v2.0.0.html) 规范:
|
|
169
|
+
|
|
170
|
+
- **主版本号 (MAJOR)**: 当进行不兼容的 API 修改时递增
|
|
171
|
+
- **次版本号 (MINOR)**: 当添加向下兼容的功能时递增
|
|
172
|
+
- **修订号 (PATCH)**: 当进行向下兼容的问题修复时递增
|
|
173
|
+
|
|
174
|
+
### 版本历史概览
|
|
175
|
+
|
|
176
|
+
| 版本 | 发布日期 | 主要变更 |
|
|
177
|
+
|------|----------|----------|
|
|
178
|
+
| 0.1.0 | 2026-03-28 | 添加 Vue 和 React 组件支持 |
|
|
179
|
+
| 0.0.5 | 2026-03-27 | IntersectionObserver 兼容性修复 |
|
|
180
|
+
| 0.0.4 | 2026-03-26 | 预加载集合内存优化 |
|
|
181
|
+
| 0.0.3 | 2026-03-25 | Lenis 平滑滚动集成 |
|
|
182
|
+
| 0.0.2 | 2026-03-24 | DOM 元素池和位置缓存优化 |
|
|
183
|
+
| 0.0.1 | 2026-03-23 | 初始版本发布 |
|
package/README.md
ADDED
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
# virtual-list 虚拟列表
|
|
2
|
+
|
|
3
|
+
该项目是一个 Vue3、React 通用虚拟列表,用于高效渲染大量数据的列表,仅渲染可见区域的元素并复用 DOM。
|
|
4
|
+
适用于 Vue3 和 React 项目。
|
|
5
|
+
由于使用了 IntersectionObserver API,所以需要浏览器支持。
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install virtual-list-common
|
|
11
|
+
# 或
|
|
12
|
+
pnpm add virtual-list-common
|
|
13
|
+
# 或
|
|
14
|
+
yarn add virtual-list-common
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## 快速开始
|
|
18
|
+
|
|
19
|
+
### 方式一:使用框架原生组件(推荐)
|
|
20
|
+
|
|
21
|
+
从 v0.1.0 开始,提供了 Vue 和 React 的原生组件支持,使用更加便捷。
|
|
22
|
+
|
|
23
|
+
#### Vue 3 组件
|
|
24
|
+
|
|
25
|
+
```vue
|
|
26
|
+
<template>
|
|
27
|
+
<VirtualList
|
|
28
|
+
:items="items"
|
|
29
|
+
:itemHeight="310"
|
|
30
|
+
:itemWidth="200"
|
|
31
|
+
:columns="2"
|
|
32
|
+
height="600px"
|
|
33
|
+
@itemClick="handleItemClick"
|
|
34
|
+
@scroll="handleScroll"
|
|
35
|
+
ref="virtualListRef"
|
|
36
|
+
:renderItem="renderItem"
|
|
37
|
+
>
|
|
38
|
+
</VirtualList>
|
|
39
|
+
</template>
|
|
40
|
+
|
|
41
|
+
<script setup>
|
|
42
|
+
import { ref } from 'vue';
|
|
43
|
+
import { VirtualListVue as VirtualList } from 'virtual-list-common/vue';
|
|
44
|
+
|
|
45
|
+
const items = ref([
|
|
46
|
+
'https://picsum.photos/200/300?random=1',
|
|
47
|
+
'https://picsum.photos/200/300?random=2',
|
|
48
|
+
// ...
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
const virtualListRef = ref(null);
|
|
52
|
+
|
|
53
|
+
// 自定义渲染函数
|
|
54
|
+
const renderItem = (index, itemData) => {
|
|
55
|
+
const div = document.createElement('div');
|
|
56
|
+
div.className = 'custom-item';
|
|
57
|
+
div.innerHTML = `<img src="${itemData}" alt="Item ${index}" /><span>Item ${index}</span>`;
|
|
58
|
+
return div;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const handleItemClick = ({ index, itemData }) => {
|
|
62
|
+
console.log('Clicked item:', index, itemData);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const handleScroll = ({ scrollTop, firstVisibleIndex, lastVisibleIndex }) => {
|
|
66
|
+
console.log('Scroll position:', scrollTop);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// 使用暴露的方法
|
|
70
|
+
const scrollToItem = (index) => {
|
|
71
|
+
virtualListRef.value?.scrollToIndex(index, { immediate: false });
|
|
72
|
+
};
|
|
73
|
+
</script>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
#### React 组件
|
|
77
|
+
|
|
78
|
+
```jsx
|
|
79
|
+
import { useRef, useState } from 'react';
|
|
80
|
+
import { VirtualListReact as VirtualList } from 'virtual-list-common/react';
|
|
81
|
+
|
|
82
|
+
function App() {
|
|
83
|
+
const [items] = useState([
|
|
84
|
+
'https://picsum.photos/200/300?random=1',
|
|
85
|
+
'https://picsum.photos/200/300?random=2',
|
|
86
|
+
// ...
|
|
87
|
+
]);
|
|
88
|
+
|
|
89
|
+
const virtualListRef = useRef(null);
|
|
90
|
+
|
|
91
|
+
// 自定义渲染函数
|
|
92
|
+
const renderItem = (index, itemData) => (
|
|
93
|
+
<div className="custom-item">
|
|
94
|
+
<img src={itemData} alt={`Item ${index}`} />
|
|
95
|
+
<span>Item {index}</span>
|
|
96
|
+
</div>
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const handleItemClick = (index, itemData) => {
|
|
100
|
+
console.log('Clicked item:', index, itemData);
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const handleScroll = ({ scrollTop, firstVisibleIndex, lastVisibleIndex }) => {
|
|
104
|
+
console.log('Scroll position:', scrollTop);
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// 使用暴露的方法
|
|
108
|
+
const scrollToItem = (index) => {
|
|
109
|
+
virtualListRef.current?.scrollToIndex(index, { immediate: false });
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
return (
|
|
113
|
+
<VirtualList
|
|
114
|
+
ref={virtualListRef}
|
|
115
|
+
items={items}
|
|
116
|
+
itemHeight={310}
|
|
117
|
+
itemWidth={200}
|
|
118
|
+
columns={2}
|
|
119
|
+
height="600px"
|
|
120
|
+
renderItem={renderItem}
|
|
121
|
+
onItemClick={handleItemClick}
|
|
122
|
+
onScroll={handleScroll}
|
|
123
|
+
/>
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
### 方式二:使用核心类(高级用法)
|
|
131
|
+
|
|
132
|
+
如果你需要更底层的控制,可以直接使用 VirtualList 核心类。
|
|
133
|
+
|
|
134
|
+
#### 核心类基础用法
|
|
135
|
+
|
|
136
|
+
```js
|
|
137
|
+
import VirtualList from 'virtual-list-common';
|
|
138
|
+
|
|
139
|
+
const container = document.getElementById('container');
|
|
140
|
+
const items = [
|
|
141
|
+
'https://picsum.photos/200/300?random=1',
|
|
142
|
+
'https://picsum.photos/200/300?random=2',
|
|
143
|
+
// ...
|
|
144
|
+
];
|
|
145
|
+
|
|
146
|
+
const virtualList = new VirtualList(container, items, {
|
|
147
|
+
itemHeight: 310,
|
|
148
|
+
itemWidth: 200,
|
|
149
|
+
columns: 2
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
#### 自定义渲染(使用核心类)
|
|
154
|
+
|
|
155
|
+
```js
|
|
156
|
+
// Vue 中使用核心类
|
|
157
|
+
import { createApp, h } from 'vue';
|
|
158
|
+
import VirtualList from 'virtual-list-common';
|
|
159
|
+
import MyVueComponent from './MyVueComponent.vue';
|
|
160
|
+
|
|
161
|
+
const virtualList = new VirtualList(container, items, {
|
|
162
|
+
onRenderItem: (index, itemData) => {
|
|
163
|
+
const wrapper = document.createElement('div');
|
|
164
|
+
const app = createApp({
|
|
165
|
+
render: () => h(MyVueComponent, { data: itemData, index })
|
|
166
|
+
});
|
|
167
|
+
app.mount(wrapper);
|
|
168
|
+
return wrapper;
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// React 中使用核心类
|
|
173
|
+
import { createRoot } from 'react-dom/client';
|
|
174
|
+
import VirtualList from 'virtual-list-common';
|
|
175
|
+
import MyReactComponent from './MyReactComponent';
|
|
176
|
+
|
|
177
|
+
const virtualList = new VirtualList(container, items, {
|
|
178
|
+
onRenderItem: (index, itemData) => {
|
|
179
|
+
const wrapper = document.createElement('div');
|
|
180
|
+
const root = createRoot(wrapper);
|
|
181
|
+
root.render(<MyReactComponent data={itemData} index={index} />);
|
|
182
|
+
return wrapper;
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 组件/类 API 参考
|
|
190
|
+
|
|
191
|
+
### VirtualListVue 组件属性
|
|
192
|
+
|
|
193
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
194
|
+
|------|------|--------|------|
|
|
195
|
+
| `items` | `Array` | 必填 | 列表数据数组 |
|
|
196
|
+
| `itemHeight` | `number` | 310 | 每个项目的高度(像素) |
|
|
197
|
+
| `itemWidth` | `number` | 200 | 每个项目的宽度(像素) |
|
|
198
|
+
| `columns` | `number` | 2 | 列数 |
|
|
199
|
+
| `gap` | `number` | 5 | 项目间距(像素) |
|
|
200
|
+
| `buffer` | `number` | 2 | 缓冲区大小(行数) |
|
|
201
|
+
| `height` | `string/number` | '100%' | 容器高度 |
|
|
202
|
+
| `className` | `string` | '' | 容器 CSS 类名 |
|
|
203
|
+
| `style` | `Object` | {} | 容器内联样式 |
|
|
204
|
+
| `preloadCount` | `number` | 24 | 初始预加载数量 |
|
|
205
|
+
| `scrollDamping` | `number` | 0.09 | 滚动阻尼系数 |
|
|
206
|
+
| `renderItem` | `Function` | null | 自定义渲染函数 `(index, itemData) => HTMLElement`,返回 DOM 元素 |
|
|
207
|
+
| `onItemClick` | `Function` | null | 点击事件回调 `(index, itemData, element) => void` |
|
|
208
|
+
| `onScroll` | `Function` | null | 滚动事件回调 `(scrollTop, firstVisibleIndex, lastVisibleIndex) => void` |
|
|
209
|
+
|
|
210
|
+
### VirtualListVue 事件
|
|
211
|
+
|
|
212
|
+
| 事件名 | 参数 | 说明 |
|
|
213
|
+
|--------|------|------|
|
|
214
|
+
| `itemClick` | `{ index, itemData, element }` | 项目点击时触发 |
|
|
215
|
+
| `scroll` | `{ scrollTop, firstVisibleIndex, lastVisibleIndex }` | 滚动时触发 |
|
|
216
|
+
| `update` | `VirtualList 实例` | 实例更新时触发 |
|
|
217
|
+
|
|
218
|
+
### VirtualListVue 方法(通过 ref 调用)
|
|
219
|
+
|
|
220
|
+
| 方法名 | 参数 | 说明 |
|
|
221
|
+
|--------|------|------|
|
|
222
|
+
| `scrollToIndex(index, options)` | index: 目标索引, options: `{ immediate?, duration?, easing? }` | 滚动到指定索引 |
|
|
223
|
+
| `scrollToBottom(options)` | options: `{ immediate?, duration?, easing? }` | 滚动到底部 |
|
|
224
|
+
| `scrollToTop(options)` | options: `{ immediate?, duration?, easing? }` | 滚动到顶部 |
|
|
225
|
+
| `scrollTo(scrollTop, options)` | scrollTop: 目标位置, options: `{ immediate?, duration?, easing? }` | 滚动到指定位置 |
|
|
226
|
+
| `getFirstVisibleIndex()` | - | 获取第一个可见项目索引 |
|
|
227
|
+
| `getLastVisibleIndex()` | - | 获取最后一个可见项目索引 |
|
|
228
|
+
| `updateItems(newItems)` | newItems: 新数据数组 | 更新数据源 |
|
|
229
|
+
| `destroy()` | - | 销毁实例,清理资源 |
|
|
230
|
+
|
|
231
|
+
### VirtualListReact 组件属性
|
|
232
|
+
|
|
233
|
+
与 Vue 组件属性相同,事件通过 `onItemClick` 和 `onScroll` 回调处理。
|
|
234
|
+
|
|
235
|
+
### VirtualListReact 方法(通过 ref 调用)
|
|
236
|
+
|
|
237
|
+
与 Vue 组件方法相同。
|
|
238
|
+
|
|
239
|
+
### VirtualList 核心类配置
|
|
240
|
+
|
|
241
|
+
```js
|
|
242
|
+
const options = {
|
|
243
|
+
itemHeight: 310, // 项目高度
|
|
244
|
+
itemWidth: 200, // 项目宽度
|
|
245
|
+
columns: 2, // 列数
|
|
246
|
+
gap: 5, // 间距
|
|
247
|
+
buffer: 2, // 缓冲区行数
|
|
248
|
+
preloadCount: 24, // 预加载数量
|
|
249
|
+
maxPoolSize: 50, // DOM 元素池最大大小
|
|
250
|
+
scrollDamping: 0.09, // 滚动阻尼
|
|
251
|
+
preloadDistance: 800, // 预加载距离
|
|
252
|
+
onRenderItem: null, // 自定义渲染函数
|
|
253
|
+
onScroll: null, // 滚动回调
|
|
254
|
+
onItemClick: null // 点击回调
|
|
255
|
+
};
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 在 Vue 中使用核心类示例
|
|
261
|
+
|
|
262
|
+
```vue
|
|
263
|
+
<template>
|
|
264
|
+
<div ref="container"></div>
|
|
265
|
+
</template>
|
|
266
|
+
|
|
267
|
+
<script setup>
|
|
268
|
+
import { ref, onMounted, onBeforeUnmount } from 'vue';
|
|
269
|
+
import VirtualList from 'virtual-list-common';
|
|
270
|
+
|
|
271
|
+
const container = ref(null);
|
|
272
|
+
let virtualList = null;
|
|
273
|
+
|
|
274
|
+
onMounted(() => {
|
|
275
|
+
const items = ['url1', 'url2', /* ... */];
|
|
276
|
+
virtualList = new VirtualList(container.value, items, {
|
|
277
|
+
itemHeight: 310,
|
|
278
|
+
columns: 2
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
onBeforeUnmount(() => {
|
|
283
|
+
virtualList?.destroy();
|
|
284
|
+
});
|
|
285
|
+
</script>
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## 在 React 中使用核心类示例
|
|
289
|
+
|
|
290
|
+
```jsx
|
|
291
|
+
import { useEffect, useRef } from 'react';
|
|
292
|
+
import VirtualList from 'virtual-list-common';
|
|
293
|
+
|
|
294
|
+
function App() {
|
|
295
|
+
const containerRef = useRef(null);
|
|
296
|
+
|
|
297
|
+
useEffect(() => {
|
|
298
|
+
const items = ['url1', 'url2', /* ... */];
|
|
299
|
+
const virtualList = new VirtualList(containerRef.current, items, {
|
|
300
|
+
itemHeight: 310,
|
|
301
|
+
columns: 2
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
return () => {
|
|
305
|
+
virtualList.destroy();
|
|
306
|
+
};
|
|
307
|
+
}, []);
|
|
308
|
+
|
|
309
|
+
return <div ref={containerRef} />;
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## 注意事项
|
|
316
|
+
|
|
317
|
+
1. **生命周期管理**:在 Vue/React 组件销毁时,虚拟列表会自动清理资源。但如果直接使用核心类,需要手动调用 `virtualList.destroy()`。
|
|
318
|
+
|
|
319
|
+
2. **响应式数据**:
|
|
320
|
+
- 使用 Vue 组件时,`items` 是响应式的,数据变化会自动更新列表。
|
|
321
|
+
- 使用 React 组件时,`items` 变化会自动触发更新。
|
|
322
|
+
- 使用核心类时,如果 `items` 变化,需要调用 `virtualList.updateItems(newItems)`。
|
|
323
|
+
|
|
324
|
+
3. **自定义渲染**:
|
|
325
|
+
- Vue 组件支持使用 `renderItem` 属性自定义渲染,接收 `(index, itemData)` 参数并返回 DOM 元素。
|
|
326
|
+
- React 组件支持使用 `renderItem` 属性自定义渲染,接收 `(index, itemData)` 参数并返回 React 元素。
|
|
327
|
+
- 使用核心类时,通过 `onRenderItem` 回调自定义渲染。
|
|
328
|
+
|
|
329
|
+
4. **浏览器兼容性**:
|
|
330
|
+
- 需要支持 IntersectionObserver API(现代浏览器都支持)。
|
|
331
|
+
- 对于不支持的环境,会自动降级使用滚动事件。
|
|
332
|
+
|
|
333
|
+
5. **依赖**:
|
|
334
|
+
- 核心库依赖 `lenis` 用于平滑滚动。
|
|
335
|
+
- Vue 组件需要 Vue 3.x。
|
|
336
|
+
- React 组件需要 React 16.8+(支持 Hooks)。
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## 更新日志
|
|
341
|
+
|
|
342
|
+
详见 [CHANGELOG.md](./CHANGELOG.md)
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## 许可证
|
|
347
|
+
|
|
348
|
+
ISC
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import t from"lenis";const e=310,i=200,s=2,n=1,o=2,r=5,h=24,a=50,l=.09,c=800,d=2,m=500,u="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",g=t=>1-Math.pow(1-t,3),p=encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="200" height="300" viewBox="0 0 200 300"><rect width="200" height="300" fill="#f0f0f0"/><text x="100" y="150" font-size="16" text-anchor="middle" fill="#999">加载失败</text></svg>');class f{#t=!0;constructor(t,d,m={}){this.container=t,this.items=d,this.itemHeight=m.itemHeight||e,this.itemWidth=m.itemWidth||i,this.buffer=void 0!==m.buffer?m.buffer:this.isHighPerformanceDevice()?n:s,this.columns=m.columns||o,this.gap=m.gap||r,this.preloadCount=m.preloadCount||h,this.maxPoolSize=m.maxPoolSize||a,this.scrollDamping=void 0!==m.scrollDamping?m.scrollDamping:l,this.onRenderItem=m.onRenderItem,this.onScroll=m.onScroll,this.onItemClick=m.onItemClick,this.visibleCount=Math.ceil(t.clientHeight/this.itemHeight*this.columns)+2*this.buffer*this.columns,this._rowHeight=this.itemHeight,this._itemsPerRow=this.columns,this._itemWidthWithGap=this.itemWidth+this.gap,this.elementPool=[],this.activeElements=[],this.ticking=!1,this.preloadedSet=new Set,this.updateFrameId=null,this.itemPositionCache=new Map,this.preloadDistance=void 0!==m.preloadDistance?m.preloadDistance:c,this.resizeHandler=this.handleResize.bind(this),this.clickHandler=this.handleItemClick.bind(this),this.scrollFallbackHandler=null,this.init()}init(){const t=this.container.clientHeight||500;this.container.style.cssText=`position: relative; overflow-y: auto; overflow-x: hidden; height: ${t}px`,this.contentContainer=document.createElement("div"),this.contentContainer.style.cssText=`position: relative; height: ${this.getTotalHeight()}px`,this.container.appendChild(this.contentContainer),this.initObserver(),this.preloadInitialImages(),this.initLenis(),this.update(),this.bindEvents()}initLenis(){this.lenis=new t({wrapper:this.container,content:this.contentContainer,lerp:this.scrollDamping,orientation:"vertical",smoothWheel:!0,infinite:!1,autoResize:!0,autoRaf:!1,touchMultiplier:1,wheelMultiplier:1,normalizeWheel:!1,touchInertia:!1,prevent:()=>!1}),this.lenis.on("scroll",()=>{this.requestUpdate()}),this.raf()}raf(t){this.lenis.raf(t),this.__rafID=requestAnimationFrame(this.raf.bind(this))}getTotalHeight(){return Math.ceil(this.items.length/this.columns)*this.itemHeight}initObserver(){if(!("IntersectionObserver"in window))return this.#t=!1,this.scrollFallbackHandler=this.requestUpdate.bind(this),void this.container.addEventListener("scroll",this.scrollFallbackHandler,{passive:!0});this.#t=!0,this.observer=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){const e=t.target,i=parseInt(e.dataset.index);i<this.items.length&&this.loadImage(e,i),this.observer.unobserve(e)}})},{root:this.container,rootMargin:`${this.preloadDistance}px`,threshold:.01})}preloadInitialImages(){const t=Math.min(this.preloadCount,this.items.length);for(let e=0;e<t;e++)this.preloadImage(e)}cleanupPreloadedSet(){if(this.preloadedSet.size>m){const t=this.lenis?.scroll||0,e=Math.floor(t/this.itemHeight),i=Math.max(0,(e-this.buffer)*this.columns),s=i+this.visibleCount,n=d*this.buffer*this.columns,o=Math.max(0,i-n),r=s+n;this.preloadedSet.forEach(t=>{(t<o||t>r)&&this.preloadedSet.delete(t)})}}preloadImage(t){if(this.preloadedSet.has(t))return;const e=this.items[t];if(e){const i=new Image;i.onload=()=>this.preloadedSet.add(t),i.src=e}}loadImage(t,e){const i=this.items[e];if(!i)return;t.src=u;const s=t._loadVersion=(t._loadVersion||0)+1,n=new Image;n.onload=()=>{t._loadVersion===s&&(t.src=i,this.preloadedSet.add(e))},n.onerror=()=>{t._loadVersion===s&&(t.src=`data:image/svg+xml;utf8,${p}`)},n.src=i}loadSingleImage(t,e){const i=new Image;i.onload=()=>{t.src=e},i.onerror=()=>{t.src=`data:image/svg+xml;utf8,${p}`},i.src=e}createOrUpdateItem(t){const e=this.items[t];if(!e)return null;let i=this.activeElements[t];return i||(i=this.elementPool.pop()||this.createItemElement(t,e),this.updateItemPosition(i,t),this.contentContainer.appendChild(i),this.activeElements[t]=i,this.updateItemData(i,t,e)),i}createItemElement(t,e){let i;this.onRenderItem&&"function"==typeof this.onRenderItem?i=this.onRenderItem(t,e):(i=document.createElement("img"),i.style.objectFit="cover");const s=i.style;return s.position="absolute",s.width=`${this.itemWidth}px`,s.height=this.itemHeight-this.gap+"px",s.margin="0",s.willChange="transform",s.backfaceVisibility="hidden",this.onItemClick&&i.addEventListener("click",this.clickHandler),i}calculateItemPosition(t){if(this.itemPositionCache.has(t))return this.itemPositionCache.get(t);const e=Math.floor(t/this._itemsPerRow),i=t%this._itemsPerRow,s={top:e*this._rowHeight,left:i*this._itemWidthWithGap};return this.itemPositionCache.set(t,s),s}updateItemPosition(t,e){const{top:i,left:s}=this.calculateItemPosition(e),n=`translate3d(${s}px, ${i}px, 0)`;t.style.transform!==n&&(t.style.transform=n)}updateItemData(t,e,i){t.dataset.index=e,t.dataset.src=i,e<this.preloadCount||this.preloadedSet.has(e)?t.src=i:this.#t&&this.observer?(t.src=u,this.observer.observe(t)):t.src=i}recycleItem(t){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove(),this.activeElements[t]=null,this.elementPool.length<this.maxPoolSize&&("IMG"===e.tagName&&(e.src=""),this.elementPool.push(e)))}update(){const t=this.lenis?.scroll||0,e=this._rowHeight,i=this._itemsPerRow,s=Math.floor(t/e),n=Math.max(0,(s-this.buffer)*i),o=Math.min(n+this.visibleCount,this.items.length),r=this.buffer*d,h=Math.max(0,n-r*i),a=Math.min(o+r*i,this.items.length);for(let t=h;t<a;t++)this.preloadImage(t);this.cleanupPreloadedSet();const l=new Set;for(let t=n;t<o;t++)t<this.items.length&&(l.add(t),this.createOrUpdateItem(t));const c=[],m=this.activeElements.length;for(let t=0;t<m;t++){this.activeElements[t]&&!l.has(t)&&(t<n-this.buffer*i||t>o+this.buffer*i)&&c.push(t)}c.forEach(t=>this.recycleItem(t)),this.onScroll?.(t,n,o),this.updateFrameId=null}scrollToIndex(t,e={}){const i=Math.max(0,Math.min(t,this.items.length-1)),s=Math.floor(i/this.columns)*this.itemHeight,{immediate:n=!1,duration:o=1.2,easing:r=g}=e;this.lenis?.scrollTo(s,{offset:0,immediate:n,duration:o,easing:r})}scrollToBottom(t={}){const e=this.getTotalHeight()-this.container.clientHeight,{immediate:i=!1,duration:s=1.2,easing:n=g}=t;this.lenis?.scrollTo(e,{offset:0,immediate:i,duration:s,easing:n})}scrollTo(t,e={}){const{immediate:i=!1,duration:s=1.2,easing:n=g}=e;this.lenis?.scrollTo(t,{offset:0,immediate:i,duration:s,easing:n})}getFirstVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight);return Math.max(0,(e-this.buffer)*this._itemsPerRow)}getLastVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight),i=Math.max(0,(e-this.buffer)*this._itemsPerRow);return Math.min(i+this.visibleCount,this.items.length-1)}handleItemClick(t){let e=t.target;for(;e&&e!==this.contentContainer&&(!e.dataset||void 0===e.dataset.index);)e=e.parentElement;if(!e||e===this.contentContainer)return;const i=parseInt(e.dataset.index);isNaN(i)||this.onItemClick?.(i,this.items[i],e)}requestUpdate(){this.updateFrameId||(this.updateFrameId=requestAnimationFrame(()=>this.update()))}handleResize(){this.ticking||(requestAnimationFrame(()=>{this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.visibleCount=Math.ceil(this.container.clientHeight/this._rowHeight*this._itemsPerRow)+2*this.buffer*this._itemsPerRow,this.itemPositionCache.clear(),this.update(),this.ticking=!1}),this.ticking=!0)}bindEvents(){window.addEventListener("resize",this.resizeHandler)}scrollToTop(t={}){const{duration:e=1.2,easing:i=g,immediate:s=!1}=t;this.lenis?.scrollTo(0,{offset:0,immediate:s,duration:e,easing:i})}updateItems(t){this.items=t;const e=this.activeElements.length;for(let t=0;t<e;t++){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove())}this.activeElements=[],this.elementPool=[],this.preloadedSet.clear(),this.itemPositionCache.clear(),this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.preloadInitialImages(),this.update()}destroy(){this.__rafID&&cancelAnimationFrame(this.__rafID),this.updateFrameId&&cancelAnimationFrame(this.updateFrameId),this.lenis&&this.lenis.destroy(),window.removeEventListener("resize",this.resizeHandler),this.scrollFallbackHandler&&this.container&&(this.container.removeEventListener("scroll",this.scrollFallbackHandler),this.scrollFallbackHandler=null);const t=this.activeElements.length;for(let e=0;e<t;e++){const t=this.activeElements[e];t&&(t.removeEventListener("click",this.clickHandler),t._loadVersion=(t._loadVersion||0)+1)}this.#t&&this.observer&&(this.observer.disconnect(),this.observer=null),this.container.innerHTML="",this.elementPool=[],this.activeElements=[],this.preloadedSet.clear(),this.ticking=!1,this.itemPositionCache.clear(),this.container=null,this.contentContainer=null}isHighPerformanceDevice(){const t=navigator.hardwareConcurrency||4,e=window.devicePixelRatio||1;return t>4&&e<=1.5}}"undefined"!=typeof module&&module.exports?module.exports=f:"undefined"!=typeof window&&(window.VirtualList=f);export{f as VirtualList,f as default};
|
|
2
|
+
//# sourceMappingURL=virtual-list.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-list.esm.js","sources":["../index.js"],"names":["CONFIG","PLACEHOLDER_GIF","DEFAULT_EASING","t","Math","pow","ERROR_PLACEHOLDER_SVG","encodeURIComponent","VirtualList","useIntersectionObserver","constructor","container","items","options","this","itemHeight","itemWidth","buffer","undefined","isHighPerformanceDevice","columns","gap","preloadCount","maxPoolSize","scrollDamping","onRenderItem","onScroll","onItemClick","visibleCount","ceil","clientHeight","_rowHeight","_itemsPerRow","_itemWidthWithGap","elementPool","activeElements","ticking","preloadedSet","Set","updateFrameId","itemPositionCache","Map","preloadDistance","resizeHandler","handleResize","bind","clickHandler","handleItemClick","scrollFallbackHandler","init","containerHeight","style","cssText","contentContainer","document","createElement","getTotalHeight","appendChild","initObserver","preloadInitialImages","initLenis","update","bindEvents","lenis","Lenis","wrapper","content","lerp","orientation","smoothWheel","infinite","autoResize","autoRaf","touchMultiplier","wheelMultiplier","normalizeWheel","touchInertia","prevent","on","requestUpdate","raf","time","__rafID","requestAnimationFrame","length","window","addEventListener","passive","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","element","target","index","parseInt","dataset","loadImage","unobserve","root","rootMargin","threshold","preloadNum","min","i","preloadImage","cleanupPreloadedSet","size","scrollTop","scroll","firstVisibleRow","floor","minVisibleIndex","max","maxVisibleIndex","keepRange","minKeepIndex","maxKeepIndex","delete","has","itemData","tempImg","Image","onload","add","src","loadVersion","_loadVersion","img","onerror","loadSingleImage","url","createOrUpdateItem","itemElement","pop","createItemElement","updateItemPosition","updateItemData","objectFit","position","width","height","margin","willChange","backfaceVisibility","calculateItemPosition","get","row","col","top","left","set","transformValue","transform","observe","recycleItem","remove","tagName","push","rowHeight","itemsPerRow","firstVisibleIndex","lastVisibleIndex","preloadBuffer","preloadStartIndex","preloadEndIndex","itemsToShow","indicesToRecycle","activeLen","scrollToIndex","targetIndex","offsetTop","immediate","duration","easing","scrollTo","offset","scrollToBottom","maxScrollTop","getFirstVisibleIndex","getLastVisibleIndex","event","parentElement","isNaN","clear","scrollToTop","updateItems","newItems","destroy","cancelAnimationFrame","removeEventListener","disconnect","innerHTML","logicalCores","navigator","hardwareConcurrency","dpr","devicePixelRatio","module","exports"],"mappings":"qBAGA,MAAMA,EACmB,IADnBA,EAEkB,IAFlBA,EAGc,EAHdA,EAIuB,EAJvBA,EAKe,EALfA,EAMW,EANXA,EAOqB,GAPrBA,EAQqB,GARrBA,EASsB,IATtBA,EAUwB,IAVxBA,EAWkB,EAXlBA,EAYmB,IAInBC,EAAkB,6EAGlBC,EAAkBC,GAAM,EAAIC,KAAKC,IAAI,EAAIF,EAAG,GAG5CG,EAAwBC,mBAAmB,iOAIjD,MAAMC,EACFC,IAA2B,EAO3B,WAAAC,CAAYC,EAAWC,EAAOC,EAAU,CAAA,GAEpCC,KAAKH,UAAYA,EACjBG,KAAKF,MAAQA,EAGbE,KAAKC,WAAaF,EAAQE,YAAcf,EACxCc,KAAKE,UAAYH,EAAQG,WAAahB,EACtCc,KAAKG,YAA4BC,IAAnBL,EAAQI,OAAuBJ,EAAQI,OAAUH,KAAKK,0BAA4BnB,EAAiCA,EACjIc,KAAKM,QAAUP,EAAQO,SAAWpB,EAClCc,KAAKO,IAAMR,EAAQQ,KAAOrB,EAG1Bc,KAAKQ,aAAeT,EAAQS,cAAgBtB,EAC5Cc,KAAKS,YAAcV,EAAQU,aAAevB,EAC1Cc,KAAKU,mBAA0CN,IAA1BL,EAAQW,cAA8BX,EAAQW,cAAgBxB,EAGnFc,KAAKW,aAAeZ,EAAQY,aAC5BX,KAAKY,SAAWb,EAAQa,SACxBZ,KAAKa,YAAcd,EAAQc,YAG3Bb,KAAKc,aAAexB,KAAKyB,KAAMlB,EAAUmB,aAAehB,KAAKC,WAAcD,KAAKM,SAA0B,EAAdN,KAAKG,OAAaH,KAAKM,QAGnHN,KAAKiB,WAAajB,KAAKC,WACvBD,KAAKkB,aAAelB,KAAKM,QACzBN,KAAKmB,kBAAoBnB,KAAKE,UAAYF,KAAKO,IAI/CP,KAAKoB,YAAc,GACnBpB,KAAKqB,eAAiB,GAGtBrB,KAAKsB,SAAU,EAGftB,KAAKuB,aAAe,IAAIC,IAGxBxB,KAAKyB,cAAgB,KACrBzB,KAAK0B,kBAAoB,IAAIC,IAG7B3B,KAAK4B,qBAA8CxB,IAA5BL,EAAQ6B,gBAAgC7B,EAAQ6B,gBAAkB1C,EAGzFc,KAAK6B,cAAgB7B,KAAK8B,aAAaC,KAAK/B,MAC5CA,KAAKgC,aAAehC,KAAKiC,gBAAgBF,KAAK/B,MAC9CA,KAAKkC,sBAAwB,KAG7BlC,KAAKmC,MACT,CAKA,IAAAA,GAEI,MAAMC,EAAkBpC,KAAKH,UAAUmB,cAAgB,IACvDhB,KAAKH,UAAUwC,MAAMC,QAAU,qEAAqEF,MAGpGpC,KAAKuC,iBAAmBC,SAASC,cAAc,OAC/CzC,KAAKuC,iBAAiBF,MAAMC,QAAU,+BAA+BtC,KAAK0C,qBAC1E1C,KAAKH,UAAU8C,YAAY3C,KAAKuC,kBAGhCvC,KAAK4C,eAGL5C,KAAK6C,uBAGL7C,KAAK8C,YAGL9C,KAAK+C,SAGL/C,KAAKgD,YACT,CAKA,SAAAF,GAEI9C,KAAKiD,MAAQ,IAAIC,EAAM,CACnBC,QAASnD,KAAKH,UACduD,QAASpD,KAAKuC,iBACdc,KAAMrD,KAAKU,cACX4C,YAAa,WACbC,aAAa,EACbC,UAAU,EACVC,YAAY,EACZC,SAAS,EACTC,gBAAiB,EACjBC,gBAAiB,EACjBC,gBAAgB,EAChBC,cAAc,EACdC,QAAS,KAAM,IAInB/D,KAAKiD,MAAMe,GAAG,SAAU,KACpBhE,KAAKiE,kBAITjE,KAAKkE,KACT,CAKA,GAAAA,CAAIC,GACAnE,KAAKiD,MAAMiB,IAAIC,GACfnE,KAAKoE,QAAUC,sBAAsBrE,KAAKkE,IAAInC,KAAK/B,MACvD,CAMA,cAAA0C,GACI,OAAOpD,KAAKyB,KAAKf,KAAKF,MAAMwE,OAAStE,KAAKM,SAAWN,KAAKC,UAC9D,CAKA,YAAA2C,GACI,KAAM,yBAA0B2B,QAM5B,OAHAvE,MAAKL,GAA2B,EAChCK,KAAKkC,sBAAwBlC,KAAKiE,cAAclC,KAAK/B,WACrDA,KAAKH,UAAU2E,iBAAiB,SAAUxE,KAAKkC,sBAAuB,CAAEuC,SAAS,IAIrFzE,MAAKL,GAA2B,EAChCK,KAAK0E,SAAW,IAAIC,qBAAsBC,IACtCA,EAAQC,QAAQC,IAEZ,GAAIA,EAAMC,eAAgB,CACtB,MAAMC,EAAUF,EAAMG,OAChBC,EAAQC,SAASH,EAAQI,QAAQF,OACnCA,EAAQlF,KAAKF,MAAMwE,QACnBtE,KAAKqF,UAAUL,EAASE,GAG5BlF,KAAK0E,SAASY,UAAUN,EAC5B,KAEL,CACCO,KAAMvF,KAAKH,UACX2F,WAAY,GAAGxF,KAAK4B,oBACpB6D,UAAW,KAEnB,CAKA,oBAAA5C,GAEI,MAAM6C,EAAapG,KAAKqG,IAAI3F,KAAKQ,aAAcR,KAAKF,MAAMwE,QAE1D,IAAK,IAAIsB,EAAI,EAAGA,EAAIF,EAAYE,IAC5B5F,KAAK6F,aAAaD,EAE1B,CAKA,mBAAAE,GACI,GAAI9F,KAAKuB,aAAawE,KAAO7G,EAA4B,CAErD,MAAM8G,EAAYhG,KAAKiD,OAAOgD,QAAU,EAClCC,EAAkB5G,KAAK6G,MAAMH,EAAYhG,KAAKC,YAC9CmG,EAAkB9G,KAAK+G,IAAI,GAAIH,EAAkBlG,KAAKG,QAAUH,KAAKM,SACrEgG,EAAkBF,EAAkBpG,KAAKc,aAGzCyF,EAAYrH,EAA4Bc,KAAKG,OAASH,KAAKM,QAC3DkG,EAAelH,KAAK+G,IAAI,EAAGD,EAAkBG,GAC7CE,EAAeH,EAAkBC,EAGvCvG,KAAKuB,aAAasD,QAAQK,KAClBA,EAAQsB,GAAgBtB,EAAQuB,IAChCzG,KAAKuB,aAAamF,OAAOxB,IAGrC,CACJ,CAMA,YAAAW,CAAaX,GAET,GAAIlF,KAAKuB,aAAaoF,IAAIzB,GAAQ,OAElC,MAAM0B,EAAW5G,KAAKF,MAAMoF,GAC5B,GAAI0B,EAAU,CAEV,MAAMC,EAAU,IAAIC,MACpBD,EAAQE,OAAS,IAAM/G,KAAKuB,aAAayF,IAAI9B,GAC7C2B,EAAQI,IAAML,CAClB,CACJ,CAOA,SAAAvB,CAAUL,EAASE,GACf,MAAM0B,EAAW5G,KAAKF,MAAMoF,GAC5B,IAAK0B,EAAU,OAGf5B,EAAQiC,IAAM9H,EAGd,MAAM+H,EAAelC,EAAQmC,cAAgBnC,EAAQmC,cAAgB,GAAK,EAEpEC,EAAM,IAAIN,MAChBM,EAAIL,OAAS,KACL/B,EAAQmC,eAAiBD,IAC7BlC,EAAQiC,IAAML,EAEd5G,KAAKuB,aAAayF,IAAI9B,KAE1BkC,EAAIC,QAAU,KACNrC,EAAQmC,eAAiBD,IAC7BlC,EAAQiC,IAAM,2BAA2BzH,MAE7C4H,EAAIH,IAAML,CACd,CAOA,eAAAU,CAAgBtC,EAASuC,GACrB,MAAMH,EAAM,IAAIN,MAChBM,EAAIL,OAAS,KAAQ/B,EAAQiC,IAAMM,GACnCH,EAAIC,QAAU,KAAQrC,EAAQiC,IAAM,2BAA2BzH,KAC/D4H,EAAIH,IAAMM,CACd,CAOA,kBAAAC,CAAmBtC,GACf,MAAM0B,EAAW5G,KAAKF,MAAMoF,GAC5B,IAAK0B,EAAU,OAAO,KAGtB,IAAIa,EAAczH,KAAKqB,eAAe6D,GAkBtC,OAhBKuC,IAEDA,EAAczH,KAAKoB,YAAYsG,OAAS1H,KAAK2H,kBAAkBzC,EAAO0B,GAGtE5G,KAAK4H,mBAAmBH,EAAavC,GAGrClF,KAAKuC,iBAAiBI,YAAY8E,GAClCzH,KAAKqB,eAAe6D,GAASuC,EAI7BzH,KAAK6H,eAAeJ,EAAavC,EAAO0B,IAGrCa,CACX,CAQA,iBAAAE,CAAkBzC,EAAO0B,GACrB,IAAIa,EAEAzH,KAAKW,cAA6C,mBAAtBX,KAAKW,aAEjC8G,EAAczH,KAAKW,aAAauE,EAAO0B,IAGvCa,EAAcjF,SAASC,cAAc,OACrCgF,EAAYpF,MAAMyF,UAAY,SAIlC,MAAMzF,EAAQoF,EAAYpF,MAa1B,OAZAA,EAAM0F,SAAW,WACjB1F,EAAM2F,MAAQ,GAAGhI,KAAKE,cACtBmC,EAAM4F,OAAYjI,KAAKC,WAAaD,KAAKO,IAA1B,KACf8B,EAAM6F,OAAS,IACf7F,EAAM8F,WAAa,YACnB9F,EAAM+F,mBAAqB,SAGvBpI,KAAKa,aACL4G,EAAYjD,iBAAiB,QAASxE,KAAKgC,cAGxCyF,CACX,CAOA,qBAAAY,CAAsBnD,GAElB,GAAIlF,KAAK0B,kBAAkBiF,IAAIzB,GAC3B,OAAOlF,KAAK0B,kBAAkB4G,IAAIpD,GAItC,MAAMqD,EAAMjJ,KAAK6G,MAAMjB,EAAQlF,KAAKkB,cAC9BsH,EAAMtD,EAAQlF,KAAKkB,aAOnB6G,EAAW,CAAEU,IAJPF,EAAMvI,KAAKiB,WAICyH,KAHXF,EAAMxI,KAAKmB,mBAMxB,OAFAnB,KAAK0B,kBAAkBiH,IAAIzD,EAAO6C,GAE3BA,CACX,CAOA,kBAAAH,CAAmBH,EAAavC,GAC5B,MAAMuD,IAAEA,EAAGC,KAAEA,GAAS1I,KAAKqI,sBAAsBnD,GAI3C0D,EAAiB,eAAeF,QAAWD,UAC7ChB,EAAYpF,MAAMwG,YAAcD,IAChCnB,EAAYpF,MAAMwG,UAAYD,EAEtC,CAQA,cAAAf,CAAeJ,EAAavC,EAAO0B,GAE/Ba,EAAYrC,QAAQF,MAAQA,EAC5BuC,EAAYrC,QAAQ6B,IAAML,EAEtB1B,EAAQlF,KAAKQ,cAAgBR,KAAKuB,aAAaoF,IAAIzB,GAEnDuC,EAAYR,IAAML,EACX5G,MAAKL,GAA4BK,KAAK0E,UAE7C+C,EAAYR,IAAM9H,EAClBa,KAAK0E,SAASoE,QAAQrB,IAGtBA,EAAYR,IAAML,CAE1B,CAMA,WAAAmC,CAAY7D,GACR,MAAMuC,EAAczH,KAAKqB,eAAe6D,GACpCuC,IAEIzH,MAAKL,GAA4BK,KAAK0E,UACtC1E,KAAK0E,SAASY,UAAUmC,GAI5BA,EAAYN,cAAgBM,EAAYN,cAAgB,GAAK,EAG7DM,EAAYuB,SAGZhJ,KAAKqB,eAAe6D,GAAS,KAGzBlF,KAAKoB,YAAYkD,OAAStE,KAAKS,cAEH,QAAxBgH,EAAYwB,UAAmBxB,EAAYR,IAAM,IACrDjH,KAAKoB,YAAY8H,KAAKzB,IAGlC,CAKA,MAAA1E,GAEI,MAAMiD,EAAYhG,KAAKiD,OAAOgD,QAAU,EAGlCkD,EAAYnJ,KAAKiB,WACjBmI,EAAcpJ,KAAKkB,aAGnBgF,EAAkB5G,KAAK6G,MAAMH,EAAYmD,GACzCE,EAAoB/J,KAAK+G,IAAI,GAAIH,EAAkBlG,KAAKG,QAAUiJ,GAClEE,EAAmBhK,KAAKqG,IAAI0D,EAAoBrJ,KAAKc,aAAcd,KAAKF,MAAMwE,QAG9EiF,EAAgBvJ,KAAKG,OAASjB,EAC9BsK,EAAoBlK,KAAK+G,IAAI,EAAGgD,EAAqBE,EAAgBH,GACrEK,EAAkBnK,KAAKqG,IAAI2D,EAAoBC,EAAgBH,EAAcpJ,KAAKF,MAAMwE,QAE9F,IAAK,IAAIsB,EAAI4D,EAAmB5D,EAAI6D,EAAiB7D,IACjD5F,KAAK6F,aAAaD,GAItB5F,KAAK8F,sBAGL,MAAM4D,EAAc,IAAIlI,IAGxB,IAAK,IAAIoE,EAAIyD,EAAmBzD,EAAI0D,EAAkB1D,IAC9CA,EAAI5F,KAAKF,MAAMwE,SACfoF,EAAY1C,IAAIpB,GACA5F,KAAKwH,mBAAmB5B,IAYhD,MAAM+D,EAAmB,GACnBC,EAAY5J,KAAKqB,eAAeiD,OACtC,IAAK,IAAIsB,EAAI,EAAGA,EAAIgE,EAAWhE,IAAK,CAChB5F,KAAKqB,eAAeuE,KACpB8D,EAAY/C,IAAIf,KAC3BA,EAAIyD,EAAoBrJ,KAAKG,OAASiJ,GACtCxD,EAAI0D,EAAmBtJ,KAAKG,OAASiJ,IACtCO,EAAiBT,KAAKtD,EAE9B,CAGA+D,EAAiB9E,QAAQK,GAASlF,KAAK+I,YAAY7D,IAGnDlF,KAAKY,WAAWoF,EAAWqD,EAAmBC,GAG9CtJ,KAAKyB,cAAgB,IACzB,CASA,aAAAoI,CAAc3E,EAAOnF,EAAU,IAC3B,MAAM+J,EAAcxK,KAAK+G,IAAI,EAAG/G,KAAKqG,IAAIT,EAAOlF,KAAKF,MAAMwE,OAAS,IAE9DyF,EADMzK,KAAK6G,MAAM2D,EAAc9J,KAAKM,SAClBN,KAAKC,YAEvB+J,UACFA,GAAY,EAAKC,SACjBA,EAAW,IAAGC,OACdA,EAAS9K,GACTW,EAEJC,KAAKiD,OAAOkH,SAASJ,EAAW,CAAEK,OAAQ,EAAGJ,YAAWC,WAAUC,UACtE,CAQA,cAAAG,CAAetK,EAAU,IACrB,MAAMuK,EAAetK,KAAK0C,iBAAmB1C,KAAKH,UAAUmB,cACtDgJ,UACFA,GAAY,EAAKC,SACjBA,EAAW,IAAGC,OACdA,EAAS9K,GACTW,EAEJC,KAAKiD,OAAOkH,SAASG,EAAc,CAAEF,OAAQ,EAAGJ,YAAWC,WAAUC,UACzE,CASA,QAAAC,CAASnE,EAAWjG,EAAU,IAC1B,MAAMiK,UACFA,GAAY,EAAKC,SACjBA,EAAW,IAAGC,OACdA,EAAS9K,GACTW,EAEJC,KAAKiD,OAAOkH,SAASnE,EAAW,CAAEoE,OAAQ,EAAGJ,YAAWC,WAAUC,UACtE,CAMA,oBAAAK,GACI,MAAMvE,EAAYhG,KAAKiD,OAAOgD,QAAU,EAClCC,EAAkB5G,KAAK6G,MAAMH,EAAYhG,KAAKiB,YACpD,OAAO3B,KAAK+G,IAAI,GAAIH,EAAkBlG,KAAKG,QAAUH,KAAKkB,aAC9D,CAMA,mBAAAsJ,GACI,MAAMxE,EAAYhG,KAAKiD,OAAOgD,QAAU,EAClCC,EAAkB5G,KAAK6G,MAAMH,EAAYhG,KAAKiB,YAC9CoI,EAAoB/J,KAAK+G,IAAI,GAAIH,EAAkBlG,KAAKG,QAAUH,KAAKkB,cAC7E,OAAO5B,KAAKqG,IAAI0D,EAAoBrJ,KAAKc,aAAcd,KAAKF,MAAMwE,OAAS,EAC/E,CAMA,eAAArC,CAAgBwI,GAEZ,IAAIxF,EAASwF,EAAMxF,OACnB,KAAOA,GAAUA,IAAWjF,KAAKuC,oBACzB0C,EAAOG,cAAoChF,IAAzB6E,EAAOG,QAAQF,QACrCD,EAASA,EAAOyF,cAEpB,IAAKzF,GAAUA,IAAWjF,KAAKuC,iBAAkB,OAEjD,MAAM2C,EAAQC,SAASF,EAAOG,QAAQF,OAClCyF,MAAMzF,IAGVlF,KAAKa,cAAcqE,EAAOlF,KAAKF,MAAMoF,GAAQD,EACjD,CAKA,aAAAhB,GACSjE,KAAKyB,gBACNzB,KAAKyB,cAAgB4C,sBAAsB,IAAMrE,KAAK+C,UAE9D,CAKA,YAAAjB,GAES9B,KAAKsB,UACN+C,sBAAsB,KAElBrE,KAAKuC,iBAAiBF,MAAM4F,OAAS,GAAGjI,KAAK0C,qBAC7C1C,KAAKc,aAAexB,KAAKyB,KAAMf,KAAKH,UAAUmB,aAAehB,KAAKiB,WAAcjB,KAAKkB,cAA+B,EAAdlB,KAAKG,OAAaH,KAAKkB,aAG7HlB,KAAK0B,kBAAkBkJ,QAEvB5K,KAAK+C,SACL/C,KAAKsB,SAAU,IAEnBtB,KAAKsB,SAAU,EAEvB,CAKA,UAAA0B,GACIuB,OAAOC,iBAAiB,SAAUxE,KAAK6B,cAC3C,CASA,WAAAgJ,CAAY9K,EAAU,IAClB,MAAMkK,SACFA,EAAW,IAAGC,OACdA,EAAS9K,EAAc4K,UACvBA,GAAY,GACZjK,EAEJC,KAAKiD,OAAOkH,SAAS,EAAG,CAAEC,OAAQ,EAAGJ,YAAWC,WAAUC,UAC9D,CAMA,WAAAY,CAAYC,GACR/K,KAAKF,MAAQiL,EAGb,MAAMnB,EAAY5J,KAAKqB,eAAeiD,OACtC,IAAK,IAAIsB,EAAI,EAAGA,EAAIgE,EAAWhE,IAAK,CAChC,MAAMZ,EAAUhF,KAAKqB,eAAeuE,GAChCZ,IAEIhF,MAAKL,GAA4BK,KAAK0E,UACtC1E,KAAK0E,SAASY,UAAUN,GAG5BA,EAAQmC,cAAgBnC,EAAQmC,cAAgB,GAAK,EACrDnC,EAAQgE,SAEhB,CACAhJ,KAAKqB,eAAiB,GACtBrB,KAAKoB,YAAc,GACnBpB,KAAKuB,aAAaqJ,QAGlB5K,KAAK0B,kBAAkBkJ,QAGvB5K,KAAKuC,iBAAiBF,MAAM4F,OAAS,GAAGjI,KAAK0C,qBAG7C1C,KAAK6C,uBAGL7C,KAAK+C,QACT,CAKA,OAAAiI,GAEQhL,KAAKoE,SACL6G,qBAAqBjL,KAAKoE,SAI1BpE,KAAKyB,eACLwJ,qBAAqBjL,KAAKyB,eAI1BzB,KAAKiD,OACLjD,KAAKiD,MAAM+H,UAIfzG,OAAO2G,oBAAoB,SAAUlL,KAAK6B,eAGtC7B,KAAKkC,uBAAyBlC,KAAKH,YACnCG,KAAKH,UAAUqL,oBAAoB,SAAUlL,KAAKkC,uBAClDlC,KAAKkC,sBAAwB,MAIjC,MAAM0H,EAAY5J,KAAKqB,eAAeiD,OACtC,IAAK,IAAIsB,EAAI,EAAGA,EAAIgE,EAAWhE,IAAK,CAChC,MAAMZ,EAAUhF,KAAKqB,eAAeuE,GAChCZ,IACAA,EAAQkG,oBAAoB,QAASlL,KAAKgC,cAE1CgD,EAAQmC,cAAgBnC,EAAQmC,cAAgB,GAAK,EAE7D,CAGInH,MAAKL,GAA4BK,KAAK0E,WACtC1E,KAAK0E,SAASyG,aACdnL,KAAK0E,SAAW,MAIpB1E,KAAKH,UAAUuL,UAAY,GAC3BpL,KAAKoB,YAAc,GACnBpB,KAAKqB,eAAiB,GACtBrB,KAAKuB,aAAaqJ,QAClB5K,KAAKsB,SAAU,EAGftB,KAAK0B,kBAAkBkJ,QAGvB5K,KAAKH,UAAY,KACjBG,KAAKuC,iBAAmB,IAC5B,CAEA,uBAAAlC,GAEI,MAAMgL,EAAeC,UAAUC,qBAAuB,EAChDC,EAAMjH,OAAOkH,kBAAoB,EAGvC,OAAOJ,EAAe,GAAKG,GAAO,GACtC,EAIkB,oBAAXE,QAA0BA,OAAOC,QACxCD,OAAOC,QAAUjM,EACQ,oBAAX6E,SACdA,OAAO7E,YAAcA"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import t,{forwardRef as e,useRef as i,useState as s,useCallback as n,useEffect as r,useImperativeHandle as o}from"react";import a from"react-dom/client";import l from"lenis";const h=310,c=200,d=2,m=1,u=2,p=5,g=24,f=50,v=.09,I=800,b=2,w=500,x="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",DEFAULT_EASING=t=>1-Math.pow(1-t,3),C=encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="200" height="300" viewBox="0 0 200 300"><rect width="200" height="300" fill="#f0f0f0"/><text x="100" y="150" font-size="16" text-anchor="middle" fill="#999">加载失败</text></svg>');class VirtualList{#t=!0;constructor(t,e,i={}){this.container=t,this.items=e,this.itemHeight=i.itemHeight||h,this.itemWidth=i.itemWidth||c,this.buffer=void 0!==i.buffer?i.buffer:this.isHighPerformanceDevice()?m:d,this.columns=i.columns||u,this.gap=i.gap||p,this.preloadCount=i.preloadCount||g,this.maxPoolSize=i.maxPoolSize||f,this.scrollDamping=void 0!==i.scrollDamping?i.scrollDamping:v,this.onRenderItem=i.onRenderItem,this.onScroll=i.onScroll,this.onItemClick=i.onItemClick,this.visibleCount=Math.ceil(t.clientHeight/this.itemHeight*this.columns)+2*this.buffer*this.columns,this._rowHeight=this.itemHeight,this._itemsPerRow=this.columns,this._itemWidthWithGap=this.itemWidth+this.gap,this.elementPool=[],this.activeElements=[],this.ticking=!1,this.preloadedSet=new Set,this.updateFrameId=null,this.itemPositionCache=new Map,this.preloadDistance=void 0!==i.preloadDistance?i.preloadDistance:I,this.resizeHandler=this.handleResize.bind(this),this.clickHandler=this.handleItemClick.bind(this),this.scrollFallbackHandler=null,this.init()}init(){const t=this.container.clientHeight||500;this.container.style.cssText=`position: relative; overflow-y: auto; overflow-x: hidden; height: ${t}px`,this.contentContainer=document.createElement("div"),this.contentContainer.style.cssText=`position: relative; height: ${this.getTotalHeight()}px`,this.container.appendChild(this.contentContainer),this.initObserver(),this.preloadInitialImages(),this.initLenis(),this.update(),this.bindEvents()}initLenis(){this.lenis=new l({wrapper:this.container,content:this.contentContainer,lerp:this.scrollDamping,orientation:"vertical",smoothWheel:!0,infinite:!1,autoResize:!0,autoRaf:!1,touchMultiplier:1,wheelMultiplier:1,normalizeWheel:!1,touchInertia:!1,prevent:()=>!1}),this.lenis.on("scroll",()=>{this.requestUpdate()}),this.raf()}raf(t){this.lenis.raf(t),this.__rafID=requestAnimationFrame(this.raf.bind(this))}getTotalHeight(){return Math.ceil(this.items.length/this.columns)*this.itemHeight}initObserver(){if(!("IntersectionObserver"in window))return this.#t=!1,this.scrollFallbackHandler=this.requestUpdate.bind(this),void this.container.addEventListener("scroll",this.scrollFallbackHandler,{passive:!0});this.#t=!0,this.observer=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){const e=t.target,i=parseInt(e.dataset.index);i<this.items.length&&this.loadImage(e,i),this.observer.unobserve(e)}})},{root:this.container,rootMargin:`${this.preloadDistance}px`,threshold:.01})}preloadInitialImages(){const t=Math.min(this.preloadCount,this.items.length);for(let e=0;e<t;e++)this.preloadImage(e)}cleanupPreloadedSet(){if(this.preloadedSet.size>w){const t=this.lenis?.scroll||0,e=Math.floor(t/this.itemHeight),i=Math.max(0,(e-this.buffer)*this.columns),s=i+this.visibleCount,n=b*this.buffer*this.columns,r=Math.max(0,i-n),o=s+n;this.preloadedSet.forEach(t=>{(t<r||t>o)&&this.preloadedSet.delete(t)})}}preloadImage(t){if(this.preloadedSet.has(t))return;const e=this.items[t];if(e){const i=new Image;i.onload=()=>this.preloadedSet.add(t),i.src=e}}loadImage(t,e){const i=this.items[e];if(!i)return;t.src=x;const s=t._loadVersion=(t._loadVersion||0)+1,n=new Image;n.onload=()=>{t._loadVersion===s&&(t.src=i,this.preloadedSet.add(e))},n.onerror=()=>{t._loadVersion===s&&(t.src=`data:image/svg+xml;utf8,${C}`)},n.src=i}loadSingleImage(t,e){const i=new Image;i.onload=()=>{t.src=e},i.onerror=()=>{t.src=`data:image/svg+xml;utf8,${C}`},i.src=e}createOrUpdateItem(t){const e=this.items[t];if(!e)return null;let i=this.activeElements[t];return i||(i=this.elementPool.pop()||this.createItemElement(t,e),this.updateItemPosition(i,t),this.contentContainer.appendChild(i),this.activeElements[t]=i,this.updateItemData(i,t,e)),i}createItemElement(t,e){let i;this.onRenderItem&&"function"==typeof this.onRenderItem?i=this.onRenderItem(t,e):(i=document.createElement("img"),i.style.objectFit="cover");const s=i.style;return s.position="absolute",s.width=`${this.itemWidth}px`,s.height=this.itemHeight-this.gap+"px",s.margin="0",s.willChange="transform",s.backfaceVisibility="hidden",this.onItemClick&&i.addEventListener("click",this.clickHandler),i}calculateItemPosition(t){if(this.itemPositionCache.has(t))return this.itemPositionCache.get(t);const e=Math.floor(t/this._itemsPerRow),i=t%this._itemsPerRow,s={top:e*this._rowHeight,left:i*this._itemWidthWithGap};return this.itemPositionCache.set(t,s),s}updateItemPosition(t,e){const{top:i,left:s}=this.calculateItemPosition(e),n=`translate3d(${s}px, ${i}px, 0)`;t.style.transform!==n&&(t.style.transform=n)}updateItemData(t,e,i){t.dataset.index=e,t.dataset.src=i,e<this.preloadCount||this.preloadedSet.has(e)?t.src=i:this.#t&&this.observer?(t.src=x,this.observer.observe(t)):t.src=i}recycleItem(t){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove(),this.activeElements[t]=null,this.elementPool.length<this.maxPoolSize&&("IMG"===e.tagName&&(e.src=""),this.elementPool.push(e)))}update(){const t=this.lenis?.scroll||0,e=this._rowHeight,i=this._itemsPerRow,s=Math.floor(t/e),n=Math.max(0,(s-this.buffer)*i),r=Math.min(n+this.visibleCount,this.items.length),o=this.buffer*b,a=Math.max(0,n-o*i),l=Math.min(r+o*i,this.items.length);for(let t=a;t<l;t++)this.preloadImage(t);this.cleanupPreloadedSet();const h=new Set;for(let t=n;t<r;t++)t<this.items.length&&(h.add(t),this.createOrUpdateItem(t));const c=[],d=this.activeElements.length;for(let t=0;t<d;t++){this.activeElements[t]&&!h.has(t)&&(t<n-this.buffer*i||t>r+this.buffer*i)&&c.push(t)}c.forEach(t=>this.recycleItem(t)),this.onScroll?.(t,n,r),this.updateFrameId=null}scrollToIndex(t,e={}){const i=Math.max(0,Math.min(t,this.items.length-1)),s=Math.floor(i/this.columns)*this.itemHeight,{immediate:n=!1,duration:r=1.2,easing:o=DEFAULT_EASING}=e;this.lenis?.scrollTo(s,{offset:0,immediate:n,duration:r,easing:o})}scrollToBottom(t={}){const e=this.getTotalHeight()-this.container.clientHeight,{immediate:i=!1,duration:s=1.2,easing:n=DEFAULT_EASING}=t;this.lenis?.scrollTo(e,{offset:0,immediate:i,duration:s,easing:n})}scrollTo(t,e={}){const{immediate:i=!1,duration:s=1.2,easing:n=DEFAULT_EASING}=e;this.lenis?.scrollTo(t,{offset:0,immediate:i,duration:s,easing:n})}getFirstVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight);return Math.max(0,(e-this.buffer)*this._itemsPerRow)}getLastVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight),i=Math.max(0,(e-this.buffer)*this._itemsPerRow);return Math.min(i+this.visibleCount,this.items.length-1)}handleItemClick(t){let e=t.target;for(;e&&e!==this.contentContainer&&(!e.dataset||void 0===e.dataset.index);)e=e.parentElement;if(!e||e===this.contentContainer)return;const i=parseInt(e.dataset.index);isNaN(i)||this.onItemClick?.(i,this.items[i],e)}requestUpdate(){this.updateFrameId||(this.updateFrameId=requestAnimationFrame(()=>this.update()))}handleResize(){this.ticking||(requestAnimationFrame(()=>{this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.visibleCount=Math.ceil(this.container.clientHeight/this._rowHeight*this._itemsPerRow)+2*this.buffer*this._itemsPerRow,this.itemPositionCache.clear(),this.update(),this.ticking=!1}),this.ticking=!0)}bindEvents(){window.addEventListener("resize",this.resizeHandler)}scrollToTop(t={}){const{duration:e=1.2,easing:i=DEFAULT_EASING,immediate:s=!1}=t;this.lenis?.scrollTo(0,{offset:0,immediate:s,duration:e,easing:i})}updateItems(t){this.items=t;const e=this.activeElements.length;for(let t=0;t<e;t++){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove())}this.activeElements=[],this.elementPool=[],this.preloadedSet.clear(),this.itemPositionCache.clear(),this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.preloadInitialImages(),this.update()}destroy(){this.__rafID&&cancelAnimationFrame(this.__rafID),this.updateFrameId&&cancelAnimationFrame(this.updateFrameId),this.lenis&&this.lenis.destroy(),window.removeEventListener("resize",this.resizeHandler),this.scrollFallbackHandler&&this.container&&(this.container.removeEventListener("scroll",this.scrollFallbackHandler),this.scrollFallbackHandler=null);const t=this.activeElements.length;for(let e=0;e<t;e++){const t=this.activeElements[e];t&&(t.removeEventListener("click",this.clickHandler),t._loadVersion=(t._loadVersion||0)+1)}this.#t&&this.observer&&(this.observer.disconnect(),this.observer=null),this.container.innerHTML="",this.elementPool=[],this.activeElements=[],this.preloadedSet.clear(),this.ticking=!1,this.itemPositionCache.clear(),this.container=null,this.contentContainer=null}isHighPerformanceDevice(){const t=navigator.hardwareConcurrency||4,e=window.devicePixelRatio||1;return t>4&&e<=1.5}}"undefined"!=typeof module&&module.exports?module.exports=VirtualList:"undefined"!=typeof window&&(window.VirtualList=VirtualList);const H=e(({items:e=[],itemHeight:l=310,itemWidth:h=200,columns:c=2,gap:d=5,buffer:m=2,renderItem:u,onItemClick:p,onScroll:g,height:f="100%",className:v="",style:I={},preloadCount:b=24,scrollDamping:w=.09},x)=>{const C=i(null),H=i(null),E=i(new Map),M=i(new Map),[P,_]=s(new Map),y=n(()=>{if(!C.current||0===e.length)return;H.current&&(H.current.destroy(),M.current.forEach(t=>{try{t.unmount()}catch(t){}}),M.current.clear(),E.current.clear());const t={itemHeight:l,itemWidth:h,columns:c,gap:d,buffer:m,preloadCount:b,scrollDamping:w,onScroll:(t,e,i)=>{g?.({scrollTop:t,firstVisibleIndex:e,lastVisibleIndex:i})},onItemClick:(t,e,i)=>{p?.(t,e,i)}};u&&(t.onRenderItem=(t,e)=>{const i=document.createElement("div");return i.style.width="100%",i.style.height="100%",i.dataset.index=t,E.current.set(t,i),_(s=>new Map(s).set(t,{index:t,itemData:e,wrapper:i})),i}),H.current=new VirtualList(C.current,e,t)},[e,l,h,c,d,m,b,w,u,g,p]);r(()=>{u&&P.forEach(({index:t,itemData:e,wrapper:i})=>{let s=M.current.get(t);if(s)s.render(u(t,e));else{const s=a.createRoot(i);M.current.set(t,s),s.render(u(t,e))}})},[P,u]),r(()=>{H.current?(H.current.updateItems(e),_(t=>{const i=new Map;return t.forEach((t,s)=>{s<e.length&&i.set(s,t)}),i})):y()},[e,y]),r(()=>{y()},[l,h,c,d,m]),r(()=>()=>{H.current&&H.current.destroy(),M.current.forEach(t=>{try{t.unmount()}catch(t){}}),M.current.clear()},[]),o(x,()=>({scrollToIndex:(t,e)=>H.current?.scrollToIndex(t,e),scrollToBottom:t=>H.current?.scrollToBottom(t),scrollToTop:t=>H.current?.scrollToTop(t),scrollTo:(t,e)=>H.current?.scrollTo(t,e),getFirstVisibleIndex:()=>H.current?.getFirstVisibleIndex(),getLastVisibleIndex:()=>H.current?.getLastVisibleIndex(),updateItems:t=>H.current?.updateItems(t),destroy:()=>H.current?.destroy()}));const A={height:"number"==typeof f?`${f}px`:f,width:"100%",overflow:"auto",...I};return t.createElement("div",{ref:C,className:`virtual-list-container ${v}`,style:A})});H.displayName="VirtualList";export{H as VirtualListReact,H as default};
|
|
2
|
+
//# sourceMappingURL=virtual-list.react.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-list.react.esm.js","sources":["../index.js","../src/react.js"],"names":["CONFIG","PLACEHOLDER_GIF","DEFAULT_EASING","t","Math","pow","ERROR_PLACEHOLDER_SVG","encodeURIComponent","VirtualList","useIntersectionObserver","constructor","container","items","options","this","itemHeight","itemWidth","buffer","undefined","isHighPerformanceDevice","columns","gap","preloadCount","maxPoolSize","scrollDamping","onRenderItem","onScroll","onItemClick","visibleCount","ceil","clientHeight","_rowHeight","_itemsPerRow","_itemWidthWithGap","elementPool","activeElements","ticking","preloadedSet","Set","updateFrameId","itemPositionCache","Map","preloadDistance","resizeHandler","handleResize","bind","clickHandler","handleItemClick","scrollFallbackHandler","init","containerHeight","style","cssText","contentContainer","document","createElement","getTotalHeight","appendChild","initObserver","preloadInitialImages","initLenis","update","bindEvents","lenis","Lenis","wrapper","content","lerp","orientation","smoothWheel","infinite","autoResize","autoRaf","touchMultiplier","wheelMultiplier","normalizeWheel","touchInertia","prevent","on","requestUpdate","raf","time","__rafID","requestAnimationFrame","length","window","addEventListener","passive","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","element","target","index","parseInt","dataset","loadImage","unobserve","root","rootMargin","threshold","preloadNum","min","i","preloadImage","cleanupPreloadedSet","size","scrollTop","scroll","firstVisibleRow","floor","minVisibleIndex","max","maxVisibleIndex","keepRange","minKeepIndex","maxKeepIndex","delete","has","itemData","tempImg","Image","onload","add","src","loadVersion","_loadVersion","img","onerror","loadSingleImage","url","createOrUpdateItem","itemElement","pop","createItemElement","updateItemPosition","updateItemData","objectFit","position","width","height","margin","willChange","backfaceVisibility","calculateItemPosition","get","row","col","top","left","set","transformValue","transform","observe","recycleItem","remove","tagName","push","rowHeight","itemsPerRow","firstVisibleIndex","lastVisibleIndex","preloadBuffer","preloadStartIndex","preloadEndIndex","itemsToShow","indicesToRecycle","activeLen","scrollToIndex","targetIndex","offsetTop","immediate","duration","easing","scrollTo","offset","scrollToBottom","maxScrollTop","getFirstVisibleIndex","getLastVisibleIndex","event","parentElement","isNaN","clear","scrollToTop","updateItems","newItems","destroy","cancelAnimationFrame","removeEventListener","disconnect","innerHTML","logicalCores","navigator","hardwareConcurrency","dpr","devicePixelRatio","module","exports","VirtualListReact","forwardRef","renderItem","className","ref","containerRef","useRef","virtualListRef","itemElementsRef","reactRootsRef","mountedItems","setMountedItems","useState","initVirtualList","useCallback","current","unmount","e","prev","VirtualListCore","useEffect","render","newRoot","ReactDOMClient","createRoot","newMap","value","key","useImperativeHandle","containerStyle","overflow","React","displayName"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("lenis")):"function"==typeof define&&define.amd?define(["exports","lenis"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).VirtualList={},t.Lenis)}(this,function(t,e){"use strict";const i=310,s=200,n=2,o=1,r=2,h=5,a=24,l=50,c=.09,d=800,m=2,u=500,f="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",g=t=>1-Math.pow(1-t,3),p=encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="200" height="300" viewBox="0 0 200 300"><rect width="200" height="300" fill="#f0f0f0"/><text x="100" y="150" font-size="16" text-anchor="middle" fill="#999">加载失败</text></svg>');class v{#t=!0;constructor(t,e,m={}){this.container=t,this.items=e,this.itemHeight=m.itemHeight||i,this.itemWidth=m.itemWidth||s,this.buffer=void 0!==m.buffer?m.buffer:this.isHighPerformanceDevice()?o:n,this.columns=m.columns||r,this.gap=m.gap||h,this.preloadCount=m.preloadCount||a,this.maxPoolSize=m.maxPoolSize||l,this.scrollDamping=void 0!==m.scrollDamping?m.scrollDamping:c,this.onRenderItem=m.onRenderItem,this.onScroll=m.onScroll,this.onItemClick=m.onItemClick,this.visibleCount=Math.ceil(t.clientHeight/this.itemHeight*this.columns)+2*this.buffer*this.columns,this._rowHeight=this.itemHeight,this._itemsPerRow=this.columns,this._itemWidthWithGap=this.itemWidth+this.gap,this.elementPool=[],this.activeElements=[],this.ticking=!1,this.preloadedSet=new Set,this.updateFrameId=null,this.itemPositionCache=new Map,this.preloadDistance=void 0!==m.preloadDistance?m.preloadDistance:d,this.resizeHandler=this.handleResize.bind(this),this.clickHandler=this.handleItemClick.bind(this),this.scrollFallbackHandler=null,this.init()}init(){const t=this.container.clientHeight||500;this.container.style.cssText=`position: relative; overflow-y: auto; overflow-x: hidden; height: ${t}px`,this.contentContainer=document.createElement("div"),this.contentContainer.style.cssText=`position: relative; height: ${this.getTotalHeight()}px`,this.container.appendChild(this.contentContainer),this.initObserver(),this.preloadInitialImages(),this.initLenis(),this.update(),this.bindEvents()}initLenis(){this.lenis=new e({wrapper:this.container,content:this.contentContainer,lerp:this.scrollDamping,orientation:"vertical",smoothWheel:!0,infinite:!1,autoResize:!0,autoRaf:!1,touchMultiplier:1,wheelMultiplier:1,normalizeWheel:!1,touchInertia:!1,prevent:()=>!1}),this.lenis.on("scroll",()=>{this.requestUpdate()}),this.raf()}raf(t){this.lenis.raf(t),this.__rafID=requestAnimationFrame(this.raf.bind(this))}getTotalHeight(){return Math.ceil(this.items.length/this.columns)*this.itemHeight}initObserver(){if(!("IntersectionObserver"in window))return this.#t=!1,this.scrollFallbackHandler=this.requestUpdate.bind(this),void this.container.addEventListener("scroll",this.scrollFallbackHandler,{passive:!0});this.#t=!0,this.observer=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){const e=t.target,i=parseInt(e.dataset.index);i<this.items.length&&this.loadImage(e,i),this.observer.unobserve(e)}})},{root:this.container,rootMargin:`${this.preloadDistance}px`,threshold:.01})}preloadInitialImages(){const t=Math.min(this.preloadCount,this.items.length);for(let e=0;e<t;e++)this.preloadImage(e)}cleanupPreloadedSet(){if(this.preloadedSet.size>u){const t=this.lenis?.scroll||0,e=Math.floor(t/this.itemHeight),i=Math.max(0,(e-this.buffer)*this.columns),s=i+this.visibleCount,n=m*this.buffer*this.columns,o=Math.max(0,i-n),r=s+n;this.preloadedSet.forEach(t=>{(t<o||t>r)&&this.preloadedSet.delete(t)})}}preloadImage(t){if(this.preloadedSet.has(t))return;const e=this.items[t];if(e){const i=new Image;i.onload=()=>this.preloadedSet.add(t),i.src=e}}loadImage(t,e){const i=this.items[e];if(!i)return;t.src=f;const s=t._loadVersion=(t._loadVersion||0)+1,n=new Image;n.onload=()=>{t._loadVersion===s&&(t.src=i,this.preloadedSet.add(e))},n.onerror=()=>{t._loadVersion===s&&(t.src=`data:image/svg+xml;utf8,${p}`)},n.src=i}loadSingleImage(t,e){const i=new Image;i.onload=()=>{t.src=e},i.onerror=()=>{t.src=`data:image/svg+xml;utf8,${p}`},i.src=e}createOrUpdateItem(t){const e=this.items[t];if(!e)return null;let i=this.activeElements[t];return i||(i=this.elementPool.pop()||this.createItemElement(t,e),this.updateItemPosition(i,t),this.contentContainer.appendChild(i),this.activeElements[t]=i,this.updateItemData(i,t,e)),i}createItemElement(t,e){let i;this.onRenderItem&&"function"==typeof this.onRenderItem?i=this.onRenderItem(t,e):(i=document.createElement("img"),i.style.objectFit="cover");const s=i.style;return s.position="absolute",s.width=`${this.itemWidth}px`,s.height=this.itemHeight-this.gap+"px",s.margin="0",s.willChange="transform",s.backfaceVisibility="hidden",this.onItemClick&&i.addEventListener("click",this.clickHandler),i}calculateItemPosition(t){if(this.itemPositionCache.has(t))return this.itemPositionCache.get(t);const e=Math.floor(t/this._itemsPerRow),i=t%this._itemsPerRow,s={top:e*this._rowHeight,left:i*this._itemWidthWithGap};return this.itemPositionCache.set(t,s),s}updateItemPosition(t,e){const{top:i,left:s}=this.calculateItemPosition(e),n=`translate3d(${s}px, ${i}px, 0)`;t.style.transform!==n&&(t.style.transform=n)}updateItemData(t,e,i){t.dataset.index=e,t.dataset.src=i,e<this.preloadCount||this.preloadedSet.has(e)?t.src=i:this.#t&&this.observer?(t.src=f,this.observer.observe(t)):t.src=i}recycleItem(t){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove(),this.activeElements[t]=null,this.elementPool.length<this.maxPoolSize&&("IMG"===e.tagName&&(e.src=""),this.elementPool.push(e)))}update(){const t=this.lenis?.scroll||0,e=this._rowHeight,i=this._itemsPerRow,s=Math.floor(t/e),n=Math.max(0,(s-this.buffer)*i),o=Math.min(n+this.visibleCount,this.items.length),r=this.buffer*m,h=Math.max(0,n-r*i),a=Math.min(o+r*i,this.items.length);for(let t=h;t<a;t++)this.preloadImage(t);this.cleanupPreloadedSet();const l=new Set;for(let t=n;t<o;t++)t<this.items.length&&(l.add(t),this.createOrUpdateItem(t));const c=[],d=this.activeElements.length;for(let t=0;t<d;t++){this.activeElements[t]&&!l.has(t)&&(t<n-this.buffer*i||t>o+this.buffer*i)&&c.push(t)}c.forEach(t=>this.recycleItem(t)),this.onScroll?.(t,n,o),this.updateFrameId=null}scrollToIndex(t,e={}){const i=Math.max(0,Math.min(t,this.items.length-1)),s=Math.floor(i/this.columns)*this.itemHeight,{immediate:n=!1,duration:o=1.2,easing:r=g}=e;this.lenis?.scrollTo(s,{offset:0,immediate:n,duration:o,easing:r})}scrollToBottom(t={}){const e=this.getTotalHeight()-this.container.clientHeight,{immediate:i=!1,duration:s=1.2,easing:n=g}=t;this.lenis?.scrollTo(e,{offset:0,immediate:i,duration:s,easing:n})}scrollTo(t,e={}){const{immediate:i=!1,duration:s=1.2,easing:n=g}=e;this.lenis?.scrollTo(t,{offset:0,immediate:i,duration:s,easing:n})}getFirstVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight);return Math.max(0,(e-this.buffer)*this._itemsPerRow)}getLastVisibleIndex(){const t=this.lenis?.scroll||0,e=Math.floor(t/this._rowHeight),i=Math.max(0,(e-this.buffer)*this._itemsPerRow);return Math.min(i+this.visibleCount,this.items.length-1)}handleItemClick(t){let e=t.target;for(;e&&e!==this.contentContainer&&(!e.dataset||void 0===e.dataset.index);)e=e.parentElement;if(!e||e===this.contentContainer)return;const i=parseInt(e.dataset.index);isNaN(i)||this.onItemClick?.(i,this.items[i],e)}requestUpdate(){this.updateFrameId||(this.updateFrameId=requestAnimationFrame(()=>this.update()))}handleResize(){this.ticking||(requestAnimationFrame(()=>{this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.visibleCount=Math.ceil(this.container.clientHeight/this._rowHeight*this._itemsPerRow)+2*this.buffer*this._itemsPerRow,this.itemPositionCache.clear(),this.update(),this.ticking=!1}),this.ticking=!0)}bindEvents(){window.addEventListener("resize",this.resizeHandler)}scrollToTop(t={}){const{duration:e=1.2,easing:i=g,immediate:s=!1}=t;this.lenis?.scrollTo(0,{offset:0,immediate:s,duration:e,easing:i})}updateItems(t){this.items=t;const e=this.activeElements.length;for(let t=0;t<e;t++){const e=this.activeElements[t];e&&(this.#t&&this.observer&&this.observer.unobserve(e),e._loadVersion=(e._loadVersion||0)+1,e.remove())}this.activeElements=[],this.elementPool=[],this.preloadedSet.clear(),this.itemPositionCache.clear(),this.contentContainer.style.height=`${this.getTotalHeight()}px`,this.preloadInitialImages(),this.update()}destroy(){this.__rafID&&cancelAnimationFrame(this.__rafID),this.updateFrameId&&cancelAnimationFrame(this.updateFrameId),this.lenis&&this.lenis.destroy(),window.removeEventListener("resize",this.resizeHandler),this.scrollFallbackHandler&&this.container&&(this.container.removeEventListener("scroll",this.scrollFallbackHandler),this.scrollFallbackHandler=null);const t=this.activeElements.length;for(let e=0;e<t;e++){const t=this.activeElements[e];t&&(t.removeEventListener("click",this.clickHandler),t._loadVersion=(t._loadVersion||0)+1)}this.#t&&this.observer&&(this.observer.disconnect(),this.observer=null),this.container.innerHTML="",this.elementPool=[],this.activeElements=[],this.preloadedSet.clear(),this.ticking=!1,this.itemPositionCache.clear(),this.container=null,this.contentContainer=null}isHighPerformanceDevice(){const t=navigator.hardwareConcurrency||4,e=window.devicePixelRatio||1;return t>4&&e<=1.5}}"undefined"!=typeof module&&module.exports?module.exports=v:"undefined"!=typeof window&&(window.VirtualList=v),t.VirtualList=v,t.default=v,Object.defineProperty(t,"__esModule",{value:!0})});
|
|
2
|
+
//# sourceMappingURL=virtual-list.umd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-list.umd.js","sources":["../index.js"],"names":["CONFIG","PLACEHOLDER_GIF","DEFAULT_EASING","t","Math","pow","ERROR_PLACEHOLDER_SVG","encodeURIComponent","VirtualList","useIntersectionObserver","constructor","container","items","options","this","itemHeight","itemWidth","buffer","undefined","isHighPerformanceDevice","columns","gap","preloadCount","maxPoolSize","scrollDamping","onRenderItem","onScroll","onItemClick","visibleCount","ceil","clientHeight","_rowHeight","_itemsPerRow","_itemWidthWithGap","elementPool","activeElements","ticking","preloadedSet","Set","updateFrameId","itemPositionCache","Map","preloadDistance","resizeHandler","handleResize","bind","clickHandler","handleItemClick","scrollFallbackHandler","init","containerHeight","style","cssText","contentContainer","document","createElement","getTotalHeight","appendChild","initObserver","preloadInitialImages","initLenis","update","bindEvents","lenis","Lenis","wrapper","content","lerp","orientation","smoothWheel","infinite","autoResize","autoRaf","touchMultiplier","wheelMultiplier","normalizeWheel","touchInertia","prevent","on","requestUpdate","raf","time","__rafID","requestAnimationFrame","length","window","addEventListener","passive","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","element","target","index","parseInt","dataset","loadImage","unobserve","root","rootMargin","threshold","preloadNum","min","i","preloadImage","cleanupPreloadedSet","size","scrollTop","scroll","firstVisibleRow","floor","minVisibleIndex","max","maxVisibleIndex","keepRange","minKeepIndex","maxKeepIndex","delete","has","itemData","tempImg","Image","onload","add","src","loadVersion","_loadVersion","img","onerror","loadSingleImage","url","createOrUpdateItem","itemElement","pop","createItemElement","updateItemPosition","updateItemData","objectFit","position","width","height","margin","willChange","backfaceVisibility","calculateItemPosition","get","row","col","top","left","set","transformValue","transform","observe","recycleItem","remove","tagName","push","rowHeight","itemsPerRow","firstVisibleIndex","lastVisibleIndex","preloadBuffer","preloadStartIndex","preloadEndIndex","itemsToShow","indicesToRecycle","activeLen","scrollToIndex","targetIndex","offsetTop","immediate","duration","easing","scrollTo","offset","scrollToBottom","maxScrollTop","getFirstVisibleIndex","getLastVisibleIndex","event","parentElement","isNaN","clear","scrollToTop","updateItems","newItems","destroy","cancelAnimationFrame","removeEventListener","disconnect","innerHTML","logicalCores","navigator","hardwareConcurrency","dpr","devicePixelRatio","module","exports"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ref as e,watch as t,onMounted as l,onBeforeUnmount as u,h as i,nextTick as o}from"vue";import a from"../index.js";const r={name:"VirtualList",props:{items:{type:Array,required:!0},itemHeight:{type:Number,default:310},itemWidth:{type:Number,default:200},columns:{type:Number,default:2},gap:{type:Number,default:5},buffer:{type:Number,default:2},renderItem:{type:Function,default:null},onItemClick:{type:Function,default:null},onScroll:{type:Function,default:null},height:{type:[String,Number],default:"100%"},className:{type:String,default:""},style:{type:Object,default:()=>({})},preloadCount:{type:Number,default:24},scrollDamping:{type:Number,default:.09}},emits:["itemClick","scroll","update"],setup(r,{emit:s,expose:n,slots:m}){const d=e(null),p=e(null),c=e(new Map),initVirtualList=()=>{if(!d.value||0===r.items.length)return;p.value&&p.value.destroy();const e={itemHeight:r.itemHeight,itemWidth:r.itemWidth,columns:r.columns,gap:r.gap,buffer:r.buffer,preloadCount:r.preloadCount,scrollDamping:r.scrollDamping,onScroll:(e,t,l)=>{s("scroll",{scrollTop:e,firstVisibleIndex:t,lastVisibleIndex:l}),r.onScroll?.(e,t,l)},onItemClick:(e,t,l)=>{s("itemClick",{index:e,itemData:t,element:l}),r.onItemClick?.(e,t,l)}};r.renderItem&&(e.onRenderItem=(e,t)=>{const l=document.createElement("div");return l.style.width="100%",l.style.height="100%",c.value.set(e,l),o(()=>{const u=r.renderItem(e,t);u instanceof HTMLElement&&l.appendChild(u)}),l}),p.value=new a(d.value,r.items,e),s("update",p.value)};return t(()=>r.items,e=>{p.value?p.value.updateItems(e):initVirtualList()},{deep:!0}),t(()=>[r.itemHeight,r.itemWidth,r.columns,r.gap,r.buffer],()=>{initVirtualList()}),l(()=>{initVirtualList()}),u(()=>{p.value&&(p.value.destroy(),p.value=null),c.value.clear()}),n({scrollToIndex:(e,t)=>p.value?.scrollToIndex(e,t),scrollToBottom:e=>p.value?.scrollToBottom(e),scrollToTop:e=>p.value?.scrollToTop(e),scrollTo:(e,t)=>p.value?.scrollTo(e,t),getFirstVisibleIndex:()=>p.value?.getFirstVisibleIndex(),getLastVisibleIndex:()=>p.value?.getLastVisibleIndex(),updateItems:e=>p.value?.updateItems(e),destroy:()=>p.value?.destroy()}),()=>i("div",{ref:d,class:["virtual-list-container",r.className],style:{height:"number"==typeof r.height?`${r.height}px`:r.height,width:"100%",overflow:"auto",...r.style}})}};export{r as VirtualListVue,r as default};
|
|
2
|
+
//# sourceMappingURL=virtual-list.vue.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"virtual-list.vue.esm.js","sources":["../src/vue.js"],"names":["VirtualListVue","name","props","items","type","Array","required","itemHeight","Number","default","itemWidth","columns","gap","buffer","renderItem","Function","onItemClick","onScroll","height","String","className","style","Object","preloadCount","scrollDamping","emits","setup","emit","expose","slots","containerRef","ref","virtualListRef","itemElements","Map","initVirtualList","value","length","destroy","options","scrollTop","firstVisibleIndex","lastVisibleIndex","index","itemData","element","onRenderItem","wrapper","document","createElement","width","set","nextTick","result","HTMLElement","appendChild","VirtualListCore","watch","newItems","updateItems","deep","onMounted","onBeforeUnmount","clear","scrollToIndex","scrollToBottom","scrollToTop","scrollTo","getFirstVisibleIndex","getLastVisibleIndex","h","class","overflow"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "virtual-list-common",
|
|
3
|
+
"version": "0.0.6",
|
|
4
|
+
"description": "vue3,react 通用虚拟列表,用于高效渲染大量数据的列表,仅渲染可见区域的元素并复用 DOM。",
|
|
5
|
+
"main": "dist/virtual-list.umd.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "rollup -c",
|
|
10
|
+
"prepublishOnly": "pnpm run build",
|
|
11
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
12
|
+
},
|
|
13
|
+
"module": "dist/virtual-list.esm.js",
|
|
14
|
+
"unpkg": "dist/virtual-list.umd.js",
|
|
15
|
+
"jsdelivr": "dist/virtual-list.umd.js",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"import": "./dist/virtual-list.esm.js",
|
|
19
|
+
"require": "./dist/virtual-list.umd.js"
|
|
20
|
+
},
|
|
21
|
+
"./vue": {
|
|
22
|
+
"import": "./dist/virtual-list.vue.esm.js",
|
|
23
|
+
"require": "./dist/virtual-list.vue.esm.js"
|
|
24
|
+
},
|
|
25
|
+
"./react": {
|
|
26
|
+
"import": "./dist/virtual-list.react.esm.js",
|
|
27
|
+
"require": "./dist/virtual-list.react.esm.js"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"keywords": ["virtual-list", "vue", "react", "efficient", "large-data", "rendering", "visible-area", "dom-reuse", "component"],
|
|
31
|
+
"author": "yuan",
|
|
32
|
+
"license": "ISC",
|
|
33
|
+
"packageManager": "pnpm@10.15.1",
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"lenis": "^1.3.16"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"vue": ">=3.0.0",
|
|
39
|
+
"react": ">=16.8.0",
|
|
40
|
+
"react-dom": ">=16.8.0"
|
|
41
|
+
},
|
|
42
|
+
"peerDependenciesMeta": {
|
|
43
|
+
"vue": {
|
|
44
|
+
"optional": true
|
|
45
|
+
},
|
|
46
|
+
"react": {
|
|
47
|
+
"optional": true
|
|
48
|
+
},
|
|
49
|
+
"react-dom": {
|
|
50
|
+
"optional": true
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"files": [
|
|
54
|
+
"dist",
|
|
55
|
+
"README.md",
|
|
56
|
+
"CHANGELOG.md"
|
|
57
|
+
],
|
|
58
|
+
"devDependencies": {
|
|
59
|
+
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
60
|
+
"@rollup/plugin-terser": "^1.0.0",
|
|
61
|
+
"rollup": "^4.59.0"
|
|
62
|
+
}
|
|
63
|
+
}
|