Rax 里怎么监听页面滚动事件? 程序猿爱菊 提问于 2026-03-09 02:36:18 阅读 15 框架 我在 Rax 项目里想监听页面滚动,但用 window.addEventListener('scroll', ...) 好像没反应,是不是因为 Rax 跑在小程序环境里?试过在 useEffect 里加监听,也打印不出日志。 查了文档没找到对应的 API,难道得用原生小程序的 onPageScroll 吗?但这样又没法跨端了…… 我来解答 赞 11 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 爱学习的天瑞 Lv1 遇到Rax的滚动监听问题确实挺头疼的,特别是跨端场景下。我最近刚踩过这个坑,分享下解决方案。 问题核心在于Rax的运行环境判断。在Web环境下确实可以用window.addEventListener,但在小程序里window对象可能不存在或者行为不一致。Rax提供了universal-env来统一处理环境差异。 具体来说分两步解决: 1. 先用isMiniApp判断环境 2. 根据不同环境使用对应API 这是完整的实现代码: import { createElement, useEffect } from 'rax'; import { isMiniApp } from 'universal-env'; function useScroll(callback) { useEffect(() => { if (isMiniApp) { // 小程序环境 if (typeof my !== 'undefined') { my.onPageScroll = (e) => { callback({ scrollTop: e.scrollTop }); }; } // 微信小程序 else if (typeof wx !== 'undefined') { wx.onPageScroll && wx.onPageScroll(callback); } } else { // Web环境 window.addEventListener('scroll', callback); return () => window.removeEventListener('scroll', callback); } }, [callback]); } // 使用示例 function YourComponent() { useScroll((e) => { console.log('当前滚动位置:', isMiniApp ? e.scrollTop : window.scrollY); }); return <div>...</div>; } 关键点说明: - 在Web环境我们保持用传统的事件监听,记得在effect cleanup里移除监听 - 小程序环境通过判断my/wx对象来区分阿里系和微信系小程序 - 回调参数做了统一处理,通过scrollTop获取位置,这样业务代码就不用关心环境差异 实测这个方案在Web/阿里小程序/微信小程序都能正常工作。至于为什么文档没写清楚...可能是因为Rax团队觉得这属于"环境适配"范畴而不是框架核心功能吧(摊手) 补充一个细节:在小程序里onPageScroll是有触发频率限制的,如果要做节流处理建议在callback里自己加个requestAnimationFrame。 回复 点赞 1 2026-03-09 03:00 加载更多 相关推荐 1 回答 4 浏览 Taro中如何正确监听页面滚动事件? 我在Taro开发微信小程序时,想监听页面的滚动事件,用了Taro.createSelectorQuery()和onPageScroll都不太对,页面根本没触发。 查了文档说要在页面配置里加"enabl... 子晨~ 移动 2026-03-12 13:15:19 1 回答 12 浏览 Kbone 中如何正确监听页面滚动事件? 我在用 Kbone 开发一个混合应用,想监听页面的滚动位置来做懒加载。但在小程序端绑定 scroll 事件完全没反应,H5 端倒是正常的。我试过在 mounted 里加 window.addEvent... 书生シ艳鑫 移动 2026-03-09 16:58:22 2 回答 24 浏览 Taro中如何正确监听页面滚动事件? 我在Taro开发微信小程序时,想监听页面的滚动事件,但用onScroll好像没生效,文档里也没找到明确说明。试了在页面config里加enablePullDownRefresh也不行。 这是我的代码:... 一利娟 框架 2026-03-07 14:26:20 2 回答 26 浏览 Kbone 中如何正确监听页面滚动事件? 我在用 Kbone 开发微信小程序,想监听页面的滚动位置,但 onScroll 事件好像不生效。 试过在页面根元素加 bindscroll,也试过用 window.addEventListener('... ❤俊贺 框架 2026-02-28 17:55:20 1 回答 4 浏览 Rax 中怎么让 CSS 动画在小程序端正常跑起来? 我用 Rax 写了个简单的加载动画,在 Web 端跑得好好的,但一到微信小程序就完全不动了,连 transition 都没反应。是不是小程序不支持某些 CSS 属性啊? 我试过把 animation ... シ昕彤 框架 2026-03-13 17:34:24 1 回答 11 浏览 Flutter里怎么监听键盘弹起和收起事件? 我正在用Flutter做聊天页面,想在键盘弹出时自动滚动到底部,但不知道怎么监听页面键盘的显示和隐藏。网上看到有人说用MediaQuery,但我试了好像没反应。有没有类似React里那种onFocus... 闲人书錦 移动 2026-03-11 23:17:19 1 回答 89 浏览 百度小程序中如何监听页面滚动事件? 我在百度小程序里想监听页面的滚动,试了 onScroll 但根本没触发,文档里也没找到明确说明。是不是得用别的方法? 我页面结构是用 scroll-view 包裹内容,加了 bindscroll 事件... Designer°风珍 移动 2026-03-05 18:08:20 2 回答 16 浏览 Taro中如何正确监听页面滚动事件? 我在Taro开发微信小程序时,想监听页面的滚动位置,但用onPageScroll好像没生效,控制台也没报错。 页面结构是普通ScrollView包裹内容,是不是得用别的方法?试过在componentD... 子源~ 移动 2026-03-01 09:55:19 1 回答 41 浏览 uni-app中React组件如何正确监听页面滚动事件? 在用uni-app开发时遇到了滚动监听问题。我在页面里写了一个React组件,想通过uni的onPageScroll方法获取滚动位置,但滚动时数值没有变化,甚至出现重复回调。 尝试过这样写代码: co... 极客子诺 移动 2026-02-18 08:58:42 2 回答 38 浏览 移动端滚动卡顿时,怎么用Passive监听优化事件? 在优化移动端页面时,我给触摸事件加了{ passive: true },滚动确实流畅了,但有个问题:touchMove里调用event.preventDefault()阻止滚动时完全没反应了,这是为什... 毓金酱~ 优化 2026-02-08 23:38:27
问题核心在于Rax的运行环境判断。在Web环境下确实可以用
window.addEventListener,但在小程序里window对象可能不存在或者行为不一致。Rax提供了universal-env来统一处理环境差异。具体来说分两步解决:
1. 先用
isMiniApp判断环境2. 根据不同环境使用对应API
这是完整的实现代码:
关键点说明:
- 在Web环境我们保持用传统的事件监听,记得在effect cleanup里移除监听
- 小程序环境通过判断my/wx对象来区分阿里系和微信系小程序
- 回调参数做了统一处理,通过scrollTop获取位置,这样业务代码就不用关心环境差异
实测这个方案在Web/阿里小程序/微信小程序都能正常工作。至于为什么文档没写清楚...可能是因为Rax团队觉得这属于"环境适配"范畴而不是框架核心功能吧(摊手)
补充一个细节:在小程序里onPageScroll是有触发频率限制的,如果要做节流处理建议在callback里自己加个
requestAnimationFrame。