【h5 uniapp】 滚动 滚动条,数据跟着变化

news2024/11/29 11:35:59

uniapp项目

在这里插入图片描述

需求:
向下滑动时,数据增加,上方的日历标题日期也跟着变化
向上滑动时,上方的日历标题日期跟着变化

实现思路:

  1. 初次加载目前月份的数据 以及下个月的数据 this.getdate()
  2. 触底加载 下个月份的数据 onReachBottom()
  3. 向上滑动,监听页面滚动onPageScroll() 得到 距离顶部的高度 res.scrollTop
  4. 距离顶部的高度 除以 每个数据块的 高度 再 向下取整 ,得到的数 与 数据的下标 做对比 刚好等于的 说明 正停留在这个数据块,再把数据中的年和月赋值给标签(具体代码实现在 onPageScroll 函数 里)

全文源码

<template>
	<view class="u-p-b-150">
		<u-sticky>
			<view class="flex_spacebetween u-p-l-40 u-p-r-32 u-p-y-22 u-bg-007 u-color-fff">
				<view class="u-flex u-f-s-38 u-f-w-600 u-c-p" @click.stop="">
					<view>{{yue | MonthTrans}} {{nian}}</view>
					<image src="@/static/img/law/you1.png" mode="" class="u-w-32 u-h-32 u-m-l-24"></image>
				</view>
				<view class="bianji" @click.stop="$u.route('/pages/time/edit')">Edit</view>
			</view>
			<!-- 周几 -->
			<view class="riqi u-flex u-p-x-24">
				<view>Mon</view>
				<view>Tue</view>
				<view>Wed</view>
				<view>Thu</view>
				<view>Fri</view>
				<view>Sat</view>
				<view>Sun</view>
			</view>
		</u-sticky>
		<!-- 几号 -->
		<view class="u-flex wrap u-p-x-19 yuansu">
			<view class="u-text-center u-m-t-24 hao " :class="item.choose?'haoAct':''" v-for="(item,i) in list" :key="i">
				<view>{{item.name}}</view>
				<view v-if="item.choose" class="u-p-t-10">{{item.hour}}hr</view>
			</view>
		</view>


		<lawTabbar :current='2'></lawTabbar>
	</view>
</template>

