飞书协作文档式大纲联动需 scroll-view + scroll-into-view + 节流 scrolltop 计算配合实现;需确保 id 严格匹配、目标为直系子节点、异步渲染用 $nexttick,滚动高亮须节流+缓存 offsettop,平台差异需适配 ios/harmonyos 事件与回调时机。

飞书协作文档那种「左侧大纲+右侧滚动内容联动」的交互,在 uni-app 里不是靠某个组件自动实现的,而是靠 scroll-view + scroll-into-view + 节流后的 scrollTop 计算三者配合。直接用 v-for 渲染菜单再绑定点击跳转,90% 的项目会卡顿或联动失准,尤其在 iOS 和鸿蒙上。
scroll-into-view 总是跳不到目标位置?检查这三点
点击左侧菜单项,右侧内容没滚到对应区块顶部,大概率是以下问题:
-
scroll-into-view的值(如"section-3")必须和右侧scroll-view内部某子元素的id完全一致——全小写、无空格、无特殊字符,section3和Section-3都不行 - 目标元素必须是
scroll-view的直系子节点,或至少能被其 DOM 树遍历到;如果用了v-if或异步渲染,得用this.$nextTick(() => this.$refs.scrollView.scrollIntoView(...)) - H5 端可用
document.querySelector('#section-2')验证是否存在;小程序端必须用uni.createSelectorQuery().select('#section-2').boundingClientRect()确认它已挂载且有尺寸
滚动右侧时左侧菜单不自动高亮?别用 scroll 实时判断
在 @scroll 里反复调用 getBoundingClientRect() 判断哪个区块贴顶,低端安卓机立刻掉帧。正确做法是节流后只在滚动“趋于静止”时比对:
飞书任务管理工具,支持任务的创建、查询、更新、删除及清单的管理。适用场景:创建/管理任务与清单、查看任务列表或清单中的任务、用户提及任务、待办、to‑do、清单、task时、设置负责人和关注等。
- 用
setTimeout+clearTimeout做简单节流(延迟 100ms),避免高频触发 - 预存所有区块的
offsetTop(在mounted或数据就绪后一次性计算并缓存),比实时查 DOM 快 3 倍以上 - 比对逻辑:取当前
scrollTop,遍历缓存数组,找最后一个offsetTop ≤ scrollTop + threshold的索引(threshold设为 40rpx 防抖)
鸿蒙和 iOS 上联动跳变/延迟?加平台适配层
微信小程序和鸿蒙 NEXT 对 scroll-view 的 scrollTop 回调时机处理不同,iOS 尤其明显:
- iOS 端不要依赖
@scroll的实时scrollTop,改用@scrolltoupper/@scrolltolower做粗粒度锚点校正 - 鸿蒙下
touchmove事件对象缺少touches[0].clientY,必须改用event.changedTouches[0].clientY - 所有侧边栏容器必须设
height: 100vh(不能靠 flex 布局撑高),否则scrolltolower永不触发
最易被忽略的是:右侧每个内容区块的 id 必须在 scroll-view 渲染完成后再生成——如果区块由 v-for 动态生成,且内部含异步图片或组件,offsetTop 缓存就得等 $nextTick + setTimeout(..., 16) 才可靠。没做这一步,联动永远差一截。









