【uniapp】uniapp+uview-ui+mixins实现搜索+上拉加载+加载动画功能:

文章目录


一、效果图:
二、实现过程:
1、安装和引入uview-ui:

首先:

javascript 复制代码
//若不存在package.ison文件则需要先npm init -y生成,再下面的代码。
npm install uview-ui

其次:main.js和pages.json文件中引入

javascript 复制代码
import uView from "uview-ui";
Vue.use(uView);
javascript 复制代码
"easycom": {
	"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
},
2、index.vue
javascript 复制代码
<template>
	<view class="regionalregulation_contanier" ref="listContent">
		<!-- 查询条件部分 -->
		<u-sticky>
			<view style="padding: 20rpx;background-color: #fff;border-bottom: 1px solid #dfe2e5;">
				<u-search v-model="queryModel.keyworld" @search="getDataList(true)" @clear="getDataList(true)" />
			</view>
		</u-sticky>

		<!-- 查询结果部分 -->
		<template v-if="loadingPage">
			<u-loading-page loading loading-text="正在加载中..." />
		</template>
		<template v-else>
			<view class="content_list" v-if="tableData.length">
				<scroll-view :scroll-y="true" :scroll-top="0">
					<view class="content" v-for="(item,index) in tableData" :key="index" @click="handleClick(item,index)">
						<text>{{Number(index)+1}}</text>
					</view>
					<u-loadmore :status="loadingStatus" v-if="isLoadingMore" @loadmore="getDataList" />
				</scroll-view>
				<u-back-top :scroll-top="scrollTop" />
			</view>
			<view class="content_list" v-else>
				<u-empty mode="data" icon="../../static/nodata.jfif" text="暂无数据" />
			</view>
		</template>
	</view>
</template>


<script>
	//引入实现搜索+上拉加载+加载动画功能的混入减少该相同界面代码量
	import { ListMixin } from "@/utils/mixins/listMixins" 

	export default {
		mixins: [ListMixin],
		components: {},
		data() {
			return {
				apiUrl: { //存储交易接口
					list: "",
					add: "",
					edit: "",
					delete: "",
				},
			}
		},
		onLoad() {

		},
		methods: {

		},
	}
</script>


<style lang="scss" scoped>
	.regionalregulation_contanier {
		width: 100%;
		height: 100%;
		display: flex;
		flex-direction: column;

		.content_list {
			min-height: 0;
			flex: 1;
			overflow-y: auto;
			padding: 0rpx 20rpx;
			margin-top: 10rpx;
			box-sizing: border-box;
			display: flex;
			flex-direction: column;
			justify-content: center;
			align-content: center;
			box-sizing: border-box;

			uni-scroll-view {
				height: 100%;

				.content {
					height: 400rpx;
					padding: 10rpx;
					margin-bottom: 10rpx;
					box-shadow: inset 0 0 20rpx rgba(0, 0, 0, 0.2);
					border-radius: 10rpx;
					box-sizing: border-box;
				}
			}
		}
	}
</style>
3、listMixins.js (建议有公共人员维护)
javascript 复制代码
/**
* 1、该混入聚成了搜索+上拉加载+加载动画功能一些公共功能,可以减少代码量
* 2、优点:适用于项目人数少且时间紧;减少交易字段的命名提高交易可维护性
* 3、缺点:维护较难,需要先理清混入字段与交易字段
* 4、不需要混入的交易可以将混入的代码丢到index.vue
*/
import Vue from 'vue'