<script>
	import {
		lsLawyerTimeMonth
	} from "@/api/index/index.js"
	import lawTabbar from '@/components/lawTabbar.vue'
	export default {
		components: {
			lawTabbar
		},
		data() {
			return {
				jinnian: '', // 记录 当前时间年份,不改变
				jinyue: '', // 记录 当前时间月份,不改变

				yuefen: '', // 当前时间  示例 2023-10-01  传值用
				nian: '', // 页面显示用
				yue: '', // 页面显示用
				nianyueri: '', // 现在的 2022-2-12-01
				xianianyueri: '', // 下一个月份 2022-2-12-01
				list: [
					// {choose:true,hour:'4hr',name:1},
				],
				scrollTop: 0
			}
		},
		filters: {
			MonthTrans(val) {
				let result = null
				switch (val) {
					case 1:
						return (result = 'January')
						break
					case 2:
						return (result = 'February')
						break
					case 3:
						return (result = 'March')
						break
					case 4:
						return (result = 'April')
						break
					case 5:
						return (result = 'May')
						break
					case 6:
						return (result = 'June')
						break
					case 7:
						return (result = 'July')
						break
					case 8:
						return (result = 'August')
						break
					case 9:
						return (result = 'September')
						break
					case 10:
						return (result = 'October')
						break
					case 11:
						return (result = 'November')
						break
					case 12:
						return (result = 'December')
						break
				}
				return result
			},

		},
		onShow() {
			this.list = [];
			this.getdate();
		},
		onLoad(option) {
			// this.getwidth();
			// yuansu 监听某个div 到达顶部
		},
		// mounted(){
		//  window.addEventListener('scroll',this.handleScrollx,true)
		// },
		// // 需要在页面销毁时,移除监听事件,避免了内存泄漏
		// beforeDestroy() {
		// 		window.removeEventListener("scroll",this.handleScrollx);
		// },
		methods: {
			// handleScrollx() {
			// 	// console.log(this.list.length)
			//   console.log('滚动高度',window.pageYOffset);
			//  },
			// 获取当前  年与月份
			getdate() {
				let that = this;
				var today = new Date();
				var year = today.getFullYear();
				var month = today.getMonth() + 1;
				var jinday = today.getDate();

				this.jinnian = year;
				this.jinyue = month;

				// 获取每月是多少天
				var day = new Date(year, month, 0).getDate();

				console.log(month + '月有' + day + '天');

				// 本月
				for (var i = 0; i < day; i++) {
					this.list.push({
						choose: false, // 是否选中
						hour: 0, // 总共多长时间
						name: i + 1, // 日
						month: month, // 月
						nian: year, // 年
						riqi: year + '-' + month + '-' + (Number(i + 1) < 10 ? '0' + Number(i + 1) : Number(i +
							1)) // 日期 2023-11-18
					});
				}


				// 获取每月1号是 周几
				let one = month + '/1' + '/' + year; //   10/1/2023
				// var weekArr = ['星期天','星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
				var weekArr = ['0', '1', '2', '3', '4', '5', '6'];
				var week = weekArr[new Date(one).getDay()];
				console.log(month + '月1号是周' + week);

				let arr = []
				if (week == 2) {
					arr = [{
						name: ''
					}]
				} else if (week == 3) {
					arr = [{
						name: ''
					}, {
						name: ''
					}]
				} else if (week == 4) {
					arr = [{
						name: ''
					}, {
						name: ''
					}, {
						name: ''
					}]
				} else if (week == 5) {
					arr = [{
						name: ''
					}, {
						name: ''
					}, {
						name: ''
					}, {
						name: ''
					}]
				} else if (week == 6) {
					arr = [{
						name: ''
					}, {
						name: ''
					}, {
						name: ''
					}, {
						name: ''
					}, {
						name: ''
					}]
				} else if (week == 0) {
					arr = [{
						name: ''
					}, {
						name: ''
					}, {
						name: ''
					}, {
						name: ''
					}, {
						name: ''
					}, {
						name: ''
					}]
				}

				this.list = arr.concat(this.list);

				this.yuefen = year + '-' + month + '-01';
				this.nianyueri = year + '-' + month + '-' + jinday;
			
				this.nian = year;
				this.yue = month;


				uni.showLoading({
					title:'Loading'
				});
				

				this.getlist();
				setTimeout(function() {
					that.jiaFun();
				}, 300);
			},
			jiaFun() {
				// 月份加1
				var date2 = new Date(this.nianyueri);
				date2.setMonth(date2.getMonth() + 1);
				this.xianianyueri = this.DateToString(date2, 'yyyy-MM-dd')
				// console.log(this.xianianyueri ,'下一个月');

				var today1 = new Date(this.xianianyueri);
				var year1 = today1.getFullYear();
				var month1 = today1.getMonth() + 1;
				var jinday1 = today1.getDate();
				// 获取下一个月每月是几天
				var day1 = new Date(year1, month1, 0).getDate();
				console.log(this.xianianyueri + '有多少天' + day1)

				for (var i = 0; i < day1; i++) {
					this.list.push({
						choose: false, // 是否选中
						hour: 0, // 总共多长时间
						name: i + 1, // 日
						month: month1, // 月
						nian: year1, // 年
						riqi: year1 + '-' + month1 + '-' + (Number(i + 1) < 10 ? '0' + Number(i + 1) : Number(i +
							1)) // 日期 2023-11-18
					});
				}

				console.log(this.list, '所有')
				
				this.yuefen = this.xianianyueri;
				this.getlist();
			},
			// 月份 加1 
			DateToString(date, fmt) {
				var o = {
					'Q+': Math.floor((date.getMonth() + 3) / 3), // 季度
					'M+': date.getMonth() + 1, // 月份
					'd+': date.getDate(), // 日
					'h+': (date.getHours() % 24 == 0) ? '00' : date.getHours() % 24, // 小时
					'H+': date.getHours(), // 小时
					'm+': date.getMinutes(), // 分
					's+': date.getSeconds(), // 秒
					'f+': date.getMilliseconds() // 毫秒
				};
				var week = {
					'0': '/u65e5',
					'1': '/u4e00',
					'2': '/u4e8c',
					'3': '/u4e09',
					'4': '/u56db',
					'5': '/u4e94',
					'6': '/u516d'
				};
				if (/(y+)/.test(fmt))
					fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
				if (/(E+)/.test(fmt))
					fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '/u661f/u671f' : '/u5468') :
						'') + week[date.getDay() + '']);
				for (var k in o) {
					if (k == 'f+') {
						if (new RegExp('(' + k + ')').test(fmt)) {
							var regExp0 = '000000000' + o[k];
							fmt = fmt.replace(RegExp.$1, regExp0.substr(regExp0.length - RegExp.$1.length));
						}
					} else {
						if (new RegExp('(' + k + ')').test(fmt))
							fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k])
								.length)));
					}
				}
				return fmt;
			},

			getlist() {
			
				let data = {
					yuefen: this.yuefen,
					lawyerId: uni.getStorageSync('lawyerId')
				}
				lsLawyerTimeMonth(data).then(res => {
					uni.hideLoading();
					res.rows.forEach(item => {
						this.list.forEach(itemdata => {
							if (item.riqi == itemdata.riqi) {
								itemdata.choose = true;
								itemdata.hour = item.zongTime;
							}
						});
					});

				});
			}

		},

		//监听页面滚动
		onPageScroll(res) {
			let that = this;
			let a = 0
			a = res.scrollTop / 300;
			a = parseInt(a);
			if (a == 0) {
				that.nian = this.jinnian;
				that.yue = this.jinyue;
			} else {
				that.list.forEach((item, i) => {
					if (i / 29 == a + 1) {
						that.nian = item.nian;
						that.yue = item.month;
					}
				});
			}
		},

		// 触底加载
		onReachBottom() {
			console.log('触底加载', this.yue, this.nian);
			console.log('现在的月份', this.yuefen);

			var date = new Date(this.yuefen);
			date.setMonth(date.getMonth() + 1);
			this.yuefen = this.DateToString(date, 'yyyy-MM-dd');

			var today1 = new Date(this.yuefen);
			var year1 = today1.getFullYear();
			var month1 = today1.getMonth() + 1;
			var jinday1 = today1.getDate();

			// 获取下一个月每月是几天
			var day1 = new Date(year1, month1, 0).getDate();
			console.log(this.yuefen + '有多少天' + day1)


			for (var i = 0; i < day1; i++) {
				this.list.push({
					choose: false, // 是否选中
					hour: 0, // 总共多长时间
					name: i + 1, // 日
					month: month1, // 月
					nian: year1, // 年
					riqi: year1 + '-' + month1 + '-' + (Number(i + 1) < 10 ? '0' + Number(i + 1) : Number(i +
						1)) // 日期 2023-11-18
				});
			}

	

			this.nian = year1;
			this.yue = month1;

			this.getlist();

		},
		// onPullDownRefresh() {
		// 	this.pageNum = 1;
		// 	this.getlist();
		// 	setTimeout(function() {
		// 		uni.stopPullDownRefresh();
		// 	}, 1000);
		// }

	}
