欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

antd mobile(十一) MeScroll集成到项目中

程序员文章站 2022-04-04 12:30:16
...

MeScroll是在一个论坛看到的,论坛说比iscroll5 强大多了,本人对iscroll5早就不爽了,所以豪不犹豫的决定换掉它。
经过一天的奋斗,发现MeScroll确实比iscroll5要强大些,也好理解些,所以如果还在犹豫从这俩者之间选择谁,那我就推荐MeScroll了。

虽然推荐MeScroll 但并不代表MeScroll就没有坑,还是那句话遍地都是坑。因为MeScroll是基于以前的ajax模式开发的,跟react结合起来还是怪怪的。而且MeScroll可能使用人比iiscroll5的少,所以有些细节接口做的并没有iscroll5细,再就是MeScroll封装了好多其他相关功能进来,虽然感觉毕iscroll5强大,但在react模式下,许多地方需要代码去干预。

说了这么多MeScroll的不好,那为啥还要用MeScroll呢?理由非常简单就是够流畅够稳定。
这是我该控件的封装代码:

import React ,{Component,PropTypes} from 'react';
import { connect } from 'react-redux' // 引入connect
import { GoingUtils,AssertUtils } from 'GoingUtils';
var MeScroll = require('mescroll.js/mescroll');
import 'mescroll.js/mescroll.min.css';
import './style/index.less';
import { Icon } from 'antd-mobile';


var scollerId = GoingUtils.getUUid(3);let mescroll=null;

function upCallback(page,mescroll,appendContent,recordSize=0) {
  console.log("-----------------"+recordSize)
  console.log(page);
  mescroll.endSuccess();
  if(page["num"]!=1){
    setTimeout(function(){
      appendContent(mescroll,page);
    },200)
  }
}


function initEmptyDiv(downFlush, recordSize) {
  if (downFlush){
      var el=document.querySelector(".mescroll-empty");
      if(el!=null&&recordSize>0){
        el.style.display="none";
      }else if(el!=null){
        el.style.display="block";
          }
      }
}
function initScroll({scollerId,scrollTop,downFlush,endScroll,appendContent,recordSize=0,getTotalSize,getRecordSize,itemHeight=100}){

  initEmptyDiv(downFlush, recordSize);

   mescroll = new MeScroll(scollerId, { //第一个参数"mescroll"对应上面布局结构div的id
    //如果您的下拉刷新是重置列表数据,那么down完全可以不用配置,具体用法参考第一个基础案例
    //解析: down.callback默认调用mescroll.resetUpScroll(),而resetUpScroll会将page.num=1,再触发up.callback
    down:{
      use:false,
    },
    up: {
      use:true,
      auto:downFlush?true:false,
      offset:itemHeight,
      onScroll:function(mescroll, y){
        endScroll(y);
      },
      callback: function(page){
        //上拉加载的回调
        let totalSize=getTotalSize();let recordLength=getRecordSize();
        console.log(recordLength+"--recordLength---------------totalSize-----"+totalSize);
        if(downFlush&&parseInt(recordLength)<parseInt(totalSize)){
          upCallback(page,mescroll,appendContent,recordLength);
        }else{
          if(page['num']==1){
            if(!downFlush){
              mescroll.endSuccess(0);
            }else{
              mescroll.endSuccess(20);
            }
          }else{
            mescroll.endSuccess(recordLength);
          }
        }
      }
    },
  });



  //如果传入的y轴坐标不为0 则需要进行滚动操作
  if (scrollTop!=null&&scrollTop != 0) {
    mescroll.scrollTo(0 - parseFloat(scrollTop));
  }
}
class goingScroll extends Component {
  constructor(...props) {
    super(...props);
    this.endScroll = this.endScroll.bind(this);
    this.appendContent = this.appendContent.bind(this);
    this.getTotalSize = this.getTotalSize.bind(this);
    this.getRecordSize=this.getRecordSize.bind(this);
  }

  //结束回滚时 则调用顶层的reducer来设置当前界面的滚动位置
  endScroll(y) {
    if (this.props.dispatch != null) {
      //界面名称
      var pageName = this.props.pageName;
      var disObj = {
        type: 'AppMd/setPageScroll',
        scroll: {}
      };
      disObj.scroll[pageName] = -y;
      //触发顶层的滚动reducer
      this.props.dispatch(disObj);
    }
  }

  //组件更新后 需要根据记录数以及记录总数来初始化下信息提醒div
  shouldComponentUpdate(nextProps, nextState) {
    console.log(nextProps)
    let recordLength=this.getRecordSize(nextProps);
    let totalSize=this.getTotalSize(nextProps);
    initEmptyDiv(nextProps["downFlush"], recordLength);
    if(nextProps["downFlush"]&&recordLength==0&&mescroll!=null){
      mescroll.endSuccess(0);
    }
    console.log(recordLength+"--recordLength---------shouldComponentUpdate------totalSize-----"+totalSize);
    return true;
  }

  //下拉刷新时 加载该方法来实现数据的追加
  appendContent(myScroll,page) {
    var backFun = function (recordSize) {
      console.log("--------------------"+recordSize)
      myScroll.endSuccess();
    }
    if(AssertUtils.isFunction(this.props.flushContent)){
      this.props.flushContent(page["num"]);
    }

  }

  //获取当前组件传入的记录数
  getRecordSize(nextProps){
    if(nextProps==null){
      return this.props.recordSize;
    }else{
      return nextProps.recordSize;
    }
  }

  //获取当前组件传入的记录总数
  getTotalSize(nextProps){
    if(nextProps==null){
      return this.props.totalSize;
    }else{
      return nextProps.totalSize;
    }
  }

  //组件加载完成后 对MeScroll组件进行初始化。
  componentDidMount() {
    let endScrollFun=this.endScroll;
    let appendContent=this.appendContent;
    let options={...this.props,scollerId:scollerId,appendContent:appendContent,endScroll:endScrollFun,getTotalSize:this.getTotalSize,getRecordSize:this.getRecordSize};
    console.log(options)
    initScroll(options);
  }

  render() {
    let {topHeight}=this.props;
    if(topHeight==null){
      topHeight=90;
    }
    return (
      <div  className="wrapperScroll"
           style={{top:topHeight+'px',backgroundColor:'#EFF0F4',height:parseInt(window.innerHeight)-(topHeight+3)+'px'}}>
        <div id={scollerId} className="mescroll" style={{height:parseInt(window.innerHeight)-(topHeight)+'px'}}>
          {this.props.children}
          {this.props.downFlush ? <div className="mescroll-empty" style={{display:'none'}}>
            <p className="empty-tip">暂无相关数据</p>
          </div> : ""}
        </div>
      </div>
    )
  }

}

export default goingScroll;
相关标签: mobile