收藏
回答

如何在onPageScroll停止的时候再setData?

框架类型 问题类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本
小程序 需求 onPageScroll 微信iOS客户端 6.6.7 2.0.2
onPageScroll: function (res) {
  // Do something when page scroll
  this.setData({
    scrollTop: res.scrollTop
  })
},

这样做影响性能啊,而且没必要,如何在滚动结束的时候只进行一次setData???

回答关注问题邀请回答
收藏

4 个回答

  • 游鹄君
    游鹄君
    2018-06-11

    微信官方说的可以在page中定义一些特殊的函数,事件处理函数

    而页面滚动事件被触发,说明是有用户在与页面产生交互,也就是会有手指按下和抬起的动作


    所以我们可以在page的data中设置一个控制的开关switchBreak


    data:

    {

            switchBreak:false;

    },


    然后在视图层给页面盒子绑定 touchend 事件 touchend = "toEnd",当手机触摸事件结束的时候,修改开关的状态


    toEnd:function(event)

    {

            this.setData(

            {

                     switchBreak:true;

            })

    },


    然后再页面滚动触发事件时将要执行的代码体之前先判断开关状态,true执行,false不执行

    onPageScroll: function (res)

    {

      先判断开关状态

      var that = this;

        if(that.data.switchBreak)

        {

               this.setData(

                        {

                            scrollTop: res.scrollTop
                         });

        }

     
    },


    关键的是要获取页面滚动结束时的触发的事件来设置开关状态.

    这只是我的猜想,如果有不对的地方请指正.联系QQ:2900976495,微信:游鹄君

    2018-06-11
    有用 1
    回复 7
    • 程序猿-Mr.Zhang
      程序猿-Mr.Zhang
      2018-06-12

      老哥,你这种方法,touchEnd执行把switchBreak改为true的时候,onPageScroll也结束了,正好不能改变scrollTop的值,哈哈,后来受你启发,我用了下面的方法,不用onPageScroll了。



      touchEnd: function(event) {
          var that = this
          wx.createSelectorQuery().selectViewport().scrollOffset(function(res) {
            that.setData({
              scrollTop: res.scrollTop
            })
          }).exec()
        },


      2018-06-12
      回复
    • 2018-07-27回复程序猿-Mr.Zhang

      这样子安卓会有延迟。有跳动问题

      2018-07-27
      回复
    • 程序猿-Mr.Zhang
      程序猿-Mr.Zhang
      2018-07-27回复

      没感觉  ==

      2018-07-27
      回复
    • 2018-07-27回复程序猿-Mr.Zhang

      你是IOS还是安卓?

      2018-07-27
      回复
    • 2018-07-27回复

      你是IOS还是安卓?

      2018-07-27
      回复
    查看更多(2)
  • 鹏波
    鹏波
    2020-12-07

    throttle函数了解下

    2020-12-07
    有用
    回复
  • Lan
    Lan
    2020-02-07
    // Setup isScrolling variable
    var isScrolling;
    
    // Listen for scroll events
    window.addEventListener('scroll', function ( event ) {
    
    	// Clear our timeout throughout the scroll
    	window.clearTimeout( isScrolling );
    
    	// Set a timeout to run after scrolling ends
    	isScrolling = setTimeout(function() {
    
    		// Run the callback
    		console.log( 'Scrolling has stopped.' );
    
    	}, 66);
    }, false);
    


    网上找了个教程,大概思路是这样的,设置一个超时器,每次滚动的时候就重置这个超时器,只有当停止滚动并等待大概66ms的时候才会运行超时器里面的回调函数。把setData放在里面就能够实现滚动停止“一段时间”之后再去setData。

    2020-02-07
    有用
    回复
  • 乐天⁸⁸⁰⁰⁶⁶⁷🐳
    乐天⁸⁸⁰⁰⁶⁶⁷🐳
    2018-12-27

    我也想知道,怎么判断页面滚动停止了,比如手上划页面滚动中,如何知道它停止了?

    2018-12-27
    有用
    回复
登录 后发表内容