gitee代码仓库
https://gitee.com/chennaiyuan/dayup-record/tree/master/%E4%B8%80%E4%BA%9B%E7%BB%84%E4%BB%B6/auto-scroll-list
我们封装的 AutoScrollList
是一个自动滚动列表组件,主要用于展示需要自动循环滚动的数据项,如通知、告警、任务等信息。该组件采用了组件与逻辑分离的设计思路,通过自定义 Hook 实现核心滚动逻辑,提高了代码的可复用性和灵活性。除了依赖 Vue3 和 Less 这种常规组件,可以开封即用。
组件采用了"关注点分离"的设计理念,将 UI 表现与业务逻辑分开:
useAutoScroll
Hook 中import { ref, computed, onMounted, onBeforeUnmount } from 'vue';
export interface AutoScrollOptions {
items: any[]; // 数据项数组
itemHeight: number; // 单项高度
itemGap?: number; // 项目间距
visibleItems: number; // 可见项目数
scrollInterval?: number; // 滚动间隔(毫秒)
transitionDuration?: number; // 过渡动画时长(毫秒)
autoScroll?: boolean; // 是否自动滚动
}
export function useAutoScroll(options: AutoScrollOptions) {
const {
items,
itemHeight,
itemGap = 0,
visibleItems,
scrollInterval = 3000,
transitionDuration = 500,
autoScroll = true
} = options;
// 状态管理
const currentIndex = ref(0);
const isSliding = ref(false);
const timer = ref<number | null>(null);
// 计算属性
const displayItems = computed(() => {
const result = [];
const totalItems = items.length;
if (totalItems === 0) return [];
// 当前显示的项目
for (let i = 0; i < visibleItems + 1; i++) {
const index = (currentIndex.value + i) % totalItems;
result.push({
...items[index],
key: `${items[index].id}-${index}-${i}`, // 确保key的唯一性
preload: i === visibleItems // 标记预加载项
});
}
return result;
});
// 计算位置
const getItemPosition = (index: number) => {
return index * (itemHeight + itemGap);
};
// 控制方法
const startScroll = () => {
if (timer.value || items.length <= visibleItems) return;
timer.value = window.setInterval(() => {
isSliding.value = true;
setTimeout(() => {
currentIndex.value = (currentIndex.value + 1) % items.length;
isSliding.value = false;
}, transitionDuration);
}, scrollInterval);
};
const stopScroll = () => {
if (timer.value) {
clearInterval(timer.value);
timer.value = null;
}
};
// 生命周期钩子
onMounted(() => {
if (autoScroll && items.length > visibleItems) {
startScroll();
}
});
onBeforeUnmount(() => {
stopScroll();
});
return {
displayItems,
isSliding,
currentIndex,
getItemPosition,
startScroll,
stopScroll
};
}
以下是组件的三种典型使用场景:
{{ item.title }}
{{ item.content }}
{{ item.priority === 'high' ? '!' : '⚠' }}
{{ item.title }}
timeline
title AutoScrollList 组件演进路线
section 当前版本
1.0 : 基础垂直滚动功能
Hook与组件分离设计
插槽系统支持
section 短期迭代
1.1 : 水平滚动支持
性能优化
1.2 : 响应式增强
多种动画效果
section 中期规划
2.0 : 虚拟列表实现
多方向滚动
拖拽排序支持
section 长期目标
3.0 : 完整无障碍支持
高级自定义API
更多交互模式
AutoScrollList
组件通过组件与逻辑分离的设计,实现了一个灵活、可复用的自动滚动列表解决方案。它的核心价值在于:
以下是组件实现的关键技术点:
mindmap
root((AutoScrollList))
Hook设计
状态管理
currentIndex
isSliding
timer
生命周期集成
自动启动/停止
返回值设计
按需使用
滚动机制
定时器控制
缓动动画
预加载机制
组件设计
插槽系统
item插槽
empty插槽
Props设计
必要参数
可选配置
样式实现
绝对定位
CSS变换
过渡效果
虽然存在一些局限性,但对于通知、公告、提醒等信息轮播的场景,该组件提供了一个简洁而有效的解决方案。通过未来的迭代优化,可以进一步提升组件的适用范围和性能表现。