Vant2框架tab切换list不加载问题(切换后onload不继续触发)

57 篇文章 4 订阅

遇到的问题:

van-list 加载,页面上有个切换的 van-tab,实现切换不同的类型,加载不同的list的功能。

Vant2 的 List 列表 就有个 bug,当切换 tab 的时候,它的 onload 没有自动触发。

然而在当前标签页,如果列表已经加载完毕再去切换,onload 就可以实现自动触发


真实项目复现问题 :

三种tab切换类型列表,默认展示列表,上拉到底会正常触发 @load="onLoad" 加载方法

但是当点击切换Tab标签页列表类型时,再切换回来,上拉至列表底部时

不再触发 @load="onLoad" 加载方法

( 一开始以为是页面高度导致的问题,排查到最后发现并不是,因为如果是高度有问题的话,那一开始拉到底部也并不会触发加载方法了,So 最后百度了一波,整理一下吧 )


项目实际解决方案:

切换时 将 finished 状态重置为 false 。


index.vue

<template>
  <div class="tl">
    <div ref="TabList">
      <van-tabs @click="onTabClick" v-model="tlForm.flag">
        <van-tab
          v-for="(item, index) in ['list1', 'list2', 'list3']"
          :title="item"
          :key="index"
        >
          <TabList
            :ref="'tabList' + index"
            :tlData="TabListData"
            :loading="Loading"
            :finished="Finished"
            :refreshing.sync="Refreshing"
            @onLoad="onLoad"
            @onRefresh="onRefresh"
          />
        </van-tab>
      </van-tabs>
    </div>
  </div>
</template>

<script>
import TabList from './TabList.vue';
import { getDataListApi } from '@api/index';

export default {
  components: { TabList },
  data() {
    return {
      Loading: false,
      Finished: false,
      Refreshing: false,
      TabListData: [],
      total: 0, // 总页数
      tlForm: {
        page: 1, // 分页第几页
        pageSize: 10, // 每页数据数
        flag: 0, // 标签类型
      },
    };
  },
  created() {
    this.onLoad();
  },
  methods: {
    onTabClick(index) {
      // this.Loading = true; // 项目影响不大
      // 需将Finished状态重置,否则切换再上拉时不加载
      this.Finished = false; //关键代码
      this.tlForm.flag = index;
      this.$nextTick(() => {
        this.TabListData = [];
        this.tlForm.page = 1;
        this.tlForm.pageSize = 10;
        this.onLoad();
      });
    },
    // 下拉刷新时重置参数
    onRefresh() {
      this.Loading = true;
      this.Finished = false;
      this.tlForm.page = 1;
      this.TabListData = [];
      this.onLoad();
    },
    // 加载 获取列表信息
    onLoad() {
      this.getDataList();
    },
    async getDataList() {
      if (this.Refreshing) {
        this.Refreshing = false;
        this.TabListData = [];
      }
      let { code, res } = await getDataListApi(this.tlForm);
      if (code === 0) {
        this.total = res.total;
        this.TabListData = this.TabListData.concat(res.list);
        this.Loading = false; // 加载状态结束
        if (this.TabListData.length >= this.total) {
          this.Finished = true; // 没有更多数据了
        } else {
          this.tlForm.page += 1;
        }
      }
    },
  },
};
</script>

<style lang="scss" scoped>
.tl {
  height: 100%;
}
</style>

TabList.vue

<template>
  <div class="tabList">
    <van-pull-refresh
      v-model="refreshingProps"
      success-text="刷新成功"
      @refresh="onRefresh"
    >
      <van-list
        v-if="tlData.length > 0"
        v-model="loadingProps"
        :offset="20"
        :finished="finished"
        :immediate-check="false"
        finished-text="没有更多了"
        @load="onLoad"
      >
        <!-- 列表详细内容 -->
      </van-list>
      <div v-else>暂无内容</div>
    </van-pull-refresh>
  </div>
</template>

<script>
export default {
  props: {
    tlData: {
      // 列表数据
      type: Array,
      default: () => [],
    },
    finished: {
      type: Boolean,
      default: false,
    },
    loading: {
      type: Boolean,
      default: false,
    },
    refreshing: {
      type: Boolean,
      default: false,
    },
  },
  watch: {
    loading(newVal) {
      this.loadingProps = newVal;
    },
    loadingProps(newVal) {
      this.$emit('update:loading', newVal);
    },
    refreshing(newVal) {
      this.refreshingProps = newVal;
    },
    refreshingProps(newVal) {
      this.$emit('update:refreshing', newVal);
    },
  },
  data() {
    return {
      loadingProps: false,
      refreshingProps: false,
    };
  },
  methods: {
    onLoad() {
      this.$emit('onLoad');
    },
    onRefresh() {
      this.$emit('onRefresh');
    },
  },
};
</script>

<style lang="scss" scoped>
.tabList {
  height: 100%;
}
</style>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值