mpvue中的scroll-top值无效

发布于 2022-09-11 18:35:23 字数 4506 浏览 14 评论 0

我想用scroll-view实现上拉加载,下拉刷新的橡皮经弹回效果,但是在设置scroll-top的值的时候,并没有弹回,请大佬们帮忙看看

贴代码:

<template>
  <div class="bg index">
    <div :style="listCardH">
        <scroll-view :scroll-y="true" :scroll-with-animation="true"  :scroll-top="scrolledTop" @scrolltoupper="refresh" @scrolltolower="loadMore" @scroll="scrolling" @touchstart="scrollTouchStart" @touchend="scrollTouchEnd" style="height: 100%;">
            <div>loading...</div>
            <div class="list white-bg" v-for="(item,index) in list1.list" :key="index" @click="goDetail">
              {{item.name}}
            </div>
            <div v-if="list1.showLoading" >loading...</div>
            <div v-if="!list1.showLoading" class="no-more">没有更多了</div>
          
        </scroll-view>
    </div> 
  </div>
</template>

<template>
  <div class="bg index">
    <div :style="listCardH">
        <scroll-view :scroll-y="true" :scroll-with-animation="true"  :scroll-top="scrolledTop" @scrolltoupper="refresh" @scrolltolower="loadMore" @scroll="scrolling" @touchstart="scrollTouchStart" @touchend="scrollTouchEnd" style="height: 100%;">
            <div>loading...</div>
            <div class="list white-bg" v-for="(item,index) in list1.list" :key="index" @click="goDetail">
              {{item.name}}
            </div>
            <div v-if="list1.showLoading" >loading...</div>
            <div v-if="!list1.showLoading" class="no-more">没有更多了</div>
          
        </scroll-view>
    </div> 
  </div>
</template>

<script>
export default {
  data() {
    return {
      isClose: true, // 判断当前页面是打开还是返回页
      currListCard: 0,
      listCardH: '',
      scrollingTop: 0,
      scrolledTop: 0,
      scrollHeight: 0,
      scrollWrapHeight: 0,
      list1: {
        list: [],
        showLoading: false,
        pageInfo: {
          pageNum: 1,
          pageSize: 20,
          totalPages: 0
        }
      }
    };
  },

  components: {},

  methods: {
    /**
     * 下拉 刷新
     */
    refresh(e) {
      console.log('refresh----e=', e);
      this.list1.pageInfo.pageNum = 1;
      this.list1.list = [];
      this.initList1();
    },

    /**
     * 上拉加载
     */
    loadMore(e) {
      if (this.list1.pageInfo.pageNum < this.list1.pageInfo.totalPages) {
        this.list1.pageInfo.pageNum++;
        this.initList1();
        this.list1.showLoading = true;
      } else {
        this.list1.showLoading = false;
      }
    },

    scrolling(e) {
      this.scrollingTop = e.mp.detail.scrollTop;
      this.scrollHeight = e.mp.detail.scrollHeight;
      if (this.scrollingTop < 100) {
        this.scrolledTop = 80;
        // console.log('下拉刷新结束');
      }
    },

    scrollTouchStart() {
      console.log('scrollTouchStart');
    },

    scrollTouchEnd() {
      console.log('scrollTouchEnd');

      if (this.scrollingTop < 100) {
        this.scrolledTop = 80;
        console.log('下拉刷新结束');
      }

      if (this.scrollHeight - this.scrollingTop - this.scrollWrapHeight <= 10) {
        console.log('上拉加载');
        this.scrolledTop = this.scrollHeight - this.scrollWrapHeight + 10;
      }
    },

    /**
     * list1数据
     */
    initList1() {
      this.list1.pageInfo.totalPages = 5;
      for (let i = 0; i < this.list1.pageInfo.pageSize; i++) {
        this.list1.list = [
          ...this.list1.list,
          { name: `list${this.list1.pageInfo.pageNum}-${i}` }
        ];
      }
    },

    /**
     * 初始化scroll-view的高度
     */
    initScrollViewHeight() {
      this.$wxPromisify(wx.getSystemInfo)()
        .then(res => {
          console.log('res[2].windowHeight=', res.windowHeight);
          this.listCardH = `height:${res.windowHeight - 50}px`;
          this.scrollWrapHeight = res.windowHeight - 50;
          this.scrollHeight = res.windowHeight;
        })
        .catch(err => console.error(err));
    },

    /**
     * 跳转详情页
     */
    goDetail() {
      this.isClose = false;
      wx.navigateTo({
        url: `/pages/detail/main`
      });
    }
  },

  /**
   * 微信底部上拉事件和 scroll-view 选其一使用即可
   */
  onReachBottom() {
    console.log('上拉');
  },

  created() {},
  mounted: async function () {
    this.scrolledTop = 80;
    this.initScrollViewHeight();
    this.initList1();
  },
};
</script>

以上就是代码了,还请各位走过路过的大佬帮忙看看是该怎么解决呢?鞠躬

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

假情假意假温柔 2022-09-18 18:35:23

这个是mpvue的bug,其实也算不上bug,算是设定。
当你设置scrolledTop这个值的时候,mpvue会去检测当前的scrolledTop 的值,如果两个值相同,就不会去setData,也就不会去修改滚动条的位置。
现在我的解决办法是,比如你要每次把滚动条的高度设为80,那你就每次都
this.scrolledTop = 79;
this.scrolledTop = 80;
这样的话每次修改scrolledTop 的时候,scrolledTop 的值就都是不同的了。
不过应该还会有更好的解决办法。

身边 2022-09-18 18:35:23

我最近也在看这个问题,我要的就是一个回到顶部的功能。
原生没问题,mpvue好像就是不行。
按照官方的github的#500和#603的解决办法
我试了,还是不行。。。可能是我的功力不够

他们评论有说不用scroll-view组件的,有说这部分用原生写的

我现在在弃坑的边缘

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文