便利贴--47{基于移动端长页中分页加载逻辑封装}

本文详细介绍了一段移动端应用中便利贴组件的实现,涉及基于Promise的Pagination封装,包括搜索功能、数据获取与分页控制。核心展示了长页加载逻辑和自定义参数处理,适用于开发者理解和实现类似场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

便利贴--46{基于移动端长页中分页加载逻辑封装}

使用

this.pages = new Pagination({
      method: inspectionList,//主要的promis的接口方法
      value: this.ourData.tabel.value,//如果传入的是在对象中,可以直接更改你的列表数据(可查看对象引用知识)
       search: { propertyType: 2 },//默认搜索条件
       mustSearch: ["checkState"],//必须要设置的搜索条件,若传入的搜索条件为空,则不请求数据
      whereList: ["rows"],//在得到的res对象中,我们需要的数组列表在哪个子对象上,主要是for循环进行读取res内部数据
      pageName: "pageNum",//自定义page传参名称
      outTotal: (num) => {//数量的输出,主要用于判断没有数据时候显示缺省页
        console.log(num);
        // ourData.total = num;
      },
      fn: (res, reset) => {//在不使用对象引用时,可以在这里进行获取的数据输出,但注意每次输出是基于当前搜索条件的结果,需要push
    doData(res, reset);
  },
    });
    this.pages.onSearch();//进行搜索

scrollBottom(e) {// 监听的滚动事件,如果是uniapp 有自带的滚动到底部事件,可直接使用this.pages.next();,pagination中已经集成每次请求完才能进行下一次请求
      let bottomPosition = e.target.scrollHeight - e.target.clientHeight,
        nowPosition = e.target.scrollTop,
        gap = bottomPosition - e.target.scrollTop;
      if (gap <= 100) {
        // console.log(gap);
        // console.log(this.pages.onMove);
        if (!this.pages.onMove) {//这个是内部展示是否是在请求状态 true为请求状态
          // setTimeout(() => {
          this.pages.next();
          // }, 1000);
        }
      }
    },

源代码

export default class pagination {
	constructor(arg) {
		this.method = arg?.method || '';
		this.search = arg?.search || {};
		this.otherSearch = arg?.otherSearch || {};
		this.pageName = arg?.pageName || 'page'
		this.pageSizeName = arg?.pageSizeName || 'pageSize'
		this.page = arg?.page || {
			current: 1,
			pageSize: 10,
			total: 0,
			state: false,
			stop: false
		};
		this.value = arg.value || [];
		this.mustSearch = arg.mustSearch || [];
		this.listName = arg.listName || '';
		//抛出方法
		this.fn = arg.fn || '';
		this.outTotal = arg.outTotal || function (r) {
			console.log(r, 'total输出')
		}
		// 信息获取状态
		this.onMove = false;
		// this.getData()
		//深度自定义数据的位置,基于在res.list中
		this.whereList = arg.whereList || [];
	}
	async getData(reset) {
		// console.log(form.page);
		if (this.onMove) {
			console.log('操作频繁,请稍后重试!')
			return
		}
		if (this.page.stop) return;
		let data = {};
		data[this.pageName] = this.page.current;
		data[this.pageSizeName] = this.page.pageSize;
		if (Object.keys(this.search).length != 0) {
			for (let k in this.search) {
				data[k] = this.search[k];
			}
		}
		if (Object.keys(this.otherSearch).length != 0) {
			for (let k in this.otherSearch) {
				data[k] = this.otherSearch[k];
			}
		}
		// console.log(this.method,'see')
		// this.method &&
		// 	console.log(data, '传参see', (this.method + '').match(/\"\/(\S*)\"\,/)[0], (this.method + '').match(
		// 		/method: (\S*)\"\,/)[0]);
		if (!this.method) {
			console.log('未设置api')
			return
		}
		console.log(data, '传参see')
		// return
		this.onMove = true
		let res = await this.method(data);
		this.onMove = false
		console.log(res, '返回see');

		// 抛出处理数据
		if (this.fn) {
			this.fn(res, reset)
		}
		let useList = res;
		if (this.whereList.length > 0) {
			for (let k in this.whereList) {
				useList = useList[this.whereList[k]]
			}
		}

		if (!useList || !res?.total) {
			// 抛出数量
			this.outTotal(0)
			return
		};

		this.outTotal(res?.total)
		this.value.push(...useList);
		this.page.total = res?.total;

		// this.value.push(useList[0]);
		// this.outTotal(0)

		//判断是否还有分页
		// console.log(this.value, 'see5');
		if (this.value.length < this.page.total) {
			this.page.state = true;
			this.page.stop = false;
			this.page.current++;
		} else {
			this.page.state = true;
			this.page.stop = true;
		}

	}
	//查询数据
	next() {
		this.getData();
	};
	//查询数据
	onSearch(data, other = {
		reset: true
	}) {
		if (other.reset) {
			this.onReset();
		}
		let must = this.mustSearch;
		for (let k in data) {
			if (must.includes(k)) {
				this.search[k] = data[k]
			} else {
				this.otherSearch[k] = data[k];
			}
		}
		//判断是否含有必要条件
		if (!this.passSearch()) {
			// console.log('有必要条件未传!')
			return
		};
		this.getData(other.reset);
	};
	//重置数据
	onReset() {
		if (this.value.length > 0) {
			this.value.splice(0, this.value.length);
		}
		// //清空不必要搜索
		// if (Object.keys(this.otherSearch).length != 0) {
		// 	this.otherSearch = {}
		// }
		this.page = {
			current: 1,
			pageSize: 10,
			total: 0,
			state: false,
			stop: false
		};
		this.onMove = false;
	};
	//判断是否含有必要条件
	passSearch() {
		// 取出搜索必要条件
		let must = this.mustSearch,
			i = 0;
		for (let k in this.search) {
			if (must.includes(k)) {
				i++;
			}
		}
		if (i == must.length) {
			// console.log('符合');
			return true
		} else {
			// console.log('不符合');
			return false
		}
	};
	setMethod(method, search) {
		this.method = method || "";
		search &&
			this.onSearch()
	}
	setMustSearch(mustSearch) {
		this.mustSearch = mustSearch || "";
	}
}

Vivado2023是一款集成开发环境软件,用于设计和验证FPGA(现场可编程门阵列)和可编程逻辑器件。对于使用Vivado2023的用户来说,license是必不可少的。 Vivado2023的license是一种许可证,用于授权用户合法使用该软件。许可证分为多种类型,包括评估许可证、开发许可证和节点许可证等。每种许可证都有不同的使用条件和功能。 评估许可证是免费提供的,让用户可以在一段时间内试用Vivado2023的全部功能。用户可以使用这个许可证来了解软件的性能和特点,对于初学者和小规模项目来说是一个很好的选择。但是,使用评估许可证的用户在使用期限过后需要购买正式的许可证才能继续使用软件。 开发许可证是付费的,可以永久使用Vivado2023的全部功能。这种许可证适用于需要长期使用Vivado2023进行开发的用户,通常是专业的FPGA设计师或工程师。购买开发许可证可以享受Vivado2023的技术支持和更新服务,确保软件始终保持最新的版本和功能。 节点许可证是用于多设备或分布式设计的许可证,可以在多个计算机上安装Vivado2023,并共享使用。节点许可证适用于大规模项目或需要多个处理节点进行设计的用户,可以提高工作效率和资源利用率。 总之,Vivado2023 license是用户在使用Vivado2023时必须考虑的问题。用户可以根据自己的需求选择合适的许可证类型,以便获取最佳的软件使用体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轻动琴弦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值