首页 > 其他分享 >[vue] 在vue中手动实现下拉刷新功能

[vue] 在vue中手动实现下拉刷新功能

时间:2024-10-16 17:15:33浏览次数:7  
标签:style vue const move 手动 state isPulldown 刷新 ev

1. 下拉刷新组件

<template>
  <div
    class="box"
    ref="boxRef"
    @touchstart="touchstart"
    @touchmove="touchmove"
    @touchend="touchend"
    :style="style"
  >
    <slot />
  </div>
</template>

<script setup>
const state = reactive({
  isPulldown: false,
  startY: 0,
  move: 0,
  style: {
    transform: "translateY(0px)",
    transition: "none",
  },
});
const { style } = toRefs(state);

const boxRef = ref();
function touchstart(ev) {
  state.style.transition = "none";
  const isPulldown = boxRef.value.parentElement.scrollTop === 0;
  state.isPulldown = isPulldown;
  if (isPulldown) {
    state.startY = ev.targetTouches[0].screenY;
  }
}

function touchmove(ev) {
  if (!state.isPulldown) return;
  const y = ev.targetTouches[0].screenY;
  let move = y - state.startY;
  move = move > 80 ? 80 : move;
  if (move > 0) {
    state.move = move;
    state.style = {
      transform: `translateY(${move}px)`,
    };
  }
}

function touchend(ev) {
  if (!state.isPulldown) return;
  if (state.move > 60) {
    console.log("刷新数据");
  }
  if (state.move > 0) {
    state.style.transition = "0.3s";
    state.style.transform = "translateY(0px)";
    state.move = 0;
  }
}
</script>

<style lang="scss" scoped>
.box {
  &::before {
    content: "松开刷新";
    position: absolute;
    top: -80px;
    left: 0;
    height: 80px;
    width: 100%;
    z-index: 1;
    background: gray;
    color: red;
    font-size: 16px;
    text-align: center;
    line-height: 80px;
  }
}
</style>

2. 调用组件的login页面, 测试随便命名的

<template>
  <div class="container">
    <pulldown_refresh>
      <div class="item">1</div>
      <div class="item">2</div>
      <div class="item">3</div>
      <div class="item">4</div>
      <div class="item">5</div>
      <div class="item">6</div>
      <div class="item">7</div>
      <div class="item">8</div>
      <div class="item">9</div>
      <div class="item">10</div>
      <div class="item">11</div>
      <div class="item">12</div>
      <div class="item">13</div>
      <div class="item">14</div>
      <div class="item">15</div>
      <div class="item">16</div>
      <div class="item">17</div>
      <div class="item">18</div>
      <div class="item">19</div>
      <div class="item">20</div>
    </pulldown_refresh>
  </div>
</template>

<script setup>
import pulldown_refresh from "@/components/pulldown_refresh.vue";
</script>

<style lang="scss" scoped>
.container {
  // height: 100vh;
  // overflow-y: scroll;
}

@for $i from 1 through 20 {
  .item:nth-child(#{$i}) {
    height: 100px;
    background-color: rgb(random(255), random(255), random(255));
  }
}
</style>

 

原理就是监听移动端的滑动事件,关闭过渡效果,  判断用户滑动的距离, 然后通过transform Y轴移动

用户松开手指的时候, 开启过渡效果, 让transform的值归零, 如果滑动距离足够, 就触发 父组件 的刷新事件(打印,未在demo中实现), 其他的都是边角的兼容问题

 

标签:style,vue,const,move,手动,state,isPulldown,刷新,ev
From: https://www.cnblogs.com/fmg0224/p/18470344

相关文章

  • 代码实战-前端-Vue ElementUI 调用摄像头并上传到后端的代码案例
    先上效果图调用摄像头的图片拍照的图片上传文件的效果图查看上传的图片(上传完的图片合并成一个PDF)引入插件--引入组件importCameraImagefrom'@/components/CameraImage/CameraComponets.vue';--放在vue的components中components:{CameraIm......
  • 修改当前路由地址参数重新刷新页面
    需求:不允许token暴漏在地址栏拿到token放到sessionStorage里面并重新刷新地址所有统一使用query的页面就直接替换为sessionStoragerouter.beforeEach((to,from,next)=>{//...其他代码...//检查是否有token参数if(to.query.token){//存储token到ses......
  • 基于数据可视化+SpringBoot+Vue的考研备战交流与分享平台设计和实现(源码+论文+部署讲
     博主介绍:✌全网粉丝50W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs......
  • vue3简单使用threejs立方缓冲几何体(BoxGeometry)
    文章目录前言一、安装three二、使用步骤1.导入three、建立场景、相机和渲染器2.添加立方体3.渲染循环三、其他1.轨道控制器OrbitControls和坐标轴辅助对象AxesHelper2.GUI创建可交互的控件(点击全屏+退出全屏)3.监听窗口的变化执行一些重置操作四、完整代码五、效......
  • vue脚手架的安装
    1.安装vscode2.安装node3.换淘宝源npmconfigsetregistryhttps://registry.npmmirror.com4.安装vue和vue脚手架npminstallvuenpminstall-g@vue/cli5.新建文件夹,创建一个项目vuecreatemy_project6.把这个文件夹拖入vscode中。打开项目7.ctrl+~打开控制......
  • vue+element+Cascader 级联选择器任意一级选项,去掉单选框radio
         <template><divclass="block"><h1class="demonstration">选中的值:{{value}}</h1><el-cascader:options="options"v-model="value"popper-class="cas......
  • 基于Node.js+vue个人博客系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网技术的快速发展,个人博客作为一种重要的网络应用形式,逐渐成为人们表达自我、分享知识和经验的重要平台。博客不仅能够记录个人的成长历程、生活点......
  • 基于Node.js+vue会议管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着信息化时代的到来,各类会议活动日益频繁,会议管理成为组织工作中不可或缺的一环。传统的会议管理方式往往依赖于纸质记录和人工协调,不仅效率低下,还容易出......
  • 基于Node.js+vue高校食堂饭卡管理(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景高校食堂作为学生学习和生活的重要场所,其管理效率和便捷性直接关系到学生的日常生活质量。传统的高校食堂饭卡管理方式往往依赖于人工操作和纸质记录,这不仅......
  • 基于SpringBoot+Vue的校园周边美食探索及分享平台的设计与实现(带文档)
    基于SpringBoot+Vue的校园周边美食探索及分享平台的设计与实现(带文档)开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue等工具:IDEA/Ecilpse、Navicat、Maven源码校园周边美食探索及分享平台是一个旨在为校园用户提供便捷的美食发现和分享服务的系统。该平台通过现......