在 React 应用中,我们经常需要处理滚动事件(onScroll),以实现一些与滚动相关的功能,如无限滚动加载、滚动到顶部按钮等。 本文将详细介绍如何处理 React 中的 onScroll 事件,并提供示例代码帮助你理解和应用这个功能。 添加滚动事件监听器在 React 中,我们可以通过在元素上添加 onScroll 属性来监听滚动事件。通过指定一个回调函数,我们可以在滚动事件触发时执行相应的逻辑。 结论本文详细介绍了如何处理 React 中的滚动事件(onScroll),以及一些优化技巧。
HtmlBasedComponent.class, Events.ON_AFTER_SIZE, CE_DUPLICATE_IGNORE); } ... } 发现最大的组件所支持的事件并没有我们想要的onScroll $n(), "onScroll", 'doScroll_'); }, unbind_: function() { this.domUnlisten_(this. $n(), "onScroll", 'doScroll_'); this. supers(cul.wgt.CbxDiv, 'unbind_', arguments); }, doScroll_: function() { this.fire('onScroll
show(); return false; } @Override public boolean onScroll onScroll 拖动相应. 就是拖着某个控件, 这个就会触发. onFling 滑动相应. 就是快速划一下, 它就会触发. ---- 小栗子体验一下 也说了一些, 我们来体验下. 绕圈 onDown onShowPress onScroll onScroll onScroll onScroll onScroll onScroll 然后我们再来一次, 先点击一下, 再绕一圈. 点击时候发生了: onDown onShowPress onSingleTapUp 绕圈时候是: onDown onShowPress onScroll onScroll onScroll onFling 然后分析第一次绕圈, 点下去onDown, 停留onShowPress, 拖动onScroll, 之后就是多次拖动. 很好理解.
}); 三、滑动事件:setOnScrollListener 有两个回调方法: onScrollStateChanged(AbsListView view, int scrollState) onScroll 0x5500ff00 : 0x550000ff); } @Override public void onScroll view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); 2.onScroll 最顶端条目的id * @param visibleItemCount 可见的条目数 * @param totalItemCount 总条目数 */ @Override public void onScroll } } } @Override public void onScroll
这不是啥新问题,只不过最近又重新回顾了一下这个问题 一、需求 解决 onscroll每次计算导致的性能问题 onscroll是最典型的需要进行防抖或者节流的处理问题 最近有人问到我,防抖和节流有什么不同 function(){ console.log("防抖"); console.log(new Date()); },300); }; 为什么要clearTimeout 每次onscroll 在解决onscroll问题的时候,如果自己观察console可以发现,防抖保证了滚动停止的时候,才会进行处理,因为滚动停止了,没有scroll事件了,最后一次timer会被保留,从而进行调用 2、节流 比如: var flag = true; window.onscroll = function(){ if(! utm_source=website 2、节流解决onscroll实例 如果较长点时间快速滚动不停下,会执行两次,这就是节流的周期。 http://jsrun.net/8viKp/edit?
防抖与节流 防抖debounce与节流throttle都是控制事件处理函数执行频率的方法,当函数会进行DOM操作或者具有请求服务器等行为并且作为高频事件例如onscroll触发的事件处理函数时,就需要进行事件处理函数执行频率的控制 clearTimeout(timer); timer = setTimeout(() => funct(...args), wait); } } window.onscroll clearTimeout(timer); timer = setTimeout(() => timer = null, wait); } } window.onscroll previous > wait){ funct(...args); previous = now; } } } window.onscroll funct(...args); timer = setTimeout(() => timer = null, wait); } } } window.onscroll
onLongPress(MotionEvent e) { Log.e("onLongPress", "onLongPress"); } // 在touch down后又没有滑动(onScroll Log.e("onSingleTapUp", "onSingleTapUp"); return false; } @Override public boolean onScroll (MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.e("onScroll ", "onScroll"); return false; } @Override public boolean onFling(MotionEvent e1,
wx.SL_AUTOTICKS | wx.SL_LABELS) self.slider.SetTickFreq(5, 1) self.slider.Bind(wx.EVT_SCROLL, self.onScroll self.slider, 0, wx.ALL, 5) sizer.Add(self.toggle, 0, wx.ALL, 5) self.SetSizer(sizer) def onScroll wx.SL_AUTOTICKS | wx.SL_LABELS) self.slider.SetTickFreq(5, 1) self.slider.Bind(wx.EVT_SCROLL, self.onScroll self.slider, 0, wx.ALL, 5) sizer.Add(self.toggle, 0, wx.ALL, 5) self.SetSizer(sizer) def onScroll
ACTION_DOWN MotionEvent e2:最后一个ACTION_MOVE MotionEvent velocityX:X轴上的移动速度,像素/秒 velocityY:Y轴上的移动速度,像素/秒 onScroll 无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法 在ACTION_MOVE动作发生时就会触发 滑屏:手指触动屏幕后,稍微滑动后立即松开 onDown-----》onScroll ----》onScroll----》onScroll----》………----->onFling 拖动 onDown------》onScroll----》onScroll------》onFiling // TODO Auto-generated method stub return false; } public boolean onScroll
通过绑定Scroll组件的onScroll滚动事件回调函数,精准捕获滚动动作的发生。当滚动时,实时地调节组件的透明度、高度等属性,从而成功实现了嵌套滚动效果、透明度动态变化以及平滑的组件切换。 Scroll(this.scroller) { Column() { ... }}实现滚动过程中动态调整文本框高度的功能时,运用Scroll组件滚动事件回调函数onScroll在滚动时修改文本框的高度及组件的透明度 onScroll(() => { let yOffset: number = this.scroller2.currentOffset().yOffset; this.Height2 = this.Height2 本例中Scroll组件绑定onScroll滚动事件回调,onScroll属于频繁回调,在回调中需要尽量减少耗时和冗余操作,例如减少不必要的日志打印。
鼠标的mousemove、mouseover 导航条上,用户不停的在导航区域滑动相当于 函数节流的应用场景 间隔一段时间执行一次回调的场景有: 滚动加载,加载更多或滚到底部监听,window.onscroll 保证只开启一个定时器 } timer = setTimeout(function(){ fn(); //延迟delay,执行函数 },delay) } window.onscroll } } let testDebounceFn = debounce(test,1000); function test(a){ console.log('滚动停 '+a) } window.onscroll } } let testThrottleFn = throttle(test,3000); function test(a){ console.log('打印 '+a) } window.onscroll } } let testThrottleFn = throttle(test,2000); function test(b){ console.log('出现 '+b) } window.onscroll
方法期间的X上的滚动距离 * @param distanceY 触发onScroll方法期间的Y上的滚动距离 * @return */ @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return 方法期间的X上的滚动距离 * @param distanceY 触发onScroll方法期间的Y上的滚动距离 * @return */ @Override (distanceY >= 0) {//上滑 result += "onScroll - Up\n"; tvResult.setText(result) 这就是基本的事件逻辑了,可以根据自己的需求进一步做处理,比如音量屏幕左边上滑时调节亮度,右边上滑时调节音量,这都是通过在onScroll方法中做处理实现的。OK,就是这样了
e.target.scrollTop 获取,表示滚动条距离顶部的px 实际高度(scrollHeight):通过 dom 的 scrollHeight 获得,表示区域内所有内容的高度(包括滚动距离),也就是实际高度 基础实现 onScroll export default { data(){ return { reachBottomDistance: 100 } }, methods: { onScroll return { isReachBottom: false, reachBottomDistance: 100 } }, methods: { onScroll dom.scrollHeight this.offsetHeight = Math.ceil(dom.getBoundingClientRect().height) }, methods: { onScroll
= null){ onScrollListener.onScroll(t); } } /** * MyScrollView滑动的Y方向距离 * @param scrollY * 、 */ public void onScroll { @Override public void onGlobalLayout() { //这一步很重要,使得上面的购买布局和下面的购买布局重合 onScroll myScrollView.getScrollY()); } }); } @Override public void onScroll 好了,不过根据这种思路你也可以刚开始使用一个悬浮框来覆盖在下面的购买布局上面,然后onScroll()方法中更新悬浮框的位置,不过悬浮框的x,y不是相对于父布局的,这点要注意下,这样子也能实现效果,不过相对于此
实现的自适应不再此范围内) 通过监听 keyup 事件,监听文字输入并调用接口进行模糊匹配 … 常规实现,以监听 scroll 事件为例 我们先来看一下scroll事件的触发频率 window.onscroll scroll 的一个简单例子 复制代码 let timer; window.onscroll = function () { if(timer){ clearTimeout(timer) } clearTimeout(timer); timer = setTimeout(function () { method.apply(self,args); },delay); } } window.onscroll scroll 的一个简单例子 复制代码 let startTime = Date.now(); //开始时间 let time = 500; //间隔时间 let timer; window.onscroll now; }else { timer = setTimeout(function () { loop.apply(self, args); }, 50); } } } window.onscroll
// 函数防抖 let timer = null; document.getElementById("debounce").onscroll = function() { clearTimeout( setTimeout(function () { func() }, wait); } } document.getElementById("debounce").onscroll // 函数节流 let isOk = true; document.getElementById("throttle").onscroll = function(){ if(! func() isOk = true; }, wait); } } document.getElementById("throttle").onscroll
3000px; } </style> </head> <body>
控制下拉刷新状态 三、常用场景与实现 场景 1:垂直滚动列表(最常见) <scroll-view scroll-y class="scroll-list" bindscroll="<em>onScroll</em> fn.apply(this, args); timer = null; }, delay); } }; } // 页面中使用 Page({ <em>onScroll</em> 滚动位置:', e.detail.scrollTop); // 懒加载、吸顶等逻辑 }, 16) // ~60fps }) 六、高级技巧 技巧 1:吸顶效果(Sticky Header) <em>onScroll</em> 'header-sticky' : 'header-normal'}}"> 吸顶标题 </view> 技巧 2:滚动百分比指示器 onScroll(e) { const { scrollTop, hidden; /* 关键 */ } 七、兼容性注意事项 平台 注意事项 微信小程序 支持最全,但 iOS 下 scroll-into-view 需延迟 支付宝小程序 属性名相同,但部分事件名不同(如 onScroll
float distanceX, float distanceY) { Log.i("MyGesture", "onScroll:"); return true float distanceX, float distanceY) { Log.i("MyGesture", "onScroll:"); float distanceX, float distanceY) { Log.i("MyGesture", "onScroll:"); float distanceX, float distanceY) { Log.i("MyGesture", "onScroll:"); float distanceX, float distanceY) { Log.i("MyGesture", "onScroll:");