后端与接口
在微信小程序 Skyline 中需要程序化控制…
适用于微信小程序 Skyline 下通过程序化 API 控制 scroll-view 刷新/二级、滚动位置、DraggableSheet 位置,以及 UI 线程 worklet 滚动。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在微信小程序 Skyline 中需要程序特定
解决思路
- 识别并选择 API 族群:ScrollViewContext 用 NodesRef.node() + enhanced 属性获取,运行在逻辑线程,最低基础库 2.14.4;DraggableSheetContext 用 NodesRef.node() 获取,运行在逻辑线程,最低基础库 3.2.0;worklet.scrollViewContext 用 NodesRef.ref() + SharedValue 获取,运行在 UI 线程,最低基础库 3.3.0。
- 获取 ScrollViewContext:调用 `wx.createSelectorQuery().select('#scrollview').node().exec(res => { const ctx = res[0].node })`。
- 获取 DraggableSheetContext:调用 `wx.createSelectorQuery().select('.sheet').node().exec(res => { const ctx = res[0].node })`。
- 获取 worklet.scrollViewContext:先 `this.scrollRef = wx.worklet.shared()`,再 `this.createSelectorQuery().select('.scrollable').ref(res => { this.scrollRef.value = res.ref }).exec()`。
- 必须:scroll-view 必须开启 `enhanced` 属性才能获取 ScrollViewContext;正确写法 `<scroll-view type="list" scroll-y enhanced>`;未开启 `enhanced` 时 `node()` 返回的不是 ScrollViewContext。
- 必须:DraggableSheetContext.scrollTo 中 size 和 pixels 同时传入时仅 size 生效;应二选一,如 `sheetContext.scrollTo({ size: 0.7 })` 表示相对位置,或 `sheetContext.scrollTo({ pixels: 200 })` 表示绝对位置。
- 必须:worklet.scrollViewContext 必须通过 `NodesRef.ref` 获取引用并存入 SharedValue;使用 `this.scrollRef = wx.worklet.shared()` 和 `.ref(res => { this.scrollRef.value = res.ref }).exec()`,不要使用 `node()`。
- 必须:调用 `worklet.scrollViewContext.scrollTo` 的函数必须声明 `'worklet'` 指令,例如 `onTap() { 'worklet'; scrollViewContext.scrollTo(this.scrollRef.value, { top: 200 }) }`。
- 禁止:不要在逻辑线程中调用 `worklet.scrollViewContext.scrollTo`;该 API 仅在 UI 线程(worklet 函数内)可用。
- 禁止:不要在小程序插件中使用 `worklet.scrollViewContext.scrollTo`;该 API 不支持小程序插件。
- ScrollViewContext 方法:`scrollTo({ top, left, velocity, duration, animated })` 滚动至指定位置(最低 2.14.4);`scrollIntoView(selector, options?)` 滚动至指定元素(最低 2.14.4);`triggerRefresh({ duration?, easingFunction? })` 触发下拉刷新(最低 3.0.0);`closeRefresh()` 关闭下拉刷新(最低 3.0.0);`triggerTwoLevel({ duration?, easingFunction? })` 触发下拉二级(最低 3.0.0);`closeTwoLevel({ duration?, easingFunction? })` 关闭下拉二级(最低 3.0.0)。
- ScrollViewContext 属性:`scrollEnabled`(布尔值)滚动开关;`bounces`(布尔值)边界弹性(仅 iOS);`showScrollbar`(布尔值)显示滚动条;`pagingEnabled`(布尔值)分页滑动;`fastDeceleration`(布尔值)快速减速(仅 iOS);`decelerationDisabled`(布尔值)取消滚动惯性(仅 iOS)。
- 场景决策:程序化触发下拉刷新用 `ScrollViewContext.triggerRefresh()`;数据加载完成后关闭刷新用 `ScrollViewContext.closeRefresh()`;打开/关闭下拉二级用 `triggerTwoLevel()` / `closeTwoLevel()`;滚动到指定偏移量用 `ScrollViewContext.scrollTo({ top })`;滚动到指定元素用 `ScrollViewContext.scrollIntoView(selector)`;控制 DraggableSheet 位置用 `DraggableSheetContext.scrollTo({ size })`;UI 线程中控制滚动(配合手势)用 `worklet.scrollViewContext.scrollTo()`。
- 程序化刷新最小示例:`wx.createSelectorQuery().select('#sv').node().exec(res => { const ctx = res[0].node; ctx.triggerRefresh({ duration: 300 }); setTimeout(() => ctx.closeRefresh(), 2000) })`。
- 文档索引:查看 ScrollViewContext 全部方法和属性查 `references/api/scroll-view-context.md`;了解 DraggableSheetContext.scrollTo 参数查 `references/api/draggable-sheet-context.md`;在 worklet 中控制滚动查 `references/api/worklet-scroll-context.md`;查看完整代码模式(刷新、二级、Sheet 控制)查 `references/patterns.md`。
- 相关技能:scroll-view 组件属性和事件结合 `skyline-components`;Worklet 动画系统结合 `skyline-worklet`;页面转场路由结合 `skyline-route`;Skyline 概览与迁移结合 `skyline-overview`。
- References 目录结构:`references/api/draggable-sheet-context.md`、`references/api/scroll-view-context.md`、`references/api/worklet-scroll-context.md`、`references/patterns.md`。
适用边界 · 注意事项
- 在逻辑线程中不要调用 `worklet.scrollViewContext.scrollTo`,它仅在 UI 线程/worklet 函数内可用。
- 在小程序插件中不要使用 `worklet.scrollViewContext.scrollTo`,该 API 不支持小程序插件。
- 如果 scroll-view 未开启 `enhanced` 属性,不要期望通过 `node()` 获取到 ScrollViewContext。