vue通过vant列表实现下拉到底部加载更多列表数据

vue通过vant列表实现下拉到底部加载更多列表数据(vant列表做为子组件的方式)

灵感来源于文章:https://blog.csdn.net/qq_42991509/article/details/105832399

vant列表

原理其实并不难,vant文档上就有很详细的介绍,但在实际使用中难免会遇到一些坑。
vant列表文档:https://vant-contrib.gitee.io/vant/v2/#/zh-CN/list
这边建议将vant-lsit文档理解一下再继续看接下来的内容

vant列表作为子组件

vant-list的Props中的v-modle(loading)和error必须通过watch属性侦听从父组件传过来的值进行绑定。

<template>
  <van-list class="designerList"
            v-model="Loading"
            :finished="finished"
            :offset="offset"
            :immediate-check="false"
            :error.sync="Error"
            finished-text="没有更多了"
            error-text="点击加载更多"
            @load="onload">
    <van-cell v-for="i in designerList"
              :key="i.designerId"
              class="designerList-info">
      <div class="content"></div>
    </van-cell>
  </van-list>
</template>

<script>
export default {
  name: "designerList",
  data () {
    return {
      Loading: false,//必有
      Error: false,//必有
      name: "",
    };
  },
  watch: {
    loading (newVal, oldVal) {
      this.Loading = newVal;
    },
    isClickChange: {
      handler (newValue, oldValue) {
        this.Error = newValue;
      },
      immediate: true,
    },
  },
  methods: {
    onload () {
      setTimeout(() => {
        this.$emit("getMore");
      }, 1000)
    },
  },
  props: {
    designerList: [],
    offset: 0,//滚动条与底部距离小于 offset 时触发load事件,默认300动加载中
    finished: {
      type: Boolean,
      default: false,
    },// 滚动加载完
    loading: {
      type: Boolean,
      default: false,
    },// 滚动加载中
    isClickChange: {
      type: Boolean,
      default: false,
    }
  },
  mounted () {
    this.Error = this.isClickChange;
  }
};
</script>

方式一:下拉到底部自动加载更多

原理:通过下拉到底部触发load事件发送数据请求

  • 在加载数据前必须手动修改loading为true
  • 在加载数据后必须手动修改loading为false
<template>
  <div class="test_noe">
    <!--  列表    -->
    <designerListTest :designerList="designerList"
                      :offset="offset"
                      :loading="loading"
                      :finished="finished"
                      @getMore="getData" />
  </div>
</template>

<script>
import designerListTest from "./components/designer-list-test";

export default {
  components: {
    designerListTest,
  },
  data () {
    return {
      pageNum: 1,
      pageSize: 5,
      designerList: [],
      offset: 0,//滚动条与底部距离小于 offset 时触发load事件,默认300
      loading: false, // 滚动加载中
      finished: false, // 滚动加载完成
    };
  },
  methods: {
    async getData () {
      this.loading = true;//在加载数据前必须手动修改loading为true
      const res = await this.$getData(
        "SearchDesigner",
        {
          searchKeyword: "1234567",
          pageNum: this.pageNum,
          pageSize: this.pageSize,
        },
        "post",
        false
      );
      if (res.code == 1) {
        console.log("res.data.totalCount", res.data.totalCount);
        this.designerList = this.designerList.concat(res.data.list);
        console.log("this.designerList", this.designerList);
        this.pageNum = this.pageNum + 1;
        console.log("this.pageNum", this.pageNum)
        console.log("this.designerList.length", this.designerList.length)

        if (this.designerList.length === res.data.totalCount) {
          this.finished = true;
        }
      }
      this.loading = false;//在加载数据后必须手动修改loading为false
    },
  },
  mounted () {
    this.getData();
  },
}
</script>

<style>
</style>

方式二:下拉到底部点击加载更多

原理:通利用vant-list的Props中error来实现点击加载更多数据

  • 在加载数据前必须手动修改loading为true
  • 在加载数据后必须手动修改loading为false,必须手动修改isClickChange为true(isClickChange及vant-list中的error)