export const ListMixin = {
	data() {
		return {
			queryModel: {}, //查询条件
			page: { //查询条件分页信息
				pageNum: 1,
				pageSize: 10,
			},
			loadingPage: true, //页面加载动画-展示骨架屏
			tableData: [], //查询结果
			isLoadingMore: false, //是否展示加载动画
			loadingStatus: "loadmore", //加载动画状态
			scrollTop: 0, //返回顶部滚动距离
			isError: false,
		}
	},
	async onLoad() {
		await this.getDataList();
	},
	onPageScroll(e) {
		this.scrollTop = e.scrollTop;
	},
	async onReachBottom() {
		this.isLoadingMore = true;
		if (["loading", "nomore"].includes(this.loadingStatus)) return;
		!this.isError ? this.page.pageNum += 1 : ""; //报错重新加载时,页码不需要增加
		this.loadingStatus = "loading";
		await this.getDataList();
	},
	methods: {
		// 初始化数据
		async initData() {
			uni.pageScrollTo({ scrollTop: 0, duration: 300 });
			this.page = { //查询条件
				pageNum: 1,
				pageSize: 10,
			};
			this.tableData = []; //查询结果
			this.isLoadingMore = false; //是否展示加载动画
			this.loadingStatus = "loadmore"; //加载动画状态
			this.scrollTop = 0; //返回顶部滚动距离
		},
		// 查询数据
		async getDataList(isInit) {
			const that = this;
			this.isError = false;
			this.loadingStatus = "loading";
			setTimeout(async () => {
				if (typeof isInit == "boolean" && isInit) await this.initData();
				let param = Object.assign({}, this.queryParam, this.page);
				console.log("请求参数:", param);
				// const ret = await this.getAction(this.apiUrl.list,param);
				const ret = {
					code: this.page.pageNum > 2 ? 1 : 0,
					data: this.page.pageNum > 3 ? [] : [
						{ id: 1, name: "1" },
						{ id: 2, name: "2" },
						{ id: 3, name: "3" },
						{ id: 4, name: "4" },
						{ id: 5, name: "5" },
						{ id: 6, name: "6" },
						{ id: 7, name: "7" },
						{ id: 8, name: "8" },
						{ id: 9, name: "9" },
						{ id: 10, name: "10" },
					],
					msg: this.page.pageNum > 2 ? "查询失败" : "查询成功",
				};
				if (ret.code == 0) {
					this.loadingPage = false;
					this.tableData = [...this.tableData, ...ret.data];
					this.loadingStatus = ret.data.length < this.page.pageSize ? "nomore" : "loadmore";
					console.log("当前获取到的数据:", ret, "查询结果内容:", this.tableData);
				} else {
					document.body.style.overflow = 'hidden'; //禁止滚动
					uni.showModal({
						title: '报错提示',
						content: ret.msg,
						confirmText: "重新加载",
						success: async function(res) {
							if (res.confirm) {
								document.body.style.overflow = ""; //恢复滚动
								await that.getDataList();
							} else if (res.cancel) {
								that.loadingPage = false;
								document.body.style.overflow = "";
							}
						}
					});
					if (this.tableData.length == 0) return; //无数据时不需要处理
					this.loadingStatus = "loadmore"; //还原加载动画状态
					this.isError = true; // 解决onReachBottom下拉到底pageNum+1
				}
			}, 2000)
		},

		// 点击事件
		handleClick(item, index) {
			console.log("点击获取的数据:", item, index);
		},
	}
}
相关推荐
00后程序员张2 小时前
iOS 开发环境搭建完整指南 Xcode 安装配置、iOS 开发工具选择、ipa 打包与 App Store 上架实战经验
android·macos·ios·小程序·uni-app·iphone·xcode
Q_Q5110082853 小时前
python+springboot+uniapp基于微信小程序的停车场管理系统 弹窗提示和车牌识别
vue.js·spring boot·python·django·flask·uni-app·node.js
我的xiaodoujiao6 小时前
Windows系统Web UI自动化测试学习系列3--浏览器驱动下载使用
前端·windows·测试工具·ui
慎思笃行_7 小时前
uniapp 无线连接 手机基座
智能手机·uni-app
00后程序员张7 小时前
App 上架全流程指南,iOS 应用发布步骤、ipa 文件上传工具、TestFlight 分发与 App Store 审核经验分享
android·ios·小程序·https·uni-app·iphone·webview
2501_916013747 小时前
iOS App 上架流程详解,苹果应用发布步骤、App Store 审核规则、ipa 文件上传与测试分发实战经验
android·ios·小程序·https·uni-app·iphone·webview
小样还想跑7 小时前
UniApp ConnectSocket连接websocket
websocket·elasticsearch·uni-app
Nan_Shu_6148 小时前
学习:uniapp全栈微信小程序vue3后台(28)
前端·学习·微信小程序·小程序·uni-app
—Qeyser8 小时前
Laravel + UniApp AES加密/解密
前端·uni-app·laravel