首页 > 其他分享 >uniapp vue3 页面触底加载

uniapp vue3 页面触底加载

时间:2024-12-17 13:57:33浏览次数:8  
标签:uniapp const loadstatus value listData params vue3 page 加载

封装

hooks/useFetchList.js

import { ref } from "vue";
import { onReachBottom } from "@dcloudio/uni-app";

export function useFetchList(api, initialParams = {}) {
  const params = ref({ page: 1, page_size: 20 });
  const listData = ref([]);
  const isNoData = ref(false);
  const loadstatus = ref();

  onReachBottom(() => {
    fetchList(false);
  });

  async function fetchList(isReset = true) {
    if (isReset) {
      resetState();
    }

    if (isNoData.value) return;
    loadstatus.value = "loading";

    try {
      const response = await api({ ...params.value, ...initialParams });
      const { list, count } = response.data;
      listData.value = [...listData.value, ...list];
      if (list.length === params.value.page_size) {
        params.value.page += 1;
        loadstatus.value = "more";
      } else {
        isNoData.value = true;
        loadstatus.value = params.value.page == 1 && list.length == 0 ? "first-no-more" : "no-more";
      }
    } catch (error) {
      console.error("Failed", error);
    }

    try {
    } catch (error) {}
  }
  function resetState() {
    params.value.page = 1;
    listData.value = [];
    isNoData.value = false;
  }

  return {
    listData,
    loadstatus,
    fetchList,
  };
}

页面使用

pages/index.vue

<template>
<view>
 	<view v-for="(item, index) in listData" :key="item.id"></view>
     <noData :loadstatus="loadstatus"></noData>
   </view>
</template>
<script setup>
import { useFetchList } from "/hooks/useFetchList";
import { getList } from "/api/index";

const params = reactive({
});

const { listData, loadstatus, fetchList } = useFetchList(getList, params);

onLoad((opt) => {
  fetchList();
});
</script>

components/noData.vue

<template>
  <view>
    <view class="noData" v-if="loadstatus == 'first-no-more'">
      <image class="noData-img" src="/static/no-data.png" mode="" />
      <view class="cl_999 font-40 text-center">这里什么也没有~</view>
    </view>
    <uni-load-more :status="loadstatus" v-else></uni-load-more>
  </view>
</template>

<script setup>
const props = defineProps({
  loadstatus: {
    type: String,
    default: "",
  },
});
</script>

<style lang="scss" scoped>
.noData {
  padding-top: 200rpx;
  &-img {
    width: 544rpx;
    height: 412rpx;
    display: block;
    margin: 0 auto;
  }
}
</style>

api/index.js

//模拟请求
export const getList = (params) => () => {
  return new Promise((resolve, reject) => {
    resolve({
      code: 0,
      list: params.page == 3 ? [] : new Array(20).fill(null),
    });
  });
};

标签:uniapp,const,loadstatus,value,listData,params,vue3,page,加载
From: https://blog.csdn.net/kjlkmkl/article/details/144533603

相关文章

  • 《Vue3笔记》第05节:Vue3项目引入Axios插件实现网络通信
    这篇文章基于前一个小节的代码基础之上,介绍如何在Vue3项目中引入Axios插件实现网络通信的功能。Vue3项目开发(微信文章集合)1.1、安装依赖Axios是一款实现网络通信的插件,在前后的分离的项目中,要和后端接口进行数据通信,就可以采用Axios这个插件。首先安装Axios插件所需要的......
  • 鸿蒙Next数据懒加载LazyForEach用法总结
    在鸿蒙Next开发中,LazyForEach提供了高效的数据懒加载机制,适用于处理大量数据的列表展示等场景,可有效提升性能和内存管理。以下是其详细用法总结。一、使用限制容器组件要求:必须在特定容器组件(List、Grid、Swiper、WaterFlow)内使用,且这些组件支持配置cachedCount属性实现按需加......
  • 网站加载Waiting (TTFB)时间过长的原因是什么?如何解决?
    网站加载时出现的Waiting(TTFB)时间过长问题,主要指的是浏览器等待从服务器接收第一个字节数据的时间过长。TTFB是TimetoFirstByte的缩写,这个时间包括了服务器处理请求的时间和网络延迟等。以下是从前端开发角度,对TTFB时间过长的原因和解决办法的详细分析:一、原因网络延迟:如......
  • vue3/elementplus表格顶部固定高度计算
    1.表格标签<el-table:data="costList"border:height="tableHeight">2.具体实现consttableHeight=ref(500);constsettingsStore=useSettingsStore();//此方法精确计算表格高度,固定表格顶部用constcalculateTableHeight=()=>{constwindowH......
  • ecahrts双向渐变进度条从宽到窄【vue3】
    效果如图:父组件1.html代码<!--进度条组件--><ProgressBarclass="progress-bar"idEcharts="progress-bar-chart":chartsData="progressBarChartData"></ProgressBar>2.js代码//引入组件importProgressBarfrom......
  • node升级为22.*后,npm不可用,npm:无法加载文件
    错误信息如下: 一、打开终端: 二、此由本地策略组引发,可通过命令查看策略:Get-ExecutionPolicy-List如结果都显示Undefined,那代表没有设置安全策略   三、使用以下命令来更改执行策略为RemoteSigned并设置为作用于当前用户Set-ExecutionPolicy-scopeCurren......
  • uniapp 应用的生命周期、页面的生命周期、组件的生命周期
    uniapp作为一款跨平台的移动应用开发框架,其生命周期分为应用生命周期、页面生命周期和组件生命周期。下面分别介绍这三种生命周期的具体内容:应用生命周期应用生命周期仅适用于整个应用,在 App.vue 中可以监听到以下生命周期函数:onLaunch:当应用启动完成时触发,全局只触发一......
  • vue3开发中常见的代码错误或者其他相关问题小文章5.0
    41. 事件修饰符在组合式API中的使用错误示例:在组合式API中不正确地使用事件修饰符(如.prevent或.stop),导致事件处理逻辑失效。解决方案:确保在setup函数中正确使用事件修饰符。可以通过v-on的选项对象来添加修饰符。//在<scriptsetup>中import{ref}from'......
  • vue3项目构建流程
    1.项目包管理工具选择pnpmnpmi-gpnpm2.选择用vite管理项目注意node的版本需要16+,项目才能正常使用,在cmd中输入pnpmcreatevite命令,按照指示创建初始项目3.下载eslint项目代码校验执行pnpmieslint-D安装eslint依赖,然后执行命令npxeslint--init生成配置文件.eslint.cj......
  • 上拉加载和下拉刷新会遇到什么性能问题?
    上拉加载和下拉刷新在前端开发中确实可能会遇到一些性能问题。这些问题主要涉及到页面渲染、数据加载以及用户体验等方面。以下是对这些性能问题的详细分析:页面渲染性能问题:当用户进行上拉加载时,如果新加载的数据量较大,或者数据加载后需要进行的DOM操作较复杂,可能会导致页面......