【uniapp】实现触底加载数据

前言:实现界面触底数据加载。后端接口得支持翻页传参(本案例使用django)

1、后端接口 

1.1 封装翻页公共方法standardPagination.py

# -*- coding: utf-8 -*-
# @Time    : 2024/10/15 13:15
# @Author  : super
# @File    : standardPagination.py
# @Software: PyCharm
# @Describe:from rest_framework.pagination import PageNumberPagination
# 定义分页类,可以自定义每页显示的记录数
class StandardResultsSetPagination(PageNumberPagination):page_size = 10  # 每页显示的记录数,可以根据需要调整page_size_query_param = 'page_size'  # 允许客户端通过此参数指定每页显示的记录数max_page_size = 100  # 最大每页显示的记录数,防止客户端请求过多数据

1.2 views代码

支持按标题进行查询

class HonorExperienceSet(ModelViewSet):queryset = HonorExperience.objects.all().order_by('-date_earned','-create_time')serializer_class = HonorExperienceSerializerpagination_class = StandardResultsSetPagination  # 设置分页类def get_queryset(self):queryset = super().get_queryset()title = self.request.query_params.get('title', None)if title is not None:queryset = queryset.filter(title__icontains=title)return queryset

 2、uniapp方法

2.1 页面支持数据查询 

页面可进行查询,然后导入onReachBottom

<template>
<view class="pageBg" ><view class="header"><!-- 搜索框 --><input type="text" v-model="searchQuery" placeholder="搜索荣誉标题" class="search-input" /><!-- 确定按钮 --><button @click="searchHonor" class="search-button"><image src="/static/images/honorWall/ss.png" class="search-icon" /></button><!-- 新增按钮 --><navigator url="/pages/addHonor/addHonor"><button class="add-button"><image src="/static/images/honorWall/add.png" class="add-icon" /></button></navigator></view><!-- 列表展示 --><view v-if="honorList.length > 0" class="honor-list"><view v-for="(item,index) in honorList" :key="item.id"  class="honor-item"><text>{{ index + 1 }}</text>  <text>{{ item.type_display }}</text><text>{{ item.title }}</text><text>{{ formatDate(item.date_earned) }}</text></view></view>  <!-- 无数据时的占位提示 --><view v-else class="no-data"><text>暂无荣誉数据</text></view></view>
</template><script setup>
import { api } from '../../config/settings';
import { ref, onMounted, watch } from 'vue';
import {onReachBottom} from '@dcloudio/uni-app';
import {apiFetchHonorData} from '@/api/apis.js';
import { useRouter } from 'vue-router';// 定义存储荣誉数据的变量
const honorList = ref([]);// 查询条件
const searchQuery = ref('');
// 定义请求参数,title 参数如果没有提供,默认为 null
const params = ref({title: '', // 不传 title 参数时,接口将不过滤 titlepage: 1,   // 页码page_size: 20 // 每页显示的记录数
});// 格式化日期的方法
const formatDate = (dateStr) => {const date = new Date(dateStr);return `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`;
};// 默认查询
const fetchHonorData = async () => {  // console.log(params);try {  const res = await apiFetchHonorData(params.value); // 初始加载时不带查询条件  honorList.value = res.data.results || []; // 确保即使响应中没有 data 字段,honorList 也是一个数组  } catch (error) {  console.error('组件挂载时获取荣誉数据失败:', error);  // 可以选择在这里处理错误,比如显示一个错误消息  }  
}
//挂载时执行默认查询
onMounted(fetchHonorData);  
//  搜索查询 
const searchHonor = async () => {// 更新 params 的 title 值params.value.title = searchQuery.value;// console.log(params.value);try {  const res = await apiFetchHonorData(params.value);  honorList.value = res.data.results  || []; // 更新荣誉列表 } catch (error) {  console.error('搜索荣誉数据时失败:', error);  // 可以选择在这里处理错误,比如显示一个错误消息或重置查询框  }  
};  onReachBottom(()=>{	console.log("sss")
})</script><style lang="scss" scoped>
.header {display: flex;justify-content: space-between;align-items: center;// margin-bottom: 5px;
}.search-input {flex-grow: 1;padding: 10px;border: 1px solid #ddd;border-radius: 5px;
}.search-button {display: flex;align-items: center;color: white;border: none;border-radius: 5px;padding: 10px;cursor: pointer;
}.search-icon {width: 24px;height: 24px;
}.add-button {display: flex;align-items: center;color: white;border: none;border-radius: 5px;padding: 10px;cursor: pointer;
}.add-icon {width: 24px;height: 24px;
}.honor-list {padding: 5px;
}// .honor-item {
//   display: flex;
//   justify-content: space-between;
//   border-bottom: 1px solid #ddd;
//   padding: 10px 0;
// }
.honor-item {  display: flex;  align-items: center; // 确保所有子元素垂直居中  border-bottom: 1px solid #ddd;  padding: 10px 0;  
}  .honor-item > text:nth-child(1) { // 序号列  width: 40px; // 固定宽度  text-align: center;  
}  .honor-item > text:nth-child(2) { // 类型显示列  width: 60px; // 根据内容调整或固定宽度  text-align: left; // 或根据需求调整  
}  .honor-item > text:nth-child(3) { // 标题列  flex-grow: 1; // 填充剩余空间  min-width: 0; // 允许收缩到内容的最小宽度  white-space: nowrap; // 防止文本换行  overflow: hidden; // 隐藏溢出内容  text-overflow: ellipsis; // 使用省略号表示溢出文本  margin: 0 10px; // 可选:增加左右间距以改善可读性 }  .honor-item > text:nth-child(4) { // 日期列  width: 120px; // 固定宽度  text-align: right; // 根据需求调整  
}.no-data {text-align: center;padding: 20px;color: #999;
}
</style>

