用插槽实现无限滚动列表Footer加载提示,核心是通过具名作用域插槽解耦UI逻辑:组件暴露loading、error、reachedEnd状态,父组件按需渲染加载中、失败重试、到底提示,并配合IntersectionObserver监听、合理状态更新及可访问性优化。

用插槽(slot)实现无限滚动列表的 Footer 加载提示,核心是把加载状态、错误重试、到底提示等 UI 逻辑从列表组件内部解耦出来,交由使用者自定义渲染——既保持灵活性,又不破坏滚动逻辑。
1. 列表组件预留 footer 插槽
在封装的 组件中,用具名插槽 footer 承载加载状态区域:
组件模板中写:
这样父组件就能通过作用域插槽接收 loading、error、reached-end 等状态,并决定怎么展示。
2. 父组件按状态定制 Footer UI
在使用处,用 v-slot:footer 接收状态并条件渲染:
- 加载中:显示「正在加载…」或骨架动画
-
加载失败:显示「加载失败」+ 「重试按钮」,点击触发
retryLoad() - 已到底部:显示「没有更多了」,可加轻微文字淡出效果提升体验
示例片段:
3. 滚动监听与状态联动要轻量可靠
Footer 的显隐和行为依赖准确的状态更新,建议:
- 滚动触底检测用
IntersectionObserver替代scroll事件,性能更好、兼容性够用(Vue 3 默认支持) -
isLoading仅在请求发起时置为true,响应后立刻更新为false,避免重复触发 -
isEnd由接口返回的hasMore: false或数据长度未增长来判定,不要只靠页码
4. 可访问性与用户体验细节
Footer 不只是视觉元素,还要对屏幕阅读器友好:
- 加载中时给容器加
aria-busy="true"和aria-live="polite" - 重试按钮加
aria-label="重新加载更多内容" - “没有更多了”出现时,可自动将焦点移到该文本(用
ref+el.focus()),方便键盘用户感知终点
这些细节不增加复杂度,但能让交互更健壮、更包容。









