小程序:下拉刷新+上拉加载+自定义导航栏

news2024/12/24 2:55:10

下拉刷新 :

 +

 <scroll-view
                scroll-y="true"                              允许纵向滚动
                refresher-enabled="true"             开启自定义下拉刷新  默认为false
                :refresher-triggered="triggered"   设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发
                :refresher-threshold="150"           设置自定义下拉刷新阈值
                refresher-background="#eee"      下拉刷新的背景颜色
                @refresherrefresh="onRefresh"   下拉刷新触发
                @refresherrestore="onRestore"   上拉达到一定的距离
                @refresherabort="onAbort"       上拉过程中取消操作
            >

        下拉刷新的内容区域

</scroll-view>

data() {
        return {
            triggered: false, //下拉刷新标记
        };
    },

methods: {

        // //下拉刷新
        onRefresh() {
            this.triggered = true
            this.getCount() //提醒消息数量
            this.getRemList() //提醒三条列表

            setTimeout(() => {
                this.triggered = false;
            }, 1000);
        },
        // 在刷新过程中取消刷新
        onRestore() {
            this.triggered = 'restore'; // 需要重置
            console.log('onRestore');
        },
        // 在刷新过程中中止刷新
        onAbort() {
            console.log('onAbort');
        },

}

上拉加载:

<scroll-view
                scroll-y="true"
                class="scroll-Y"
                :style="{
                    height: `calc(100vh - 260rpx)`,
                }"
                @scrolltolower="lower"   //监听滚动事件,当页面滚动到底部时,绑定的方法会被触发。
                :refresher-threshold="150"
                refresher-background="#eee"
                @refresherrefresh="onRefresh"
                @refresherrestore="onRestore"
                @refresherabort="onAbort"
            >
                <view>
                   <!-- 下拉加载的内容 --> 
                </view>

 </scroll-view>

在data中定义开始页  步长  防止触底请求多次标记

data() {
        return {
            datalist: [],//消息列表
            pageNum: 1, //开始页
            pageSize: 10, //步长
            total: '', //list总数

            freshFlag: true, //防止触底请求多次标记
        };
    },

methods: {

        

    //上拉加载触发
        lower(e) {
            // 防止多次请求
            if (!this.freshFlag) {
                return;
            }

            this.freshFlag = false;
            let length = this.datalist.length;
            // 判断是否超出最大长度,超出不请求
            if (this.total > length) {
                this.pullDownNew();
            } else {
                uni.showToast({
                    title: '没有更多了',
                    duration: 2000,
                });
                this.freshFlag = true;
                return;
            }
        },

        //上拉加载请求最新数据拼接
        pullDownNew() {
            uni.showLoading({
                title: '加载中',
            });
            this.pageNum++;
            getRemList({
                pageNum: this.pageNum, //开始页
                pageSize: this.pageSize, //步长
            })
                .then(res => {
                    this.datalist = [...this.datalist, ...res.data.rows];
                    uni.hideLoading();
                    this.freshFlag = true;
                })
                .catch(err => {
                    uni.hideLoading();
                });
        },
 

}

再说一下这个自定义顶部导航的布局方法:

在data中定义状态栏的高度和自定义导航栏的高度

        statusBarHeight: '', // 状态栏高度
        barHeight: '', // 自定义导航栏高度

 

uni.getSystemInfoSync() 是一个Uni-app框架中的API,用于同步获取设备系统信息。) 

wx.getMenuButtonBoundingClientRect()是微信小程序的一个API,用于获取菜单按钮的边界信息。

具体来说,这个API可以用来获取菜单按钮的位置和尺寸信息,包括元素的toprightbottomleftwidthheight等属性。这些信息可以帮助我们更好地了解菜单按钮在界面上的位置和大小,从而更好地进行布局和样式控制。)

