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

2023-09-17 18:58:24

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

目录

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

准备工作

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

原理分析

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

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

组件实现

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

模板部分

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

<view class="pull">
  <view
    id="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-pull
  ref="myPull"
  @load="loadSet">
  <!-- 插槽内容 -->
  <view>
    <view
      v-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 端效果
    在这里插入图片描述

  • 小程序端效果
    在这里插入图片描述

  • APP 端效果
    在这里插入图片描述

内置下拉刷新

  • h5 端效果
    在这里插入图片描述

  • 小程序端效果
    在这里插入图片描述

  • APP 端效果
    在这里插入图片描述

最后

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

更多推荐

基于Java+SpringBoot+Vue的在线音乐网站设计和实现

基于Java+SpringBoot+Vue的在线音乐网站设计和实现源码传送入口前言主要技术系统设计功能截图数据库设计代码论文目录订阅经典源码专栏Java项目精品实战案例《500套》源码获取源码传送入口前言大数据时代下,数据呈爆炸式地增长。为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已

介绍Spring Security框架,以及如何使用它实现应用程序的安全性

文章目录什么是SpringSecurity?SpringSecurity的工作原理如何使用SpringSecurity构建安全的应用程序步骤1:添加SpringSecurity依赖步骤2:配置SpringSecurity步骤3:配置安全性规则步骤4:创建用户和角色步骤5:创建自定义登录页面步骤6:运行应用程序总结🎈个

又一职业技术技能标准官宣!

为贯彻落实《关于深化人才发展体制机制改革的意见》,推动实施人才强国战略,促进专业技术人员提升职业素养、补充新知识新技能,实现人力资源深度开发,推动经济社会全面发展,根据《中华人民共和国劳动法》有关规定,工业和信息化部教育与考试中心联合有关部门组织并制定了《研发效能(DevOps)工程师国家职业技术认证》。其中包含两个方

美团笔试-小美的元素删除

小美的元素删除小美有一个数组,她希望删除k个元素,使得剩余的元素两两之间互为倍数关系。你能告诉小美有多少种删除方案吗?由于答案过大,请对10^9+7模。输入描述第一行输入两个整数n,k(1<=k<=n<=10^3)表示数组长度,删除的元素数量。第二行输入n,k个整数表示数组a(1<=ai<=10^9)。保证给定的数组中

Prometheus PromQL数据查询语言

PromQL简介PromQL(PrometheusQueryLanguage)是Prometheus内置的数据查询语言。支持用户进行实时的数据查询及聚合操作。Prometheus基于指标名称(metricsname)以及附属的标签集(labelset)唯一定义一条时间序列指标名称代表着监控目标上某类可测量属性的基本特征

C#中string类型是引用类型

.Net框架程序设计(修订版)中有这样一段描述:String类型直接继承自Object,这使得它成为一个引用类型,也就是说线程上的堆栈上不会驻留有任何字符串。名称CTS类型说明stringSystem.StringUnicode字符串stringstr1="hello";stringstr2="world";这是一个值

数据分析:利用gpt进行归因分析

prompt:你是某电商平台的一名数据分析师,发现昨日的GMV环比下降了5%,请对这数据变动做出归因。output:在电商行业中,GMV(总销售额)是一个非常重要的指标,用于衡量业务的整体健康状况。当GMV出现环比下降时,这通常意味着需要进行详细的分析以找出可能的原因。以下是一些可能导致GMV环比下降5%的因素,以及如

50行Python代码实现代理服务器的详细教程

代理服务器是一种位于客户端与目标服务器之间的中间服务器,它可以代表客户端发送请求,并将响应返回给客户端。通过搭建自己的代理服务器,我们可以实现请求的拦截、修改和转发等功能。本文将为大家介绍如何使用50行Python代码实现代理服务器。一、准备工作在开始之前,我们需要确保已经安装了以下库:socket:用于创建套接字和网

Canal 实现MySQL与Elasticsearch7数据同步

1工作原理canal模拟MySQLslave的交互协议,伪装自己为MySQLslave,向MySQLmaster发送dump协议MySQLmaster收到dump请求,开始推送binarylog给slave(即canal)canal解析binarylog对象(原始为byte流)优点:可以完全和业务代码解耦,增量日志订阅

百度APP iOS端包体积50M优化实践(六)无用方法清理

一、前言百度APP包体积经过一期优化,如无用资源清理,无用类下线,Xcode编译相关优化,体积已经有了明显的减少。但是优化后APP包体积在iPhone11上仍有350M的空间占用。与此同时百度APP作为百度的旗舰APP,业务迭代非常多且迅速,体积优化和防劣化仍然是当前阶段的一个核心任务。因此百度APP开启了粒度更小,修

php生成二维码合成文字、背景图并保存本地图片

目录1、实现效果,二维码二维码合成文字、背景图2、下载并引入qrcode3、创建static文件夹下载字体和背景图到这4、创建test2.php,合成代码1、实现效果,二维码二维码合成文字、背景图2、下载并引入qrcode1、到phpqrcpde官网下载类库,官网地址:http://phpqrcode.sourcefo

热文推荐