​Electron-Vite + Vue 3​ 项目中实现流畅触底加载更多功能

 更新时间:2025年07月31日 11:38:05   作者:韶鹿先生  
本文介绍在Electron-Vite+Vue3项目中实现触底加载的两种方式:原生滚动监听和vue-infinite-loading库,下面给大家分享详细实现步骤,感兴趣的朋友一起看看吧

在 ​Electron-Vite + Vue 3​ 项目中实现触底加载更多(无限滚动)功能,可以通过监听滚动事件或使用现成的库(如 vue-infinite-loading)来完成。以下是详细实现步骤:

​方案一:原生滚动监听(推荐)​​

​1. 模板部分​

在需要触底加载的列表组件中,添加滚动监听:

<template>
  <div class="scroll-container" @scroll="handleScroll">
    <div v-for="item in items" :key="item.id">{{ item.content }}</div>
    <div v-if="loading" class="loading">加载中...</div>
    <div v-if="noMore" class="no-more">没有更多了</div>
  </div>
</template>

​2. 脚本部分​

<script setup>
import { ref, onMounted, onUnmounted } from 'vue';
const items = ref([]); // 数据列表
const page = ref(1);   // 当前页码
const loading = ref(false);
const noMore = ref(false);
// 模拟异步加载数据
const loadMore = async () => {
  if (loading.value || noMore.value) return;
  loading.value = true;
  try {
    // 替换为实际API请求
    const newItems = await fetchData(page.value);
    if (newItems.length === 0) {
      noMore.value = true;
    } else {
      items.value = [...items.value, ...newItems];
      page.value++;
    }
  } finally {
    loading.value = false;
  }
};
// 监听滚动事件
const handleScroll = (e) => {
  const { scrollTop, scrollHeight, clientHeight } = e.target;
  // 触底条件:距离底部 < 50px
  if (scrollHeight - (scrollTop + clientHeight) < 50) {
    loadMore();
  }
};
// 初始化加载
onMounted(() => {
  loadMore();
});
// 清理事件(如果绑定在window上)
onUnmounted(() => {
  window.removeEventListener('scroll', handleScroll);
});
</script>

​3. 样式部分​

<style scoped>
.scroll-container {
  height: 80vh; /* 固定高度触发滚动 */
  overflow-y: auto;
}
.loading, .no-more {
  text-align: center;
  padding: 10px;
}
</style>

​方案二:使用vue-infinite-loading库​

​1. 安装依赖​

npm install vue-infinite-loading@next

​2. 在组件中使用​

<template>
  <div>
    <div v-for="item in items" :key="item.id">{{ item.content }}</div>
    <InfiniteLoading @infinite="loadMore" :distance="100">
      <template #spinner>加载中...</template>
      <template #no-more>没有更多了</template>
    </InfiniteLoading>
  </div>
</template>
<script setup>
import { ref } from 'vue';
import InfiniteLoading from 'vue-infinite-loading';
const items = ref([]);
const page = ref(1);
const noMore = ref(false);
const loadMore = async ($state) => {
  try {
    const newItems = await fetchData(page.value);
    if (newItems.length === 0) {
      noMore.value = true;
      $state.complete();
    } else {
      items.value.push(...newItems);
      page.value++;
      $state.loaded();
    }
  } catch (err) {
    $state.error();
  }
};
</script>

​关键细节说明​

  • 触底条件计算
    • scrollHeight:内容总高度
    • scrollTop:已滚动高度
    • clientHeight:容器可视高度
    • 公式:scrollHeight - (scrollTop + clientHeight) < threshold
  • Electron 特殊处理
  • 如果内容在 <webview><iframe> 中,需在 ​主进程​ 中允许加载外部资源:
new BrowserWindow({
  webPreferences: {
    webSecurity: false // 允许跨域请求(开发环境)
  }
});
  • 性能优化
  • 使用 ​防抖​(lodash.debounce)避免频繁触发:
import { debounce } from 'lodash-es';
const handleScroll = debounce((e) => { ... }, 200);

​完整示例项目结构​

electron-vite-vue3-project/
├── src/
│   ├── main/           # Electron 主进程代码
│   ├── renderer/       # Vue 渲染进程代码
│   │   └── components/
│   │       └── InfiniteScroll.vue  # 触底加载组件
│   └── preload.js
└── vite.config.js

​常见问题​

  • Q:滚动事件不触发?​
    A:确保容器有固定高度和 overflow-y: auto
  • Q:数据重复加载?​
    A:检查 loadingnoMore 的状态锁。
  • Q:Electron 中跨域请求失败?​
    A:在主进程配置 webSecurity: false(仅限开发环境)。

通过以上方法,可以轻松在 Electron-Vite + Vue 3 中实现流畅的触底加载效果!

到此这篇关于​Electron-Vite + Vue 3​ 项目中实现触底加载更多的文章就介绍到这了,更多相关vue触底加载更多内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue路由传参-如何使用encodeURI加密参数

    vue路由传参-如何使用encodeURI加密参数

    这篇文章主要介绍了vue路由传参-如何使用encodeURI加密参数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Vue.js最佳实践(五招助你成为vuejs大师)

    Vue.js最佳实践(五招助你成为vuejs大师)

    这篇文章主要介绍了Vue.js最佳实践,本文主要面向对象是有一定vue.js 编辑经验的开发者,需要的朋友可以参考下
    2018-05-05
  • 利用Vue实现一个累加向上漂浮动画

    利用Vue实现一个累加向上漂浮动画

    在不久之前,看到一个比较有意思的小程序,就是静神木鱼,可以实现在线敲木鱼,自动敲木鱼,手盘佛珠,静心颂钵的,下面就来揭秘如何实现这个小程序中敲木鱼的累加向上漂浮动画,需要的可以参考一下
    2022-11-11
  • vue-router 路由传参问题(路由传参方式)

    vue-router 路由传参问题(路由传参方式)

    路由传参主要有两种方式一种是路径传参一种是参数传递,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • 解析Vue2 dist 目录下各个文件的区别

    解析Vue2 dist 目录下各个文件的区别

    本篇文章主要介绍了解析Vue2 dist 目录下各个文件的区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 在 Vue 中使用 dhtmlxGantt 组件时遇到的问题汇总(推荐)

    在 Vue 中使用 dhtmlxGantt 组件时遇到的问题汇总(推荐)

    dhtmlxGantt一个功能丰富的甘特图插件,支持任务编辑,资源分配和多种视图模式,这篇文章主要介绍了在 Vue 中使用 dhtmlxGantt 组件时遇到的问题汇总,需要的朋友可以参考下
    2023-03-03
  • vue的三种图片引入方式代码实例

    vue的三种图片引入方式代码实例

    这篇文章主要介绍了vue的三种图片引入方式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • vue使用混入定义全局变量、函数、筛选器的实例代码

    vue使用混入定义全局变量、函数、筛选器的实例代码

    本文主要是给大家分享利用混入mixins来实现全局变量和函数。这种方法优点是ide会有方法、变量、筛选器提示。对vue中 利用混入定义全局变量、函数、筛选器的相关知识感兴趣的朋友,跟随小编一起看看吧
    2019-07-07
  • vuex存取值和映射函数使用说明

    vuex存取值和映射函数使用说明

    这篇文章主要介绍了vuex存取值和映射函数使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue data引入本地图片的两种方式小结

    vue data引入本地图片的两种方式小结

    今天小编就为大家分享一篇vue data引入本地图片的两种方式小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11

最新评论