2.2 添加实现触底翻页查询

onReachBottom(()=>{params.value.page++;fetchHonorData();console.log("sss")
})

2.3 实现数据触底拼接

honorList.value = [...honorList.value, ...res.data.results] || []; // 更新荣誉列表 

2.4 解决数据加载完毕还执行查询问题

//定义获取不到数据的处理
const noDate = ref(false)#此位置加入如下代码honorList.value = [...honorList.value, ...res.data.results] || []; // 确保即使响应中没有 data 字段,honorList 也是一个数组  if(params.value.page_size > res.data.results.length) noDate.value = true;# 加判断
onReachBottom(()=>{if(noDate.value) return;params.value.page++;fetchHonorData();console.log("sss")
})

2.5 完整代码

<template>
<view class="pageBg" ><view class="header"><!-- 搜索框 --><input type="text" v-model="searchQuery" placeholder="搜索荣誉标题" class="search-input" /><!-- 确定按钮 --><button @click="searchHonor" class="search-button"><image src="/static/images/honorWall/ss.png" class="search-icon" /></button><!-- 新增按钮 --><navigator url="/pages/addHonor/addHonor"><button class="add-button"><image src="/static/images/honorWall/add.png" class="add-icon" /></button></navigator></view><!-- 列表展示 --><view v-if="honorList.length > 0" class="honor-list"><view v-for="(item,index) in honorList" :key="item.id"  class="honor-item"><text>{{ index + 1 }}</text>  <text>{{ item.type_display }}</text><text>{{ item.title }}</text><text>{{ formatDate(item.date_earned) }}</text></view></view>  <!-- 无数据时的占位提示 --><view v-else class="no-data"><text>暂无荣誉数据</text></view></view>
</template><script setup>
import { api } from '../../config/settings';
import { ref, onMounted, watch } from 'vue';
import {onReachBottom} from '@dcloudio/uni-app';
import {apiFetchHonorData} from '@/api/apis.js';
import { useRouter } from 'vue-router';//定义获取不到数据的处理
const noDate = ref(false)
// 定义存储荣誉数据的变量
const honorList = ref([]);// 查询条件
const searchQuery = ref('');
// 定义请求参数,title 参数如果没有提供,默认为 null
const params = ref({title: '', // 不传 title 参数时,接口将不过滤 titlepage: 1,   // 页码page_size: 20 // 每页显示的记录数
});// 格式化日期的方法
const formatDate = (dateStr) => {const date = new Date(dateStr);return `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`;
};// 默认查询
const fetchHonorData = async () => {  // console.log(params);try {  const res = await apiFetchHonorData(params.value); // 初始加载时不带查询条件  honorList.value = [...honorList.value, ...res.data.results] || []; // 确保即使响应中没有 data 字段,honorList 也是一个数组  if(params.value.page_size > res.data.results.length) noDate.value = true;} catch (error) {  console.error('组件挂载时获取荣誉数据失败:', error);  // 可以选择在这里处理错误,比如显示一个错误消息  }  
}
//挂载时执行默认查询
onMounted(fetchHonorData);  
//  搜索查询 
const searchHonor = async () => {// 更新 params 的 title 值params.value.title = searchQuery.value;// console.log(params.value);try {  const res = await apiFetchHonorData(params.value);  honorList.value = [...honorList.value, ...res.data.results] || []; // 更新荣誉列表 if(params.value.page_size > res.data.results.length) noDate.value = true;} catch (error) {  console.error('搜索荣誉数据时失败:', error);  // 可以选择在这里处理错误,比如显示一个错误消息或重置查询框  }  
};  onReachBottom(()=>{if(noDate.value) return;params.value.page++;fetchHonorData();console.log("sss")
})</script><style lang="scss" scoped>
.header {display: flex;justify-content: space-between;align-items: center;// margin-bottom: 5px;
}.search-input {flex-grow: 1;padding: 10px;border: 1px solid #ddd;border-radius: 5px;
}.search-button {display: flex;align-items: center;color: white;border: none;border-radius: 5px;padding: 10px;cursor: pointer;
}.search-icon {width: 24px;height: 24px;
}.add-button {display: flex;align-items: center;color: white;border: none;border-radius: 5px;padding: 10px;cursor: pointer;
}.add-icon {width: 24px;height: 24px;
}.honor-list {padding: 5px;
}// .honor-item {
//   display: flex;
//   justify-content: space-between;
//   border-bottom: 1px solid #ddd;
//   padding: 10px 0;
// }
.honor-item {  display: flex;  align-items: center; // 确保所有子元素垂直居中  border-bottom: 1px solid #ddd;  padding: 10px 0;  
}  .honor-item > text:nth-child(1) { // 序号列  width: 40px; // 固定宽度  text-align: center;  
}  .honor-item > text:nth-child(2) { // 类型显示列  width: 60px; // 根据内容调整或固定宽度  text-align: left; // 或根据需求调整  
}  .honor-item > text:nth-child(3) { // 标题列  flex-grow: 1; // 填充剩余空间  min-width: 0; // 允许收缩到内容的最小宽度  white-space: nowrap; // 防止文本换行  overflow: hidden; // 隐藏溢出内容  text-overflow: ellipsis; // 使用省略号表示溢出文本  margin: 0 10px; // 可选:增加左右间距以改善可读性 }  .honor-item > text:nth-child(4) { // 日期列  width: 120px; // 固定宽度  text-align: right; // 根据需求调整  
}.no-data {text-align: center;padding: 20px;color: #999;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55390.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全托自闭症教育,关注孩子每个细节

原文文章&#xff1a;http://www.zibizhengwang.com/page37.html 自闭症&#xff0c;这一复杂的神经发育障碍&#xff0c;影响着无数孩子的成长与未来。然而&#xff0c;在广州&#xff0c;有一座特别的灯塔——星贝育园自闭症儿童寄宿制学校&#xff0c;它不仅照亮了自闭症儿…

SpringBoot使用esayExcel根据模板导出excel

1、依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.3</version></dependency> 2、模板 3、实体类 package com.skybird.iot.addons.productionManagement.qualityTesting…

配置MAC地址安全

概述 MAC地址安全配置是确保网络设备和通信安全的重要措施&#xff0c;通过限制、监控和管理设备的物理地址来防止未授权访问和潜在的网络威胁。以下是对MAC地址安全的概述&#xff1a; 基本概念 定义&#xff1a;MAC地址&#xff08;Media Access Control Address&#xff09…

Jenkins整合Docker实现CICD自动化部署(若依项目)

前期准备 提前准备好jenkins环境 并且jenkins能使用docker命令&#xff0c;并且已经配置好了jdk、node、maven环境&#xff0c;我之前写了安装jenkins的博客&#xff0c;里面讲得比较详细&#xff0c;推荐用我这种方式安装 docker安装jenkins&#xff0c;并配置jdk、node和m…

CEP 复杂事件处理引擎进阶:股票中高频 CTA 策略实现与并行回测

在 CEP 复杂事件处理引擎入门&#xff1a;初级高频量价因子策略的实现 中&#xff0c;我们详细介绍了 CEP 引擎和它的一些关键概念&#xff0c;如复杂事件和事件监听器等。随后又通过两个初级的 CEP 引擎使用案例介绍了创建并运行一个最简单结构的 CEP 引擎所需的步骤和模块&am…

骨传导耳机哪个牌子最好?五大高口碑骨传导耳机揭秘!

骨传导耳机作为一种创新的音频设备&#xff0c;通过振动头骨直接将声音传递到内耳&#xff0c;不仅为用户提供了全新的听音体验&#xff0c;还能在保持环境音的情况下享受音乐&#xff0c;特别适合户外运动和日常通勤。然而&#xff0c;在众多品牌和型号中选择最适合自己的骨传…

人工智能正在扼杀云计算的可持续性

可持续性曾是公共云计算中备受推崇的优势。企业和云提供商大肆宣扬他们的绿色计划&#xff0c;推广采用可再生能源的数据中心&#xff0c;以减少碳足迹。 近几个月来&#xff0c;这个话题已悄然淡出人们的视线。罪魁祸首是什么&#xff1f;对人工智能功能的无限需求正在推动云…

为何云渲染成为3D设计的首选?效率解析

在3D设计领域&#xff0c;建模和渲染是两个不可或缺的步骤。3D建模软件如3ds Max让设计师能够创造出精美的三维模型&#xff0c;而渲染则是将这些模型转化为逼真图像或动画的过程。 渲染的重要性在于&#xff0c;它能够直观地展示设计的最终效果&#xff0c;使得设计师能够及时…

MongoDB未授权访问

mongodb未授权访问漏洞 复现 MongoDB[//]: # (忙够DB)是一种流行的开源文档数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;基于分布式文件存储的数据库属于NoSQL数据库的一种。 开启MongoDB服务时不添加任何参数时,默认是没有权限验证的 登录的用户可以通过默认端口…

基于Java微信小程序的高校教务管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

自动化工具:Ansible

目录 一、运维自动化工具有哪些 二、Ansible 概述 1、Ansible 概念 2、Ansible 特点 3、Ansible 工作流程 三、安装部署Ansible 1、环境部署 2、管理节点安装 Ansible 3、查看Ansible相关文件 4、配置主机清单 5、免密管理 ssh-keygen 5.1、测试连通性 5.2、简洁输…

禹神TypeScript课程记录

TypeScript与JavaScript的关系 TypeScript是一个基于JavaScript的扩展语言TypeScript包含了JavaScript的所有内容TypeScript增加了&#xff1a;静态类型检查、接口、泛型等很多现代开发特性&#xff0c;更适合大型项目。TypeScript需要编译为JavaScript&#xff0c;然后才能在浏…

【优选算法篇】编织算法的流动诗篇:滑动窗口的轻盈之美

文章目录 C 滑动窗口详解&#xff1a;基础题解与思维分析前言第一章&#xff1a;热身练习1.1 长度最小的子数组解法一&#xff08;暴力求解&#xff09;解法二&#xff08;滑动窗口&#xff09;滑动窗口的核心思想图解分析滑动窗口的有效性时间复杂度分析易错点提示 1.2 无重复…

vue3基础入门以及常用api使用

setup setup 的返回值可以是函数 data(){ return { a:111, c:this.name } }, setup(){ let name 1111 return ()> 哈哈哈 }//结果页面就是会显示 哈哈哈setup和 OptionsAPI关系 data能和setup能同时存在&#xff0c;但不建议 data能读到setup里边的数据 setup是最早的生命…

Java基础06-常用API

六、常用API API &#xff1a;应用程序编程接口 1、Object 作用&#xff1a;Object类是Java中所有类的祖宗类&#xff0c;因此&#xff0c;Java中所有类的对象都可以直接使用0bject类中提供的一些方法。 方法名说明toString()返回字符串数据equals(Object o)比较两个对象地址是…

使用 Docker-compose 部署达梦 DM 数据库

目录 1. 获取达梦 DM8 Docker 镜像并上传到 Harbor 服务器 2. Docker-compose 部署达梦 DM8 数据库 3. 配置 dm.ini 文件 4.完整的 dm.ini 文件 最近&#xff0c;将 MySQL 数据库迁移到了达梦 DM8 数据库。本文将分享如何通过 Docker-compose 部署达梦 DM8 数据库的过程&am…

ARM(5)内存管理单元MMU

一、虚拟地址和物理地址 首先&#xff0c;计算机系统的内存被组成一个由M个连续的字节大小组成的数组。每字节都会有一个唯一的物理地址。CPU访问内存最简单的方式就是使用物理地址。如下图&#xff1a; 图 1 物理地址,物理寻址 而现在都是采用的都是虚拟寻址的方法。CPU生成一…

gitlab保护分支设置

版本&#xff1a;gitlab10.2.2 一旦设置master分支被保护&#xff0c;除了管理员之外的任何用户都无法直接向master提交代码&#xff0c;只要提交代码就会报错 # git push -u origin master Total 0 (delta 0), reused 0 (delta 0) remote: GitLab: You are not allowed to pu…

在CentOS系统下实现准实时SFTP上传指定目录下前2分钟的文件

在CentOS系统下实现准实时SFTP上传指定目录下前2分钟的文件 引言准备工作编写Shell脚本执行脚本定时执行脚本注意事项结论引言 在企业级的文件同步和备份场景中,经常需要将本地目录中最新生成的文件(如前2分钟内生成的文件)快速上传到远程服务器的指定目录。为了实现这一目…

unity 屏幕波动反馈打击效果(附资源下载)

unity 屏幕波动反馈打击效果 一枪打出去整个屏幕都回波动的效果反馈。 知识点&#xff1a; 1、动画事件 2、屏幕后处理 效果如图&#xff1a;&#xff08;波动速度浮动都可调整&#xff09; 附件下载