vue3.0 实现列表无线滚动Infinite Scroll———elementPlus

一、无限滚动组件指令详情

 1、v-infinite-scroll="handleInfiniteScroll" //handleInfiniteScroll无限滚动加载的方法,获取数据
 2、infinite-scroll-disabled //是否禁用无限滚动加载 默认是false
 3、infinite-scroll-delay //节流时延,单位为ms  默认200
 4、infinite-scroll-distance //触发加载的距离阈值,单位为px
 5、infinite-scroll-immediate //是否立即执行加载方法,以防初始状态下内容无法撑满容器。
 //默认情况下,infinite-scroll-disabled是false,因此如果组件使用无限滚动加载组件,即使在vue不进行加载方法的调用,组件也会调用该方法,因此如果需要控制的话,尽量是使用infinite-scroll-disabled属性来进行加载方法是否调用的控制。

二、注意点
**1.在使用的时候要给外部大盒子加个overflow: auto;**不然会疯狂报错
在这里插入图片描述
2.在指令使用的div一定要限定高度(height:xxx; overflow-y:auto)handleInfiniteScroll加载方法将在拉取底部时才会被执行。

三、代码demo演示

<template>
  <div class="fire_warning_root">
    <div class="fire_warn_title">
      <p>预警类型</p>
      <p>上报来源</p>
      <p>日期</p>
      <p>地名</p>
      <p>坐标</p>
      <p>状态</p>
    </div>
    <div class="infinite-list-wrapper" style="overflow: auto">
      <ul
        v-infinite-scroll="handleInfiniteScroll"
        class="list"
        :infinite-scroll-disabled="disabled"
      >
        <li
          v-for="item in count"
          :key="item.id"
          class="list-item"
          @click="handleFirePoint3D(item)"
          :style="{
            background: activeItem.id === item.id ? '#fef0f0' : '',
            color: activeItem.id === item.id ? '#f56c6c' : '',
          }"
        >
          <p>
            {{
              item.fireAlarmType == 1
                ? "巡护事件"
                : item.fireAlarmType == 2
                ? "群众上报"
                : item.fireAlarmType == 3
                ? "云台预警"
                : "卫星预警"
            }}
          </p>
          <p>{{ item.reportingSource }}</p>
          <p>{{ item.reportDate }}</p>
          <p>{{ item.address }}</p>
          <p>{{ item.longitude }}&nbsp;{{ item.latitude }}</p>
          <p>
            {{
              item.state == 0 ? "待处理 " : item.state == 1 ? "已处理" : "其他"
            }}
          </p>
        </li>
      </ul>
      <p v-if="loading">加载中...</p>
      <p v-if="noMore">暂无</p>
    </div>
  </div>
</template>
<script setup name="FireWarning">
import { fireWarningHistorical } from "@/apis/map-fire-warning";

import { computed, ref, reactive, onMounted, toRefs, watch } from "vue";


// 状态管理依赖
import { useStore } from "vuex";


const props = defineProps({
  activeChecked: {
    type: Number,
  },
});

const { activeChecked } = toRefs(props);
const emit = defineEmits(["handleActiveInfo"]);


const count = ref([]);
const loading = ref(false);
const noMore = computed(() => count.value.length >= 9999);
const disabled = computed(() => loading.value || noMore.value);

const activeItem = ref({});
const state = reactive({
  size: 3,
  current: 1,
});
const handleInfiniteScroll= () => {
  loading.value = true;
  setTimeout(() => {
    state.current += 1;
    lookFireWarning();
  }, 2000);
};


/*
 *@description: 查看火情预警
 *@param: {}
 *@return:{}
 */
const lookFireWarning = async () => {
  let para = {
    current: state.current,
    size: state.size,
  };
  const [err, data] = await fireWarningHistorical({
    type: activeChecked.value,
    ...para,
  });
  loading.value = false;

  // 把每一次滚动加载请求的数据push的routeData数组
  let list = data.records;
  for (let i = 0; i < list.length; i++) {
    count.value.push(list[i]);
  }
  loading.value = false;
};

const handleFirePoint3D = (item) => {
  activeItem.value = item;

};

onMounted(() => {
  lookFireWarning();
});
</script>
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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> ``` 这样,当用户滚动到页面底部时,就会自动加载更多数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值