wx.getMenuButtonBoundingClientRect()拿到的值表示了菜单按钮的上边缘距离视窗上边缘多少像素,左边缘距离视窗左边缘多少像素,下边缘距离视窗下边缘多少像素,右边缘距离视窗右边缘多少像素,宽度为多少像素,高度为多少像素。

         // 状态栏高度
        this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight;
        // 胶囊数据
        const { top, height } = wx.getMenuButtonBoundingClientRect();
        // 自定义导航栏高度 = 胶囊高度 + 胶囊的padding*2, 如果获取不到设置为38
        this.barHeight = height ? height + (top - this.statusBarHeight) * 2 : 38;

整体代码如下: 

<template>
	<view class="remind">
        
        <view class="bgc">
            <view :style="{ height: `${statusBarHeight}px` }"></view>
            
            <view
            	class="customHead"
            	:style="{
            		height: `${barHeight}px`,
            		'line-height': `${barHeight}px`,
            	}"
            >
                
            	<text class="toHome iconfont" @click="toHome">&#xe669;</text>
            	<text class="title">提醒消息</text>
            </view>
        </view>
        
        
		<view class="scrollList">
			<scroll-view
				scroll-y="true"
				class="scroll-Y"
				:style="{
					height: `calc(100vh - 260rpx)`,
				}"
				@scrolltolower="lower"
				:refresher-threshold="150"
				refresher-background="#eee"
				@refresherrefresh="onRefresh"
				@refresherrestore="onRestore"
				@refresherabort="onAbort"
			>
                <view>
                   <!-- 下拉加载的内容 --> 
                </view>
				
			</scroll-view>
            
		</view>
	</view>
</template>

<script>

export default {
	data() {
		return {
            statusBarHeight: '', // 状态栏高度
            barHeight: '', // 自定义导航栏高度
			avatar: '', //头像
			datalist: [],//消息列表
            
			pageNum: 1, //开始页
			pageSize: 10, //步长
			total: '', //list总数

			freshFlag: true, //防止触底请求多次标记
		};
	},
    
    onLoad() {
        
        this.init();
    	// 状态栏高度
    	this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight;
    	// 胶囊数据
    	const { top, height } = wx.getMenuButtonBoundingClientRect();
    	// 自定义导航栏高度 = 胶囊高度 + 胶囊的padding*2, 如果获取不到设置为38
    	this.barHeight = height ? height + (top - this.statusBarHeight) * 2 : 38;

        this.avatar = uni.getStorageSync('avatar') //头像
    },


	methods: {
		// 初始化
		init() {
			uni.showLoading({});
			getRemList({
				pageNum: this.pageNum, //开始页
				pageSize: this.pageSize, //步长
			}).then(res => {
				console.log(res);
				this.datalist = res.data.rows;  //消息列表
				this.total = res.data.alltotal;
				uni.hideLoading();
			});
		},
        
        // 提醒消息页面回退
       toHome(){
           uni.navigateBack()
       },

		//上拉加载触发
		lower(e) {
			// 防止多次请求
			if (!this.freshFlag) {
				return;
			}

			this.freshFlag = false;
			let length = this.datalist.length;

			// 判断是否超出最大长度,超出不请求
			if (this.total > length) {
				this.pullDownNew();
			} else {
				uni.showToast({
					title: '没有更多了',
					duration: 2000,
				});
				this.freshFlag = true;
				return;
			}
		},

		//上拉加载请求最新数据拼接
		pullDownNew() {
			uni.showLoading({
				title: '加载中',
			});
			this.pageNum++;
			getRemList({
				pageNum: this.pageNum, //开始页
				pageSize: this.pageSize, //步长
			})
				.then(res => {
					this.datalist = [...this.datalist, ...res.data.rows];
					uni.hideLoading();
					this.freshFlag = true;
				})
				.catch(err => {
					uni.hideLoading();
				});
		},

	},
};
</script>

<style lang="scss">

