• 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    样式部分

    .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;
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    脚本部分

    • 引入依赖
    // 导入依赖
    import { reactive } from "vue";
    
    // 页面属性
    
    // 下拉刷新
    const pullInfo = reactive({
      style: {},
      tipText: "",
      startY: 0,
      deltaY: 0,
      slowY: 0,
      resetTimer: null,
      resetTime: 500,
    });
    
    // 发送事件
    const emits = defineEmits(["load"]);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 开始下拉
    function handlerStart(e) {
      let startY = e.touches[0].pageY;
      pullInfo.style = "transition: transform 0s";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 下拉移动
    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)`;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 下拉结束
    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)";
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 复位
    function reset() {
      pullInfo.resetTimer = setTimeout(() => {
        pullInfo.tipText = "刷新成功!";
        pullInfo.resetTimer = setTimeout(() => {
          pullInfo.style = "transform: translateY(0)";
          clearTimeout(pullInfo.resetTimer);
        }, pullInfo.resetTime);
      }, pullInfo.resetTime);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    实战演练

    模板使用

    <q-pull
      ref="myPull"
      @load="loadSet">
      
      <view>
        <view
          v-for="(item, index) in pull.list"
          :key="index"
          >{{item}}view
        >
      view>
    q-pull>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    脚本使用

    定义数据
    // 列表
    const pull = reactive({
      list: [1, 2, 3, 4, 5, 6],
    });
    
    • 1
    • 2
    • 3
    • 4
    加载内容
    function loadSet() {
      // 请求数据
      setTimeout(() => {
        let num = Math.random() * 100;
        pull.list.push(num);
        if (proxy.$refs.myPull) {
          proxy.$refs.myPull.reset();
        }
      }, 3000);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    内置刷新

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

    引入配置

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

    {
      "path": "pages/index/pull-refresh",
      "style": {
        "navigationBarTitleText": "下拉刷新",
        "enablePullDownRefresh": true
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    {
      //...
      "app-plus": {
        "pullToRefresh": {
          "support": true,
          "color": "#24afd6",
          "style": "circle"
        }
      }
      // ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    页面引入

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

    监听下拉刷新

    // 监听下拉刷新
    onPullDownRefresh(() => {
      // 开始下拉刷新
      uni.startPullDownRefresh();
      // 获取数据
      getData();
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    停止下拉刷新

    // 获取数据
    function getData() {
      console.log("获取数据!");
      setTimeout(() => {
        uni.stopPullDownRefresh();
      }, 3000);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    案例展示

    自定义组件

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

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

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

    内置下拉刷新

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

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

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

    最后

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

  • 相关阅读:
    C# WPF 开发一个 Emoji 表情查看软件
    红细胞装载阿霉素/羟基喜树碱/丹参酮IIA磺酸钠/地塞米松磷酸钠/维生素K1制备方法
    docker运维之自定义网络配置
    英飞凌助攻马自达最新增程序电动车接入富田电机七合一驱动系统 | 百能云芯
    初始 c++(1)
    关于go语言的那点事
    通过ESXi Shell修改ESXi服务器时区
    python学习15--数据分析(matplotlib、numpy)
    【Linux】动静态库
    LeetCode 面试题 10.11. 峰与谷
  • 原文地址:https://blog.csdn.net/fed_guanqi/article/details/132949290