关于MandMobile ScrollView组件的使用

74 阅读2分钟

前提:需要在移动端使用滚动加载的视图,所以找到了MandMobile的ScrollView组件进行使用。下列是一些心得以及实践代码。

组件文档地址:didi.github.io/mand-mobile…

普通使用

  • 初始化时候手动进行组件的初始化,避免异步数据请求,内部宽高出现异常。
  • 滚动到底部时,进行数据查询,查询的内容与分页查询一致,页数+1,并且返回的数据push到list中。
  • 注意对触底函数的防抖限制(设置一个标识),并且需要判断查询是否结束,结束finishLoadMore。
<md-scroll-view
    :scrolling-x="false"          // 禁止横向滚动
    @end-reached="onEndReached"   // 滚动到底部的时候进行查询逻辑
    :end-reached-threshold="0.01" // 提前量 0.01px
    :manual-init="true"           // 手动初始化
    :auto-reflow="true"           // 自动重置滚动区域
    @scroll="handleScroll"        // 滚动的时候记录与组件顶部的距离
    ref="scrollView"
    >
</md-scroll-view>
<md-scroll-view-more slot="more" :is-finished="isFinished" ></md-scroll-view-more>
<script>
...
data(){
    list:[]
    dataLoadFlag: false,
    isFinished: false
},
methods:{
    onEndReached() {
        if (this.isFinished) {
                return;
        }
        this.onSearch();
    },
    onSearch(){
        this.dataLoading = true;
        var callback = (res)=>{
            this.list.push(res.body.content);
            this.isFinished = res.body.last;
            this.dataLoading = false;
            this.$refs.scrollView.finishLoadMore();
        }
    },
}
...
</script>

刷新数据,恢复上次查询位置

如果有点击进入子画面进行数据操作,并且数值会发生变化且需要显示在外部列表中,希望刷新数据的情况,并且需要记忆点击进入的位置,重新滚动到该位置。这里有个bug,如果条数会发生变化,或者是数据顺序会发生变化,每次查询位置都不确定的情况,更倾向于只刷新当前点击块区域,每次进入子画面时要单独进行一次查询,确保短期内数据的正常。

handleScroll({scrollLeft,scrollTop}){
    this.scrollTop = scrollTop;
},
onSearch(){
    param.currentPage = 1;
    param.pageSize = this.mult(this.pageSize*this.currentPage); // 本次刷新变为获取所有当前数据,这个也有隐患,如果滑动的数量过大也会有性能上的问题,需要进行虚拟滚动或者逻辑上的优化
    var callback = (res)=>{
        ...
        // this.list.push(res.body.content);
        this.list = res.body.content
        ...
    }
}