.bgc{
    height: 260rpx;
    background: linear-gradient(180deg, #ffb588 -17.42%, rgba(255, 220, 167, 0) 119.43%);
}
.customHead {
	padding-left: 10rpx;
	display: flex;
	align-items: center;
	position: relative;


	.title {
		position: absolute;
		left: 50%;
		transform: translateX(-50%);
	}
}

.remind{
    
        .scrollList {
            width: 100vw;
            margin-bottom: 20rpx;
        }

    }

</style>

 

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

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

相关文章

从读不完一篇文章,到啃下20万字巨著,大模型公司卷起“长文本”

点击关注 文丨郝 鑫 编丨刘雨琦 4000到40万token&#xff0c;大模型正在以“肉眼可见”的速度越变越“长”。 长文本能力似乎成为象征着大模型厂商出手的又一新“标配”。 国外&#xff0c;OpenAI经过三次升级&#xff0c;GPT-3.5上下文输入长度从4千增长至1.6万token&…

MySQL常用命令01

今天开始&#xff0c;每天总结一点MySQL相关的命令&#xff0c;方便大家后期熟悉。 1.命令行登录数据库 mysql -H IP地址 -P 端口号 -u 用户名 -p 密码 数据库名称 -h 主机IP地址 登录本机 localhost或127.0.0.1 -P 数据库端口号 Mysql默认是3306 -u 用户名 -p 密码 …

nodejs+vue+elementui医院挂号预约管理系统4n9w0

前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE 1、 node_modules文件夹(有npn install Express 框架于Node运行环境的Web框架, 开发语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff…

公司寄件管理教程

不少企业为了规范因公寄件的管理&#xff0c;节约企业的快递成本&#xff0c;最终简化企业内部办公流程&#xff0c;提升企业整体办公效率&#xff0c;在因公寄件达到一定量的时候&#xff0c;都会推出或繁或简的“公司寄件管理制度”。 所谓的“或繁或简”。是根据企业的寄件场…

前端练习项目(附带页面psd图片及react源代码)

一、前言 相信很多学完前端的小伙伴都想找个前端项目练练手&#xff0c;检测自己的学习成果。但是现在很多项目市面上都烂大街了。今天给大家推荐一个全新的项目——电子校园 项目位置&#xff1a;https://github.com/v5201314/eSchool 二、项目介绍(部分页面展示)&#xff…

C++QT-day6

/*定义一个基类 Animal&#xff0c;其中有一个虛函数perform&#xff08;)&#xff0c;用于在子类中实现不同动物的表演行为。*/ #include <iostream> using namespace std; class Animal //封装Animal类&#xff08;基类&#xff09; { private:string person; public:A…

力扣:130. 被围绕的区域(Python3)

题目&#xff1a; 给你一个 m x n 的矩阵 board &#xff0c;由若干字符 X 和 O &#xff0c;找到所有被 X 围绕的区域&#xff0c;并将这些区域里所有的 O 用 X 填充。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#…

在线免费AI绘画工具

体验地址 点我进行AI绘画 使用 选择以文搜图进行绘画 提问 介绍 首先&#xff0c;我们来了解一下ChatGPT。作为一个人工智能语言模型&#xff0c;它可以自动回答你的问题、提供信息&#xff0c;并与你进行流畅的对话。它通过大量的训练数据和机器学习算法&#xff0c;学…

react–antd 实现TreeSelect树形选择组件,实现点开一层调一次接口

效果图: 注意: 当选择“否”&#xff0c;开始调接口&#xff0c;不要把点击调接口写在TreeSelect组件上&#xff0c;这样会导致问题出现&#xff0c;没有层级了 部分代码:

01Maven的工作机制: Maven作为依赖管理工具以及Maven作为构建管理工具

Maven的特点及其应用 Maven 是 Apache 软件基金会组织维护的一款专门为Java项目提供构建和依赖管理支持的工具 Maven 作为依赖管理工具 管理jar包的规模: 随着我们使用的框架数量越来越多以及框架的封装程度也越来越高&#xff0c;项目中使用的jar包也就越来越多 配置工程依…

自动化测试 —— Pytest fixture及conftest详解!

前言 fixture是在测试函数运行前后&#xff0c;由pytest执行的外壳函数。fixture中的代码可以定制&#xff0c;满足多变的测试需求&#xff0c;包括定义传入测试中的数据集、配置测试前系统的初始状态、为批量测试提供数据源等等。fixture是pytest的精髓所在&#xff0c;类似u…

单值二叉树的判断——递归

如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 根左右 ——递归 代码&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int v…

RobotFramework自动化测试框架的基础关键字

1.1.1 如何搜索RobotFramework的关键字 有两种方式可以快速的打开RIDE的关键字搜索对话框 1、选择菜单栏Tools->Search Keywords&#xff0c;然后会出现如下的关键字搜索对话框&#xff0c;这个对话框就类似提供了一个关键字的API的功能&#xff0c;提供了关键字的…

K8S:HPA pod水平自动伸缩

文章目录 一.HPA概念1.什么是HPA2.HPA原理 二.部署 metrics-server1.node节点上传镜像包2.master节点安装metrics-server 三.部署 HPA1.所有节点安装镜像2.master创建测试的 Pod 资源3.创建 HPA 控制器4.创建测试客户端容器5.弹性缩容 四.扩展1.资源限制 - Pod①资源限制的原理…

快速排序详解(递归实现与非递归实现)

目录 一、快速排序的基本思想 二、将序列划分成左右区间的常见方法 2.1hoare版本&#xff08;动图解释代码实现&#xff09; 2.2挖坑法 2.3前后指针法 三、快速排序的初步实现 四、快速排序的优化实现 4.1快排的特殊情况 4.2对区间划分代码的优化 4.3小区间优化 五、…

邮政编码,格式校验:@ZipCode(自定义注解)

目标 自定义一个用于校验邮政编码格式的注解ZipCode&#xff0c;能够和现有的 Validation 兼容&#xff0c;使用方式和其他校验注解保持一致&#xff08;使用 Valid 注解接口参数&#xff09;。 校验逻辑 有效格式 不能包含空格&#xff1b;应为6位数字&#xff1b; 不校验…

5G安卓核心板-MT6833/MT6853核心板规格参数

随着智能手机的不断发展&#xff0c;芯片技术在推动手机性能和功能方面发挥着关键作用。MT6833和MT6853安卓核心板是两款高度集成的基带平台&#xff0c;为LTE/5G/NR和C2K智能手机应用提供强大的处理能力和多样化的接口。 这两款安卓核心板都集成了蓝牙、FM、WLAN和GPS模块&…

CSS网页标题图案和LOGO SEO优化

favicon图标 将网页的头名字旁边放入一个图案 想将想要的图案切成png图片 然后把png图片转换成ico图案可以借助进行访问 将语法引用到head里面 SEO译为搜索引擎优化。是一种利用搜索引擎的规则提高网站有关搜索引擎的自然排名的方式 SEO的目的是对网站进行深度的优化&…

SQL Server 创建表

切换数据库&#xff0c;判断是否存在 --切换数据库 use DBTEST--判断表是否存在 --创建的所有表都可以在sys.boject中找到&#xff0c;所以这里在sys.objects中查找是否有名字为department的表并且type为U 即用户生成的表 if exists(select * from sys.objects where namedepa…

轻松制作SOP作业指导书:掌握流程,节省时间

企业启用标准作业程序sop能够将企业生产作业的操作步骤、技术经验以及要求用统一的格式描述记录下来&#xff0c;以此规范和指导日常的工作&#xff0c;sop这种形式对企业的长远发展和精益化生产有能够带来巨大的帮助。 制作sop作业指导书其一&#xff0c;能够把企业的技术、经…