vue ElementUI :InfiniteScroll 无限滚动问题

当时的问题是鼠标动了就会触发加载事件,并没有滚动到底部才触发。(因为高度不对,el-option是单条高度,我需要获取的是接口返回的数据的总高度)  

<template>
  <!-- el-select远程搜索 + 无限滚动加载下一页 -->
  <el-select
    v-model="value1"
    filterable
    remote
    reserve-keyword
    placeholder="请输入关键词"
    :remote-method="remoteMethod"
    :loading="loading"
    :popper-append-to-body="false"
  >
    <!-- 要知道for循环用在哪  el-option 单条高度 -->
    <div v-infinite-scroll="load" :infinite-scroll-disabled="busy">
      <el-option
        v-for="(item, index) in options"
        :key="index"
        :label="item.data[0].name"
        :value="item.data[0].name"
      >
      </el-option>
    </div>
    <p v-if="loadMore">加载中</p>
  </el-select>
</template>

<script>
export default {
  data() {
    return {
      options: [],
      value1: "",
      list: [],
      loading: false,
      states: [],
      pageNum: 10,
      busy: false,
      immediate: false,
      loadMore: false,
    };
  },
  mounted() {},
  methods: {
    remoteMethod(query) {
      // 解决重新输入内容滚动条无法回到顶部问题
      document.getElementsByClassName(
        "el-select-dropdown__wrap"
      )[0].scrollTop = 0;
      document.getElementsByClassName(
        "el-scrollbar__thumb"
      )[1].style.transform = "translateY(0)";

      this.value1 = query;
      console.log(this.value1);
      this.getData();
    },
    async getData() {
      console.log(111);
      await this.$http
        .get(
          `https://api.wmdb.tv/api/v1/top?type=Imdb&skip=0&limit=${this.pageNum}&lang=Cn`
        )
        .then((res) => {
          console.log(res.data);
          this.options.push(...res.data);
          this.pageNum += 10;
          this.loadMore = true;
          this.busy = false;
        });
    },
    load() {
      if (this.busy) return; // 防止一次请求多条数据
      this.busy = true;
      console.log(1);
      console.log(this.pageNum);
      this.getData();
    },
  },
};
</script>

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue 中实现无限滚动可以使用 `InfiniteScroll` 插件。这个插件可以自动监听滚动事件,当滚动到底部时,会自动触发加载更多数据的方法。 首先,你需要在你的 Vue 项目中安装 `vue-infinite-scroll` 插件。可以使用以下命令进行安装: ``` npm install vue-infinite-scroll --save ``` 安装完成之后,在你的 Vue 组件中引入 `InfiniteScroll` 插件,并使用 `v-infinite-scroll` 指令实现无限滚动。 例如,在一个商品列表的组件中: ```html <template> <div class="product-list"> <div v-for="(product, index) in productList" :key="index">{{product.name}}</div> <div v-if="loading">加载中...</div> </div> </template> <script> import InfiniteScroll from 'vue-infinite-scroll' export default { name: 'ProductList', data() { return { productList: [], // 商品列表 pageNum: 1, // 当前页码 pageSize: 10, // 每页数量 loading: false, // 是否正在加载 } }, mounted() { // 初始化加载第一页数据 this.loadData() }, methods: { // 加载数据 loadData() { this.loading = true // 模拟异步请求数据 setTimeout(() => { // 获取数据 const data = this.getProducts(this.pageNum, this.pageSize) // 添加到商品列表中 this.productList = [...this.productList, ...data] // 加载完成 this.loading = false // 更新页码 this.pageNum++ }, 1000) }, // 获取商品数据 getProducts(pageNum, pageSize) { // 模拟请求数据 const productList = [] for (let i = 0; i < pageSize; i++) { const id = (pageNum - 1) * pageSize + i productList.push({ id, name: `商品${id}`, }) } return productList }, }, directives: { InfiniteScroll, }, } </script> ``` 上面的代码中,我们使用 `v-for` 指令渲染商品列表,并且使用 `v-if` 指令判断是否正在加载数据。 在 `mounted` 钩子函数中,我们首先加载第一页数据。 在 `loadData` 方法中,我们先将 `loading` 标记为 `true`,表示正在加载数据。然后使用 `setTimeout` 模拟异步请求数据,并在加载完成后将数据添加到 `productList` 中。最后将 `loading` 标记为 `false`,表示加载完成。同时,更新 `pageNum` 的值,以便下一次加载更多数据。 在组件中使用 `v-infinite-scroll` 指令,指定 `loadData` 方法。当滚动到底部时,`loadData` 方法会自动触发。 ```html <template> <div class="product-list" v-infinite-scroll="loadData"> <div v-for="(product, index) in productList" :key="index">{{product.name}}</div> <div v-if="loading">加载中...</div> </div> </template> ``` 这样,当用户滚动到页面底部时,就会自动加载更多数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值