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

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>```

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

缓冲流详解

缓冲流概述 缓冲流也称为高效流、或者高级流。之前学习的字节流可以称为原始流。 作用&#xff1a;缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能。 字节缓冲流 字节缓冲流性能优化原理&#xff1a; 字节缓冲输入流自带了8KB缓冲池&#xff0c;以后我们直接…

计算机找不到MSVCR120.dll,MSVCR120.dll丢失的三种解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“MSVCR120.dll丢失”。这个错误通常出现在运行某些程序时&#xff0c;导致程序无法正常启动。那么&#xff0c;如何解决MSVCR120.dll丢失的问题呢&#xff1f;小编将详细介绍解决方法&#…

第二证券:北交所30%的涨跌幅限制?

随着我国股市的不断发展&#xff0c;股市生意的涨跌幅束缚也成为了一个备受注重的论题。在北交所&#xff0c;股票的涨跌幅束缚为30%&#xff0c;这一束缚是否合理呢&#xff1f;本文将从多个角度进行剖析。 首先&#xff0c;涨跌幅束缚对于股市的安稳起着重要的效果。股票价格…

JavaScript使用对象

对象(object)是最基本、最通用的类型&#xff0c;具有复合性结构&#xff0c;属于引用型数据&#xff0c;对象的结构具有弹性&#xff0c;内部的数据是无序的&#xff0c;每个成员被称为属性。在JavaScript中&#xff0c;对象是一个泛化的概念&#xff0c;任何值都可以转换为对…

任正非说:流程的作用就三个:一是正确及时交付,二是赚到钱,三是没有腐败。

你好&#xff01;这是华研荟【任正非说】系列的第32篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 一、流程的作用就三个&#xff1a;一是正确及时交付&#xff0c;二是赚到钱&#xff0c;三是没有腐败。如果这三个目的都实现了…

个性化联邦学习-综述

介绍阅读的三篇个性化联邦学习的经典综述文章 Three Approaches for Personalization with Applications to Federated Learning 论文地址 文章的主要内容 介绍了用户聚类&#xff0c;数据插值&#xff0c;模型插值三种个性化联邦学习的方法。 用户聚类&#xff1a; 目的&a…

接口开发之使用C#插件Quartz.Net定时执行CMD任务工具

C#制作定时任务工具执行CMD命令 概要准备知识点实现原理thinkphp配置winform执行CMD命令读取ini配置文件定时任务Quartz.Net 完整代码Job.csIniFunc.csForm1.csconfig.ini简易定时任务工具雏形 概要 很多时候写接口上线后还会遇到很多修改&#xff0c;类似JAVA,C#,delphi制作的…

为什么说数据安全运维难?有好用的数据安全运维平台吗?

随着息技术的快速发展&#xff0c;不少企业在实行数字化转型&#xff0c;同时也面临着越来越多的数据安全运维挑战。不少企业都觉得数据安全运维难&#xff0c;都在找好用的数据安全运维平台。今天我们就来聊聊为什么说数据安全运维难&#xff1f;以及是否有好用的数据安全运维…

[MICROSAR Adaptive] --- Hello Adaptive World

Automotive E/E Architecture and AUTOSAR Adaptive Platform Vector Solution: MICROSAR Adaptive First project: Hello Adaptive World Summary 1 引言 1.1 AP诞生的历史背景 新一代电子电器架构通常将车内的节点分为三类。计算平台,预控制器和传感器执行器相关的节点,…

家用电脑做服务器,本地服务器搭建,公网IP申请,路由器改桥接模式,拨号上网

先浇一盆冷水&#xff01; 我不知道其他运营商是什么情况。联通的运营商公网IP端口 80、8080、443 都会被屏蔽掉&#xff0c;想要开放必须企业备案&#xff08;个人不行&#xff09;才可以。也就是说&#xff0c;只能通过其他端口进行showtime了。 需要哪些东西&#xff1f; 申…

Spring Boot中使用Spring Data JPA访问MySQL

Spring Data JPA是Spring框架提供的用于简化JPA&#xff08;Java Persistence API&#xff09;开发的数据访问层框架。它通过提供一组便捷的API和工具&#xff0c;简化了对JPA数据访问的操作&#xff0c;同时也提供了一些额外的功能&#xff0c;比如动态查询、分页、排序等。 …

数据分析:职场不可或缺的技能

前言 在当今数字化时代&#xff0c;数据分析已经变得越来越不可或缺。不论你从事哪个行业&#xff0c;不论你在职场的哪个阶段&#xff0c;数据分析技能都将成为你在工作中脱颖而出的秘密武器。本文将阐明数据分析的重要性&#xff0c;以及如何学习数据分析&#xff0c;以及如…

MobaXterm配置SSHTunnel

本地与远程服务器之间存在防火墙&#xff0c;防火墙只允许SSH端口通过&#xff0c;为访问远程服务器&#xff0c;我们可以借助MobaXterm来与SSH服务器建立隧道&#xff0c;使得防火墙外的用户能够访问远程服务器 配置 打开SSHTunnel 新建SSH tunnel 点击开启就生效了&…

多门店自助点餐+外卖二合一小程序源码系统 带完整搭建教程

随着餐饮业的快速发展和互联网技术的不断进步&#xff0c;越来越多的餐厅开始采用自助点餐和外卖服务。市场上许多的外卖小程序APP应运而生。下面罗峰来给大家介绍一款多门店自助点餐外卖二合一小程序源码系统。该系统结合了自助点餐和外卖服务的优势&#xff0c;为餐厅提供了一…

测试老鸟整理,Postman加密接口测试-Rsa/Aes对参数加密(详细总结)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 一些问题 postma…

前端框架Vue学习 ——(五)前端工程化Vue-cli脚手架

文章目录 Vue-cliVue项目-创建Vue项目-目录结构Vue项目-启动Vue项目-配置端口Vue项目开发流程 Vue-cli 介绍&#xff1a;Vue-cli 是 Vue 官方提供的一个脚手架&#xff0c;用于快速生成一个 Vue 的项目模版 安装 NodeJS安装 Vue-cli npm install -g vue/cliVue项目-创建 图…

Java代码如何对Excel文件进行zip压缩

1&#xff1a;新建 ZipUtils 工具类 package com.ly.cloud.datacollection.util;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import ja…

iOS Crash 治理:淘宝VisionKitCore 问题修复

本文通过逆向系统&#xff0c;阅读汇编指令&#xff0c;逐步找到源码&#xff0c;定位到了 iOS 16.0.<iOS 16.2 WKWebView 的系统bug 。同时苹果已经在新版本修复了 Bug&#xff0c;对于巨大的存量用户&#xff0c;仍旧会造成日均 Crash pv 1200 uv 1000&#xff0c; 最终通…

爬虫采集外卖数据用于竞争对手分析

因为我无法直接编写和运行代码。但我可以为大家提供编写爬虫程序的一般步骤和方法&#xff1a; 1、导入所需库&#xff1a;在Python中&#xff0c;您可以使用requests库来发送HTTP请求&#xff0c;并使用BeautifulSoup库来解析HTML。 import requests from bs4 import Beautif…

Web服务器实战

网站需求 1.基于域名www.openlab.com可以访问网站内容为 welcome to openlab!!! 2.给该公司创建三个网站目录分别显示学生信息&#xff0c;教学资料和缴费网站&#xff0c;基于www.openlab.com/student 网站访问学生信息&#xff0c;www.openlab.com/data网站访问教学资料 www…