</script>

<style lang='scss' scoped>
	.bianji {
		width: 120rpx;
		height: 56rpx;
		border-radius: 28rpx;
		border: 2rpx solid #FFFFFF;
		font-size: 30rpx;
		font-family: Helvetica-Bold, Helvetica;
		font-weight: bold;
		line-height: 56rpx;
		text-align: center;
		cursor: pointer;
	}

	/* 
	750 - 48 / 7 == 100 
	2200 - 48 / 7 == 307
	*/
	.riqi {
		background: #F7F7F7;
		font-size: 30rpx;
		font-family: Helvetica;
		padding: 30rpx 0;

		view {
			cursor: pointer;
			width: 100rpx;
			text-align: center;
		}
	}

	.hao {
		font-size: 30rpx;
		font-family: Helvetica;
		padding-top: 16rpx;
		height: 124rpx;
		border-radius: 8rpx;
		width: 96rpx;
		box-sizing: border-box;
		margin: 0 3rpx;
	}

	.haoAct {
		background: #E5F7FF;
		color: #0078B2;
		font-family: Helvetica-Bold, Helvetica;
		font-weight: bold;
	}

	@media only screen and (min-width: 750px) {
		.riqi {
			view {
				width: 307rpx;
			}
		}

		.hao {
			width: 302rpx;
		}
	}