<template>
  <div class="test_noe">
    <!--  列表    -->
    <designerListTest :designerList="designerList"
                      :offset="offset"
                      :loading="loading"
                      :finished="finished"
                      :isClickChange="isClickChange"
                      @getMore="getData" />
  </div>
</template>

<script>
import designerListTest from "./components/designer-list-test";

export default {
  components: {
    designerListTest,
  },
  data () {
    return {
      pageNum: 1,
      pageSize: 5,
      designerList: [],
      offset: 0,//滚动条与底部距离小于 offset 时触发load事件,默认300
      loading: false, // 滚动加载中
      finished: false, // 滚动加载完成
      isClickChange: true,
    };
  },
  methods: {
    async getData () {
      this.loading = true;
      this.isClickChange = false;
      const res = await this.$getData(
        "SearchDesigner",
        {
          searchKeyword: "1234567",
          pageNum: this.pageNum,
          pageSize: this.pageSize,
        },
        "post",
        false
      );
      if (res.code == 1) {
        console.log("res.data.totalCount", res.data.totalCount);
        this.designerList = this.designerList.concat(res.data.list);
        console.log("this.designerList", this.designerList);
        this.pageNum = this.pageNum + 1;
        console.log("this.pageNum", this.pageNum)
        console.log("this.designerList.length", this.designerList.length)
        if (this.designerList.length === res.data.totalCount) {
          this.finished = true;
          this.isClickChange = false;
        } else {
          this.isClickChange = true;
        }
      }
      this.loading = false;
    },
  },
  mounted () {
    this.getData();
  },

}
</script>

<style>
</style>
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以通过使用Vant组件库和Vue 3来实现上拉分页和下拉刷新功能。下面是一个简单的示例代码: 首先,您需要安装Vant组件库。可以通过npm或yarn来安装。 ```bash npm install vant ``` 在Vue文件中,您需要引入Vant组件并注册使用它们。在需要使用上拉分页和下拉刷新的页面中,您可以使用Vant的`PullRefresh`和`List`组件实现。 ```vue <template> <div> <van-pull-refresh v-model="refreshing" @refresh="onRefresh"> <van-list v-model="loading" :finished="finished" @load="onLoad"> <!-- 这里是列表内容 --> <van-list-item v-for="item in list" :key="item.id">{{ item.text }}</van-list-item> </van-list> </van-pull-refresh> </div> </template> <script> import { ref, reactive } from 'vue'; export default { setup() { // 列表数据 const list = reactive([]); // 是否正在刷新 const refreshing = ref(false); // 是否正在加载更多数据 const loading = ref(false); // 是否已加载完所有数据 const finished = ref(false); // 模拟异步获取数据 const fetchData = () => { return new Promise((resolve) => { setTimeout(() => { resolve([ { id: 1, text: 'item 1' }, { id: 2, text: 'item 2' }, { id: 3, text: 'item 3' }, ]); }, 1000); }); }; // 下拉刷新事件 const onRefresh = () => { refreshing.value = true; // 模拟异步获取最新数据 fetchData().then((data) => { list.splice(0, list.length, ...data); refreshing.value = false; finished.value = false; }); }; // 上拉加载更多事件 const onLoad = () => { loading.value = true; // 模拟异步加载更多数据 fetchData().then((data) => { if (data.length > 0) { list.push(...data); } else { finished.value = true; } loading.value = false; }); }; return { list, refreshing, loading, finished, onRefresh, onLoad, }; }, }; </script> ``` 在上述代码中,我们通过`van-pull-refresh`组件实现下拉刷新功能,并通过`van-list`组件实现分页加载功能。当页面触发下拉刷新事件时,我们可以通过异步获取最新数据并更新列表。当页面触发上拉加载更多事件时,我们可以通过异步加载更多数据并追加到列表末尾。 这样,您就可以使用VantVue 3来实现上拉分页和下拉刷新功能了。希望对您有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值