better-scroll 上拉加载,下拉刷新(解决移动端长页面卡顿)

一、Better Scroll 滚动原理

1.下图能直观的表示better-scroll的滚动原理

2.html设置

<div class="wrapper">

  <ul class="content">

    <li>...</li>

    <li>...</li> ...

  </ul> <!-- 这里可以放一些其它的 DOM,但不会影响滚动 -->

</div>

3.js设置

var wrapper = document.querySelector(‘.wrapper‘);

var scroll = new BScroll(wrapper);

4.当better-scroll遇上vue

<template>
  <div class="wrapper" ref="wrapper">
    <ul class="content">
      <li v-for="item in data">{{item}}</li>
    </ul>
    <div class="loading-wrapper"></div>
  </div>
</template>
<script>
  import BScroll from ‘better-scroll‘
  export default {
    data() {
      return {
        data: []
      }
    },
    created() {
      this.loadData()
    },
    methods: {
      loadData() {
        requestData().then((res) => {
          this.data = res.data.concat(this.data)
          this.$nextTick(() => {
            if (!this.scroll) {
              this.scroll = new Bscroll(this.$refs.wrapper, {})
              this.scroll.on(‘touchend‘, (pos) => {
                // 下拉动作
                if (pos.y > 50) {
                  this.loadData()
                }
              })
            } else {
              this.scroll.refresh()
            }
          })
        })
      }
    }
  }
</script>

//上拉加载if(this.scroll.y <= (this.scroll.maxScrollY + 50) && this.loading) {}//this.loading 一个设置当前是否加载的开关变量,进行完if判断后置为false,当请求完成后置为true

5.常用参数

better-scroll 默认参数:click:false,tap:false,probeType(Number),默认值为0,可选值1,2,30(默认)不派发scroll事件,1 会非实时(屏幕滑动超过一定时间后)地派发scroll事件,2 在屏幕滚动过程中会实时地派发scroll事件,3 不仅在屏幕滚动的过程中,而且在momentum(动量)滚动动画运行过程中实时派发scroll事件。

6.我在开发中遇到的问题

在页面中的同一区域我初始化了两个BScroll (注意ref值不能相同,同时,在不同的方法中不要初始化为同一变量,否则后一个不会被初始化)。
<div>
 <div v-if="" class="wrapper" ref="wrapper">  <ul>    <li></li>
    <li></li>
    <li></li>
    ……
  </ul> </div>

 <div v-else class="wrapper" ref="myWrapper">
  <ul>    <li></li>

    <li></li>

    <li></li>

    ……

  </ul>
 </div>
</div>进行滚动的list列表有个加入购物车的功能,第一个Bs(wrapper)进行加入购物车操作时是没有任何问题的,但是在该区域的另一个Bs(myWrapper)进行加入购物车操作时,会连续向服务器请求两次。

查资料说需要将 event._constructed 设置为true,但令我百思不得其解是为什么第一个区域可以,同样的代码就不适用于第二个区域呢,虽然觉得(
将 event._constructed 设置为true),是行不通的,但还是试了试。最后也证明了我的猜想(在1.5.5版本中,已经修复了点击事件触发两次的问题,如果你开发时使用的是低版本可以试试这种解决方案。高版本就不必了)。

我的解决方案:
在进行wrapper的初始化时,设置click或tap参数值为true,
而在进行myWrapper的初始化时,不设置click及tap参数,即让它们取默认值false,这样就完美解决了我的问题。
7.一个不成熟的小建议在我之前的博文dropload.js中也介绍过我自己开发过程(上拉加载,下拉刷新)中遇到的一些问题,但是dropload的坑还是很多的,个人认为,better-scroll更好一点。官方说法,better-scroll是iScroll的升级版本。因此我建议在实现移动端“上拉加载,下拉刷新”功能时,建议您使用better-scroll。
8.抛砖引玉
better-scroll官方网站:
https://ustbhuangyi.github.io/better-scroll/#/

知乎文章"当better-scroll遇上vue":

https://zhuanlan.zhihu.com/p/27407024

时间: 2024-08-10 17:18:42

better-scroll 上拉加载,下拉刷新(解决移动端长页面卡顿)的相关文章

使用dragloader.js插件实现上拉加载/下拉刷新..

在写代码时候有个需求是,在触屏页面,为了加快页面加载速度,案件列表每页展示5条数据: 然后点击更多,展示下一页数据: 但是为了触屏更好的体验,改为往上滑动案件列表,加载下一页数据:就是要实现上拉加载/下拉刷新的效果: 我只用到了 上拉加载: 参考资料:http://blog.csdn.net/xb12369/article/details/39202711 下面是写的demo: html代码: <!DOCTYPE html> <html lang="en"> &

ListView上拉加载下拉刷新

主要用到了这个几个文件,MainActivity是界面的Activity,MyAdapter是ListView的自定义适配,MyListView是自定义带头部LIistView,如果只需要上拉加载就不需要:activity_main.xml是住界面,item.xml是ListView的子布局里面只有一个TextView,listview_footer.xml是listview的加载更多的底部布局,listview_header.xml是listview的头部布局. MainActivity.ja

XML解析及上拉加载下拉刷新

XML解析及上拉加载下拉刷新 1.XML格式 2.GData和XPath遍历 //配置XML库(配置完才能使用) //(1)添加头文件搜索路径 // Header Search Paths-> /usr/include/libxml2 //(2)添加二进制库 // Link library -> lixml2.dylib //(3)源文件添加编译选项 // -fno-objc-arc //(4)添加头文件 // #import "GDataXMLNode.h"*/ XPat

Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法

bug说明: Mint-ui中loadmore(上拉加载下拉刷新)组件 在 使用fastclick的情况下 ,在ios设备中滑动会触发点击事件: 解决方法: 我是按需引入,去项目中找到loadmore下的index.js,全部引入的要找mint下面mint-ui.common.js 路径如下:你的项目名/node_modules\mint-ui\lib\loadmore\index.js 搜索 handleTouchEnd ,记得写event进去 handleTouchEnd: function

微信小程序上拉加载下拉刷新

微信小程序实现上拉加载下拉刷新 使用小程序默认提供方法. (1). 在xxx.json 中开启下拉刷新,需要设置backgroundColor,或者是backgroundTextStyle ,因为加载的动画可能会是白色背景,会看不清. { "usingComponents": { "annicate": "/components/annicate/index" }, "navigationBarTitleText": &quo

移动端上拉加载下拉刷新

<template> <div class="wrapper" ref="wrapper"> <div class="content" > <div class="refresh" :class="{ativeRefresh:refresh}">刷新</div> <div class="ct-row" v-for=&quo

上拉加载下拉刷新控件WaterRefreshLoadMoreView

效果: 源码: // // SRSlimeView // @author SR // Modified by JunHan on 13-9-18. // #import <UIKit/UIKit.h> #define kStartTo 0.7f #define kEndTo 0.15f #define kAnimationInterval (1.0f / 50.0f) NS_INLINE CGFloat distansBetween(CGPoint p1 , CGPoint p2) { ret

xlistview上拉加载 下拉刷新

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" >

XListView实现上拉加载下拉刷新

package com.loaderman.androiddemo; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.animation