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

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

目录

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

准备工作

  • 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 端效果
    在这里插入图片描述

最后

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uni-app中,你可以通过自定义组件来实现scroll-view的自定义下拉效果。下面是一个简单的示例: 1. 首先,创建一个自定义组件,比如命名为CustomScrollView。 在CustomScrollView.vue文件中,可以定义一个容器元素和一个下拉刷新的提示元素,如下所示: ```html <template> <view class="custom-scroll-view"> <view class="refresh-indicator" v-show="showRefreshIndicator"> <!-- 自定义下拉刷新的内容 --> <!-- ... --> </view> <scroll-view class="scroll-view-content"> <!-- scroll-view的内容 --> <!-- ... --> </scroll-view> </view> </template> <script> export default { data() { return { showRefreshIndicator: false, // 是否显示下拉刷新提示 startY: 0, // 记录开始滑动的位置 }; }, methods: { onTouchStart(e) { this.startY = e.touches[0].clientY; }, onTouchMove(e) { const currentY = e.touches[0].clientY; const distance = currentY - this.startY; if (distance > 0 && this.$refs.scrollView.scrollTop === 0) { // 下拉到顶部了,显示下拉刷新提示 this.showRefreshIndicator = true; } else { // 没有下拉到顶部,隐藏下拉刷新提示 this.showRefreshIndicator = false; } }, onTouchEnd() { if (this.showRefreshIndicator) { // 触发下拉刷新事件 this.$emit('refresh'); } this.showRefreshIndicator = false; }, }, }; </script> <style scoped> .custom-scroll-view { position: relative; height: 100%; } .refresh-indicator { position: absolute; top: -50px; /* 下拉刷新提示的高度 */ left: 0; right: 0; height: 50px; /* 下拉刷新提示的高度 */ } .scroll-view-content { height: 100%; } </style> ``` 2. 在使用CustomScrollView组件的页面中,可以引入该组件并监听其下拉刷新事件,如下所示: ```html <template> <view> <!-- ... --> <custom-scroll-view @refresh="onRefresh"> <!-- ... --> </custom-scroll-view> </view> </template> <script> import CustomScrollView from '@/components/CustomScrollView'; export default { components: { CustomScrollView, }, methods: { onRefresh() { // 处理下拉刷新逻辑 // ... }, }, }; </script> ``` 通过以上步骤,你就可以实现自定义下拉刷新效果了。当用户在CustomScrollView组件内部下拉到顶部时,会触发refresh事件,你可以在onRefresh方法中处理下拉刷新的逻辑,例如发送网络请求获取最新数据,然后更新页面内容。 需要注意的是,以上示例是基于uni-app框架的实现方式,如果你使用的是其他框架或原生开发,具体实现方式可能会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值