element ui 虚拟滚动 滚动到底部加载下一页

引入element ui的InfiniteScroll 无限滚动插件

javascript 复制代码
<div class="news-left">
    <div class="infinite-list-wrapper" style="overflow:auto;height: 70vh">
        <ul class="list" v-infinite-scroll="load">
            <li :class="isActive !== index ? 'media-list' : 'media-active'" @click="newsClick(index, item)"
                v-for="(item, index) in mediumList" :key="index">
                <div class="media-item">
                    <div class="media-title" :title="item.title">
                        {{ item.title }}
                    </div>
                </div>
                <div :class="isActive !== index ? '' : 'media-left-sharp'"
                    v-if="isActive == index ? true : false"></div>
            </li>
        </ul>

        <p v-if="loading" class="news-tip">加载中...</p>
        <p v-if="noMore" class="news-tip">没有更多了</p>
    </div>
</div>

滚动到最底部的时候调用接口,判断是否大于总数,大于则不调用接口

javascript 复制代码
      //滚动到最底部加载下一页
      load() {
        if (this.count <= this.total - 1 && !this.loading) {
          this.page += 1
          this.count += 10
          this.getNewsListData()
        } else {
          this.loading = false
        }
      },

完整代码

javascript 复制代码
<template>
    <Modal v-model="showModal" :closable="false" width="80%" class="modal-news">
      <div slot="header" style="margin-top: 2vh">
        <i class="modal-close" @click="closeModal"></i>
        <div>{{ modalName }}</div>
      </div>
      <div class="news">
        <div class="news-left">
          <div class="infinite-list-wrapper" style="overflow:auto;height: 70vh">
            <ul class="list" v-infinite-scroll="load">
              <li :class="isActive !== index ? 'media-list' : 'media-active'" @click="newsClick(index, item)"
                v-for="(item, index) in mediumList" :key="index">
                <div class="media-item">
                  <div class="media-title" :title="item.title">
                    {{ item.title }}
                  </div>
                </div>
                <div :class="isActive !== index ? '' : 'media-left-sharp'" v-if="isActive == index ? true : false"></div>
              </li>
            </ul>
  
            <p v-if="loading" class="news-tip">加载中...</p>
            <p v-if="noMore" class="news-tip">没有更多了</p>
          </div>
        </div>
        <div class="news-right">
          <div class="platform-right-content">
            <vuescroll :ops="ops" style="margin-top: 0.5vh">
              <div style="height: 60vh">
                <div class="modal-wrap" v-html="selected.content"></div>
              </div>
            </vuescroll>
          </div>
        </div>
      </div>
      <div slot="footer"></div>
    </Modal>
  </template>
  
  <script>
  import vuescroll from "vuescroll";
  import {
    getNewsList
  } from "@/api/serviceSupport";
  import { getPolicyNewsList } from "@/api/platform/fillData.js";
  
  export default {
    components: {
      vuescroll,
    },
    props: {
      total: {
        type: Number,
        default: 10
      },
    },
    data() {
      return {
        reqType: '',
        count: 0,
        loading: false,
        showModal: false,
        modalName: "",
        isActive: 0,
        selected: {},
        mediumList: [],
        page: 1,
        pageSize: 10,
        newsType: '',
        checkState: "",
        ops: {
          vuescroll: {},
          scrollPanel: {
            scrollingX: false,
          },
          rail: {
            keepShow: true,
          },
          bar: {
            hoverStyle: true,
            onlyShowBarOnScroll: false, //是否只有滚动的时候才显示滚动条
            background: "#ccc", //滚动条颜色
            opacity: 0.5, //滚动条透明度
          },
        },
      };
    },
    computed: {
      noMore() {
        return this.count >= this.total
      },
    },
    mounted() {
      console.log(this.total);
    },
    methods: {
      showModalAction(list, index, title) {
        this.showModal = true;
        this.modalName = title;
        this.mediumList = list;
        this.isActive = index || 0;
        this.modalName = title
        this.selected = list[this.isActive];
        this.count = this.mediumList.length
        this.page = 1
      },
      //设置接口调用的参数
      setData(newsType, checkState, reqType) {
        this.newsType = newsType;
        this.checkState = checkState;
        this.reqType = reqType;
      },
      closeModal() {
        this.showModal = false;
      },
      //滚动到最底部加载下一页
      load() {
        if (this.count <= this.total - 1 && !this.loading) {
          this.page += 1
          this.count += 10
          this.getNewsListData()
        } else {
          this.loading = false
        }
      },
      newsClick(index, item) {
        this.isActive = index;
        this.selected = item;
      },
      async getNewsListData() {
        this.loading = true
        var that = this;
        const { data } = await getNewsList({
          newsType: this.newsType,
          checkState: this.checkState,
          page: this.page,
          pageSize: this.pageSize,
        });
        this.loading = false
        if (data && data.records.length > 0) {
          data.records.map((p) => {
            that.mediumList.push({
              time: p.publishTime && p.publishTime.substring(0, 10),
              title: (p.title && p.title) || "",
              newsSourceStr: p.newsSourceStr && p.newsSourceStr,
            });
          });
        }
      },
    },
  };
  </script>
  
  <style lang="less" scoped>
  .modal-news {
    .news-tip {
      color: #fff;
      text-align: center;
      margin: 0.3rem;
    }
  
    .modal-title {
      width: 100%;
      display: flex;
      justify-content: space-between;
      align-items: center;
      padding: 0.2rem 0.5rem;
  
      .title-bj {
        max-width: 90%;
        min-width: 50%;
        height: 4vh;
        display: flex;
        align-items: center;
  
        .title-logo {
          width: 8px;
          height: 8px;
          background: #f8de90;
          box-shadow: 0px 0px 17px 2px rgba(255, 104, 0, 0.95);
          margin-right: 0.3rem;
        }
  
        p {
          font-size: 0.5rem;
          font-family: YouSheBiaoTiHei, YouSheBiaoTiHei-Regular;
          font-weight: 400;
          color: #ffffff;
          cursor: pointer;
        }
      }
    }

  }
  
  .news {
    display: flex;
    height: 72vh;
    padding: 0 0.5rem;
  
    .news-left {
      width: 25%;
      height: 100%;
      overflow: hidden;
    }
  
    .news-right {
      width: 75%;
      margin-left: 2%;
      height: 100%;
    }
  }
  

  </style>
  
相关推荐
m0_548514772 分钟前
前端Pako.js 压缩解压库 与 Java 的 zlib 压缩与解压 的互通实现
java·前端·javascript
AndrewPerfect3 分钟前
xss csrf怎么预防?
前端·xss·csrf
Calm5506 分钟前
Vue3:uv-upload图片上传
前端·vue.js
浮游本尊10 分钟前
Nginx配置:如何在一个域名下运行两个网站
前端·javascript
m0_7482398310 分钟前
前端bug调试
前端·bug
m0_7482329213 分钟前
[项目][boost搜索引擎#4] cpp-httplib使用 log.hpp 前端 测试及总结
前端·搜索引擎
新中地GIS开发老师18 分钟前
《Vue进阶教程》(12)ref的实现详细教程
前端·javascript·vue.js·arcgis·前端框架·地理信息科学·地信
m0_7482495421 分钟前
前端:base64的作用
前端
html组态27 分钟前
web组态可视化编辑器
前端·物联网·编辑器·web组态·组态·组态软件
~央千澈~34 分钟前
如果你的网站是h5网站,如何将h5网站变成小程序-除开完整重做方法如何快速h5转小程序-h5网站转小程序的办法-优雅草央千澈
前端·apache