uniapp项目实践总结(十六)自定义下拉刷新组件

news/发布时间2024/5/13 11:07:10

导语:在日常的开发过程中,我们经常遇到下拉刷新的场景,很方便的刷新游览的内容,在此我也实现了一个下拉刷新的自定义组件。

目录

  • 准备工作
  • 原理分析
  • 组件实现
  • 实战演练
  • 内置刷新
  • 案例展示

准备工作

  • components新建一个q-pull文件夹,并新建一个q-pull.vue的组件;
  • 按照前面文章所说的页面结构,编写好预定的自定义下拉刷新组件页面;

原理分析

自定义下拉刷新就是在之前自定义滑动触摸组件的基础上,在顶部增加一个刷新的模块。

在页面下拉的时候,判断是否为下滑的方向,如果是就获取数据,数据请求完成后,隐藏刷新模块即可。

组件实现

准备工作和原理分析完成后,接下来写一个简单的组件。

模板部分

这部分主要是显示动画、提示、颜色、背景色以及控制是否展示页面。

<view class="pull"><viewid="pull-container":style="pullInfo.style"ref="pullBox"@touchstart="handlerStart"@touchmove="handlerMove"@touchend="handlerEnd"><view class="pull-head"><view class="pull-text"> {{ pullInfo.tipText }} </view></view><view class="pull-body"><slot></slot></view></view>
</view>

样式部分

.pull {position: relative;width: 100%;height: 100%;#pull-container {position: relative;width: 100%;height: 100%;.pull-head {position: absolute;left: 0;top: 0;width: 100%;text-align: center;transform: translateY(-100%);.pull-text {padding: 30rpx 0;color: $mainColor;font-size: 26rpx;background: $f8;font-weight: bold;}}.pull-body {box-sizing: border-box;padding: 60rpx;text-align: left;font-size: 28rpx;}}
}

脚本部分

  • 引入依赖
// 导入依赖
import { reactive } from "vue";// 页面属性// 下拉刷新
const pullInfo = reactive({style: {},tipText: "",startY: 0,deltaY: 0,slowY: 0,resetTimer: null,resetTime: 500,
});// 发送事件
const emits = defineEmits(["load"]);
  • 开始下拉
function handlerStart(e) {let startY = e.touches[0].pageY;pullInfo.style = "transition: transform 0s";
}
  • 下拉移动
function handlerMove(e) {e.preventDefault();pullInfo.deltaY = e.touches[0].pageY - pullInfo.startY;if (pullInfo.deltaY > 0) {pullInfo.tipText = "下拉刷新";if (pullInfo.deltaY > 60) {pullInfo.tipText = "松开刷新";pullInfo.slowY = (pullInfo.deltaY - 60) * 0.2 + 60;} else {pullInfo.slowY = pullInfo.deltaY;}pullInfo.style = `transform: translateY(${pullInfo.slowY * 2}rpx)`;}
}
  • 下拉结束
function handlerEnd(e) {pullInfo.style = "transition: transform .5s";if (pullInfo.deltaY > 60) {pullInfo.tipText = "正在加载中...";pullInfo.style = "transform: translateY(95rpx)";emits("load");} else {pullInfo.style = "transform: translateY(0)";}
}
  • 复位
function reset() {pullInfo.resetTimer = setTimeout(() => {pullInfo.tipText = "刷新成功!";pullInfo.resetTimer = setTimeout(() => {pullInfo.style = "transform: translateY(0)";clearTimeout(pullInfo.resetTimer);}, pullInfo.resetTime);}, pullInfo.resetTime);
}

实战演练

模板使用

<q-pullref="myPull"@load="loadSet"><!-- 插槽内容 --><view><viewv-for="(item, index) in pull.list":key="index">{{item}}</view></view>
</q-pull>

脚本使用

定义数据

// 列表
const pull = reactive({list: [1, 2, 3, 4, 5, 6],
});

加载内容

function loadSet() {// 请求数据setTimeout(() => {let num = Math.random() * 100;pull.list.push(num);if (proxy.$refs.myPull) {proxy.$refs.myPull.reset();}}, 3000);
}

内置刷新

uniapp 也为我们开发者准备了内置下拉刷新,一起去看看如何使用吧。

引入配置

pages.json文件中找到需要下拉刷新的页面中加入以下配置。

{"path": "pages/index/pull-refresh","style": {"navigationBarTitleText": "下拉刷新","enablePullDownRefresh": true}
}

可以在 APP 端自定义样式,在enablePullDownRefresh下面添加如下配置:

{//..."app-plus": {"pullToRefresh": {"support": true,"color": "#24afd6","style": "circle"}}// ...
}

页面引入

import { onPullDownRefresh } from "@dcloudio/uni-app";

监听下拉刷新

// 监听下拉刷新
onPullDownRefresh(() => {// 开始下拉刷新uni.startPullDownRefresh();// 获取数据getData();
});

停止下拉刷新

// 获取数据
function getData() {console.log("获取数据!");setTimeout(() => {uni.stopPullDownRefresh();}, 3000);
}

案例展示

自定义组件

  • h5 端效果
    image

  • 小程序端效果
    image

  • APP 端效果
    image

内置下拉刷新

  • h5 端效果
    image

  • 小程序端效果
    image

  • APP 端效果
    image

最后

以上就是自定义下拉刷新组件的主要内容,有不足之处,请多多指正。

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

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

day04-数据类型

1、基本数据类型 在我们的之前篇day02-变量中,我们介绍了变量及变量的赋值,我们都知道变量是存储在内存中的值,其实在内存中是会根据变量的数据类型,来分配指定的内存空间,那这变量的数据类型有哪些呢? Python的基本数据类型一般分为6种:Numbers(数值) String(字符串…

[CTS2023] 另一个欧拉数问题 解析

还是搬运一下自己的 slide... 这可能是我最不讲武德的一次出题... 大家笑一笑就好...题目大意 对于正整数 \(\alpha\), 考虑下述长为 \(\alpha n\) 的序列 \(a\):对于每个 \(k=1,\dots, n\), 序列 \(a\) 中出现了恰好 \(\alpha\) 个 \(k\). 对于 \(i < j\) 满足 \(a_i = a_j…

CentOS8部署NextCloud+onlyoffice笔记

通过宝塔一键部署 一、安装宝塔yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 二、从宝塔Docker快速部署安装NextCloud。 一键部署,按照向导逐步安装 三、安装onlyoffice应用1、安装onlyoffice文…

Unix/Linux系统编程学习笔记二

学习笔记二 一、教材知识点总结 1. I/O库函数程序(1)fopen()使用字符串表示模式,其中"r"表示READ"w"表示WRITE。它返回一个指向FILE结构体的指针。fopen()首先发出open()系统调用来打开文件,以获取文件描述符编号fd。如果open0系统调用失败,则fopen()会…

应用层-常见协议

应用层概述:TCP/IP模型的最高层 直接为应用程序提供网络服务 常用的应用层协议:DNS HTTP SMPT与POP3/IMAP Telnet FTP与TFTP DNS协议: DNS(Domain Name System 域名解析系统)建立IP地址与域名之间的映射关系 将域名解析为IP地址 将IP地址解析为域名DSN解析过程:主机A向D…