watchEffect 用于响应公告数据变化并智能控制滚动启停,监听 notices 长度或末项触发重置/启动,配合 onInvalidate 清理定时器、nextTick 确保 DOM 就绪后计算滚动条件,并依据 isAutoScrollEnabled 和 visibilityState 动态启用禁用,支持用户交互状态判断避免强制滚动。

用 watchEffect 实现公告栏滚动播放的自动控制,核心不是直接驱动滚动动画,而是**响应数据变化、协调滚动状态与时机**。它更适合做“智能开关”和“条件触发”,而非替代 requestAnimationFrame 或 CSS 动画本身。
监听公告列表变化,自动启停滚动逻辑
当公告内容数组(如 notices)更新时,watchEffect 能自动感知并重置滚动位置或重启定时器,避免旧数据残留导致错位:
- 只读取
notices.length或notices.at(-1)即可建立响应式依赖,无需整个数组 - 在副作用中调用
resetScroll()或startScroll(),确保新公告进来后从头开始滚动 - 配合
onInvalidate清理上一轮定时器,防止内存泄漏或重复执行
结合 nextTick 确保 DOM 就绪后再滚动定位
公告内容渲染完成前就执行滚动,会导致位置计算错误。watchEffect 配合 nextTick 是可靠方案:
Vue 3 组合式 API 与 最佳实践,涵盖代码组织、useXxx 模式、组合式函数设计、Store 集成、响应式优化及功能抽取。
-
await nextTick()等待组件更新、真实 DOM 插入完毕 - 再获取公告容器(如
containerRef.value)的scrollWidth和clientWidth - 据此判断是否需要启动横向滚动(例如:内容宽度 > 容器宽度才启用动画)
控制滚动行为的启用/禁用状态
用户可能手动暂停滚动、或页面失焦时暂停动画。用一个响应式开关(如 isAutoScrollEnabled)配合 watchEffect 实现策略化控制:
立即学习“前端免费学习笔记(深入)”;
- watchEffect 内部检查
isAutoScrollEnabled.value && notices.length > 0,双条件满足才激活滚动 - 当用户点击“暂停”按钮修改开关值,watchEffect 自动重运行,停止当前动画逻辑
- 也可监听
document.visibilityState,页面切到后台时自动设为 false
避免干扰用户操作的智能判断
类似聊天室“贴底才滚动”的逻辑,也可用于公告栏:若用户正在拖拽查看历史公告,不应强制归位:
- 在 watchEffect 中读取容器的
scrollLeft和scrollWidth - 计算是否处于“可视区域起始位置附近”,例如
container.scrollLeft - 仅在此类状态下才执行
container.scrollLeft = 0或启动循环动画

