</style>```

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

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

相关文章

17 _ 跳表:为什么Redis一定要用跳表来实现有序集合?

上两节我们讲了二分查找算法。当时我讲到,因为二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗? 实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。我们把改造之后的数据结构叫做…

专业英国TOP1|设计学老师CSC公派伯恩茅斯大学访学

F老师的研究方向侧重于数字设计&#xff0c;比较小众&#xff0c;英国知名大学中涉及该专业的院系不是很多&#xff0c;且只有一个多月的申请时间。我们的申请效率很高&#xff0c;陆续得到英国多个高校的邀请函&#xff0c;最终其选定了伯恩茅斯大学申报CSC。伯恩茅斯大学的动…

对话刘继升:用户只管去“野”,剩下的交给福特纵横

在云南首家Ford Beyond福特纵横纵享空间的盛大开业典礼上&#xff0c;福特再次加速了其福特纵横网络建设&#xff0c;为越野爱好者带来更多乐趣。这一举措标志着福特正积极构筑一个全新的越野生态系统&#xff0c;为越野爱好者提供更多愉快的体验&#xff0c;同时打造一个充满乐…

Webpack--动态 import 原理及源码分析

前言 在平时的开发中&#xff0c;我们经常使用 import()实现代码分割和懒加载。在低版本的浏览器中并不支持动态 import()&#xff0c;那 webpack 是如何实现 import() polyfill 的&#xff1f; 原理分析 我们先来看看下面的 demo function component() {const btn docume…

5个WebGIS功能小技巧

我们在《为什么要研发WebGIS系统&#xff1f;》一文中&#xff0c;分享为什么要研发水经微图Web版的WebGIS系统。 这里&#xff0c;我们再为你分享一下水经微图Web版中的几个功能小技巧。 批量修改标注名称 在工具栏中选择“框选”工具&#xff0c;框选需要修改标注的要素。 …

自定义表单模型小程序源码系统 带完整的部署教程

大家好啊&#xff0c;今天源码小编来给大家分享一款自定义表单模型小程序源码系统。在数字化时代&#xff0c;信息收集和处理显得尤为重要。无论是企业还是个人&#xff0c;都需要通过表单来收集、整理、分析各种信息。但是&#xff0c;传统的表单构建方式往往需要编写大量的代…

电脑如何截屏?一起来揭晓答案!

在数字时代&#xff0c;截屏已经成为我们日常生活和工作中的必备技能。无论是为了捕捉有趣的网络瞬间&#xff0c;保存重要信息&#xff0c;还是为了协作和教育&#xff0c;电脑截屏都是一个强大而方便的工具。本文将介绍三种电脑如何截屏的方法&#xff0c;以满足各种需求&…

景联文科技助力金融机构强化身份验证,提供高质量人像采集服务

随着社会的数字化和智能化进程的加速&#xff0c;人像采集在金融机构身份认证领域中发挥重要作用&#xff0c;为人们的生活带来更多便利和安全保障。 金融机构在身份验证上的痛点主要包括以下方面&#xff1a; 身份盗用和欺诈风险&#xff1a;传统身份验证方式可能存在漏洞&am…

IS420ESWBH3A GE 附加配置文件和I/O组件中的单独标签

IS420ESWBH3A GE 附加配置文件和I/O组件中的单独标签 为CompactLogix、MicroLogix和ControlLogix等以太网/IP兼容型PLC用户提供了一种节省自动化机器空间、资金和布线的新方法。ClearLink提供4个运动控制轴、一个串行端口、13个可配置的数字和模拟I/O点以及可扩展的I/O。tek …

Spring源码系列-框架中的设计模式

简单工厂 实现方式&#xff1a; BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现&#xff0c;根据传入一个唯一的标识来获得Bean对象&#xff0c;但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 实质&#xff1a; 由一个工厂…

Linux常用命令——cancel命令

在线Linux命令查询工具 cancel 取消已存在的打印任务 补充说明 cancel命令用于取消已存在的打印任务。 语法 cancel(选项)(参数)选项 -a&#xff1a;取消所有打印任务&#xff1b; -E&#xff1a;当连接到服务器时强制使用加密&#xff1b; -U&#xff1a;指定连接服务器…

LeetCode |142. 环形链表 II

LeetCode |142. 环形链表 II OJ链接 一个指针从相遇点开始走&#xff0c;一个指针从头开始走&#xff0c;它们会在入口点相遇~~ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* slow,*fast;slow fast head;while(fast && fast->next…

扬帆起航正当时——远航汽车下线仪式在山西运城成功举办

11月8日&#xff0c;“智赢未来 远航汽车——远航汽车下线仪式”在山西省运城市大运集团新能源生产基地成功举办。运城市委书记丁小强、市长储祥好&#xff0c;以及来自省、市、区各级政府领导&#xff0c;远航汽车供应商代表、客户代表、全国主流媒体&#xff0c;大运集团各级…

eclipse的安装与配置详细教程(包括UML插件 汉化 JDK 代码补全 导入导出等)

Eclipse安装与配置详细教程 1.Eclipse安装与配置 1.将JDK与Eclipse这两个软件安装包放在一个文件夹下&#xff0c;方便之后安装使用。 2.安装JDK 在D&#xff1a;LeStoreDownload\Java文件夹下另外新建三个文件夹分别命名为java、jdk和eclipse&#xff08;分别用于Java、jdk…

必看:一组WhatsApp2023年数据合集,助你深入洞察WS营销

作为一款遍布全球的超级应用&#xff0c;WhatsApp以高人气、广覆盖和高效便利收获了几十亿用户&#xff0c;也无数次连接了用户与企业。对于WhatsApp运营布局&#xff0c;客观数据能为企业提供多方面的依据和判断。本文将从多个维度展示WhatsApp2023年数据&#xff0c;希望能为…

2023年最佳键盘:打字和游戏的顶级键盘,总共十款,总有一款适合你

只有最好的键盘才能真正提供舒适无缝的打字体验。虽然亚马逊的廉价键盘可以帮助你满足日常打字需求,但它们不会像顶级键盘那样快速和灵敏。更重要的是,他们不会优先考虑人体工程学。 任何普通的键盘都可以作为输入设备正常工作。然而,高质量的选项更准确、更快、反应更灵敏…

数据结构——二叉树(2)

接上一篇文章http://t.csdnimg.cn/nsKsW&#xff0c;本次我们接着讲解关于二叉树的相关知识。 一、二叉树的相关性质&#xff1a; 1. 若规定根节点的层数为 1 &#xff0c;则一棵非空二叉树的 第 i 层上最多有 2^(i-1) 个结点. 2. 若规定根节点的层数为 1 &#xff0c;则 深度…

10.Form表单中Input输入框设置autoComplete=“off“ 不生效

一、问题的描述 form表单的 password框 有时候我们并不需要chrome自动填充记住的密码这个效果&#xff0c;如下图 二 、正常的预期是什么&#xff1f; 输入框获取焦点时&#xff0c;不展示chrome的默认行为。 三、问题产生的原因分析 发现antd的Input组件的 autocomplete“o…

学习伦敦银交易经验的好方法:亏损

要掌握伦敦银交易的技巧&#xff0c;除了看书学习以外&#xff0c;实践的经验也是很重要的&#xff0c;而这些实践的经验中&#xff0c;从亏损中学习会让经验会更加立体和深刻。下面我们就来讨论一下亏损这个学习伦敦银交易技巧的方法。 首先我们需要了解&#xff0c;不论是伦敦…

语音芯片故障的原因简述

语音芯片在语音设备或者相关产品中应用时会出现故障情况&#xff0c;常见的故障情况更多的是无法发出声音或者声音不连贯&#xff0c;还有声音播报不完整或者混乱等情况。下面让我们来探究芯片本身内部的故障问题&#xff0c;以及外部的原因。 芯片内部自身的故障&#xff1a;…