vue3 实现一个下拉刷新

1. 实现最简单的下拉刷新雏形


<template><div class="wrap" ref="freshcontainer" @touchstart="handlerstart"  @touchmove="handlermove" @touchend="handlerend"><div  class="fresh_txt"  v-if="moveDistance>0">释放即可刷新</div><slot></slot></div></template><script setup>
import { ref } from "vue";
const startLocation = ref(0);
const freshcontainer = ref(null);
const moveDistance = ref(0); //移动的位置const isTransition = ref(false); //移动的J距离const handlerstart = e => {startLocation.value = e.touches[0].pageY;};
const handlermove = e => {moveDistance.value = Math.floor(e.touches[0].pageY - startLocation.value);freshcontainer.value.style.transform = `translateY(${moveDistance.value}px)`;
};
const handlerend = e => {moveDistance.value = 0;isTransition.value = true;freshcontainer.value.style.transform = `translateY(0px)`;};
</script><style scoped>
.fresh_txt,
.load_txt {text-align: center;color: #ccc;
}
.ani {transition: all 0.2s;
}
</style>

2 优化体验。当手指滑动到一定距离以后禁止再继续往下滑动,同时给手指松开的时候添加动画效果,当手指抬起时,添加文本提示加载中....增强体验感


<template><div :class="[{'ani':isTransition},'wrap']" ref="freshcontainer" @touchstart="handlerstart"  @touchmove="handlermove" @touchend="handlerend"><div  class="fresh_txt"  v-if="moveDistance>0">释放即可刷新</div><div  class="load_txt"  v-if="loading">加载中...</div><slot></slot></div></template><script setup>
import { ref } from "vue";
const startLocation = ref(0);
const freshcontainer = ref(null);
const moveDistance = ref(0); //移动的位置
const loading= ref(false); //移动的位置
const isTransition = ref(false); //移动的J距离
const loading = ref(false); //移动的J距离const handlerstart = e => {startLocation.value = e.touches[0].pageY;isTransition.value = false;console.log("startLocation:", startLocation.value);
};
const handlermove = e => {moveDistance.value = Math.floor(e.touches[0].pageY - startLocation.value);// console.log("moveDistance.value:", moveDistance.value);if (moveDistance.value > 100) {moveDistance.value = 100;}freshcontainer.value.style.transform = `translateY(${moveDistance.value}px)`;
};
const handlerend = e => {moveDistance.value = 0;isTransition.value = true;
loading.value = true;freshcontainer.value.style.transform = `translateY(0px)`;};
</script><style scoped>
.fresh_txt,
.load_txt {text-align: center;color: #ccc;
}
.ani {transition: all 0.2s;
}
</style>

3 把加载中的状态单独抽离出来,在父组件中用v-model去控制。


<template><div :class="[{'ani':isTransition},'wrap']" ref="freshcontainer" @touchstart="handlerstart"  @touchmove="handlermove" @touchend="handlerend"><div  class="fresh_txt"  v-if="moveDistance>0">释放即可刷新</div><div  class="load_txt"  v-if="modelValue">加载中...</div><slot></slot></div></template><script setup>
import { ref } from "vue";
const startLocation = ref(0);
const freshcontainer = ref(null);
const moveDistance = ref(0); //移动的位置const isTransition = ref(false); //移动的J距离
const loading = ref(false); //移动的J距离
const props = defineProps({modelValue: {type: Boolean,default: false}
});
const emit = defineEmits(["update:modelValue", "refresh"]);
const handlerstart = e => {startLocation.value = e.touches[0].pageY;isTransition.value = false;console.log("startLocation:", startLocation.value);
};
const handlermove = e => {moveDistance.value = Math.floor(e.touches[0].pageY - startLocation.value);// console.log("moveDistance.value:", moveDistance.value);if (moveDistance.value > 100) {moveDistance.value = 100;}freshcontainer.value.style.transform = `translateY(${moveDistance.value}px)`;
};
const handlerend = e => {moveDistance.value = 0;isTransition.value = true;freshcontainer.value.style.transform = `translateY(0px)`;emit("update:modelValue", true);emit("refresh");
};
</script><style scoped>
.fresh_txt,
.load_txt {text-align: center;color: #ccc;
}
.ani {transition: all 0.2s;
}
</style>------------------------------------------------------------------------
//父组件中的使用<script setup>
import { ref } from "vue";import reftest from "./components/reftest.vue";
const arr = [{ id: "001", name: "标题一" },{ id: "002", name: "标题二" },{ id: "003", name: "标题三" }
];
const loading = ref(false);
const getList = () => {setTimeout(() => {loading.value = false;}, 2000);
};
</script><template><reftest v-model="loading" @refresh="getList"><div class="item" v-for="item in arr" :key="item.id">{{item.name}}</div>
</reftest ></template><style scoped>
.item {padding: 10px 0;border-bottom: 1px solid #ccc;
}
</style>

4 插件化,把该组件注册成一个全局组件。

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import refresh from "./components/reftest"const app = createApp(App)
app.component("pullRefresh", refresh)
app.use(ElementPlus)
app.config.globalProperties.cons = cons
app.mount('#app')--------------------------------------------------
//组件中使用
<script setup>
import { ref } from "vue";const arr = [{ id: "001", name: "标题一" },{ id: "002", name: "标题二" },{ id: "003", name: "标题三" }
];
const loading = ref(false);
const getList = () => {setTimeout(() => {loading.value = false;}, 2000);
};
</script><template><pullRefresh v-model="loading" @refresh="getList"><div class="item" v-for="item in arr" :key="item.id">{{item.name}}</div>
</pullRefresh><!-- <GRID></GRID> -->
</template><style scoped>
.item {padding: 10px 0;border-bottom: 1px solid #ccc;
}
</style>

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

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

相关文章

【音视频SDK测评】线上K歌软件开发技术选型

摘要 在线K歌软件的开发有许多技术难点&#xff0c;需考虑到音频录制和处理、实时音频传输和同步、音频压缩和解压缩、设备兼容性问题等技术难点外&#xff0c;此外&#xff0c;开发者还应关注音乐版权问题&#xff0c;确保开发的应用合规合法。 前言 前面写了几期关于直播 …

vue项目在body设置公共的背景前提下,区分首页背景图和其他页面背景图

1.需求:在vue项目已设置统一的body背景图的前提,单独给首页换一个背景图,然后其他页面背景图不变的临时需求 实现思路1:在首页home.vue中 在公共的style.css文件中写上两个背景样式(写在公共样式中是因为style.css比组件内部的先加载,避免页面出现后背景空白的问题) …

十四.redis哨兵模式

redis哨兵模式 1.概述2.测试3.哨兵模式优缺点 redis哨兵模式基础是主从复制 1.概述 主从切换的技术方法&#xff1a;当主节点服务器宕机后&#xff0c;需要手动把一台从服务器切换为主服务器&#xff0c;这就需要人工干预&#xff0c;费时费力&#xff0c;还会造成一段时间内服…

单例模式和工厂模式

目录 今日良言&#xff1a;关关难过关关过&#xff0c;步步难行步步行 一、单例模式 1.饿汉模式 2.懒汉模式 二、工厂模式 今日良言&#xff1a;关关难过关关过&#xff0c;步步难行步步行 一、单例模式 首先来解释一下&#xff0c;什么是单例模式。 单例模式也就是单个…

【动态规划刷题 4】礼物的最大价值下降路径最小和

礼物的最大价值 在一个 m*n 的棋盘的每一格都放有一个礼物&#xff0c;每个礼物都有一定的价值&#xff08;价值大于 0&#xff09;。你可以从棋盘的左上角开始拿格子里的礼物&#xff0c;并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值…

以指标驱动,保险、零售、制造企业开启精益敏捷运营的新范式

近日&#xff0c;以“释放数智生产力”为主题的 Kyligence 用户大会在上海前滩香格里拉大酒店成功举行。大会包含上午的主论坛和下午的 4 场平行论坛&#xff0c;并举办了闭门会议、Open Day 等活动。来自金融、零售、制造、医药等行业的客户及合作伙伴带来了超过 23 场主题演讲…

AI驱动的靶点发现综述

疾病建模和靶点识别是药物发现中最关键的初始步骤。传统的靶点识别是一个耗时的过程&#xff0c;需要数年至数十年的时间&#xff0c;并且通常从学术报告开始。鉴于其分析大型数据集和复杂生物网络的优势&#xff0c;人工智能在现代药物靶点识别中发挥着越来越重要的作用。该综…

奥威BI系统:零编程建模、开发报表,提升决策速度

奥威BI是一款非常实用的、易用、高效的商业智能工具&#xff0c;可以帮助企业快速获取数据、分析数据、展示数据。值得特别注意的一点是奥威BI系统支持零编程建模、开发报表&#xff0c;是一款人人都能用的大数据分析系统&#xff0c;有助于全面提升企业的数据分析挖掘效率&…

[Docker实现测试部署CI/CD----自由风格的CI操作[最终架构](5)]

目录 11、自由风格的CI操作&#xff08;最终&#xff09;Jenkins容器化实现方案修改 docker.sock 权限修改 Jenkins 启动命令后重启 Jenkins构建镜像推送到Harbor修改 daemon.json 文件Jenkins 删除构建后操作Jenkins 添加 shell 命令重新构建 Jenkins通知目标服务器拉取镜像目…

Three.js加载drc文件

使用FileLoader和DracoLoader加载 DracoLoader也可以加在但是不知为何 和FileLoader一起用才能加载完整的资源 const fileLoader new THREE.FileLoader();const dracoLoader new DRACOLoader(); dracoLoader.setDecoderConfig({ type: "js" }); dracoLoader.setDec…

C#核心知识回顾——19.插入排序

1.插入排序的基本原理 871542639 两个区域 排序区 未排序区 用一个索引值做分水岭 未排序区元素 与排序区元素比较 插入到合适位置 直到未排序区清空 int[] arr { 8, 6, 7, 2, 9, 4 };//第一步//能取出未排序区…

IL汇编实现两数相加输出结果

话说前面没有实现IL汇编2数相加&#xff1b;鼓捣了一下&#xff0c;实现的代码如下&#xff1b; .assembly extern mscorlib {}.assembly Test{.ver 1:0:1:0}.module test.exe.method static void main() cil managed{.maxstack 8.entrypoint.locals init (int32 V_0, int3…

[FlareOn6]FlareBear

前言 apk的逆向&#xff0c;没有壳&#xff0c;但可能做的不是太多&#xff0c;没能想到整个算法的运作原理 分析 搜索flag会发现存在这么一个函数&#xff0c;那么显示flag的时候应该是熊会跳舞显示flag,只要满足熊happy和ecsstatic就可以&#xff0c;happy只要一直存在点击…

Open3D (C++) 计算矩阵的广义逆

目录 一、算法原理1、广义逆2、计算过程二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。爬虫网站自重,把自己当个人,爬些不完整的误导别人有意思吗???? 一、算法原理 1、广义逆 非方阵不存在逆,但是存在广义逆(伪逆)。对于一个矩阵

FPGA初步学习之串口发送模块【单字节和字符串的发送】

串口相关简介 UART 在发送或接收过程中的一帧数据由4部分组成&#xff0c;起始位、数据位、奇偶校验位和停止位&#xff0c;如图所示。其中&#xff0c;起始位标志着一帧数据的开始&#xff0c;停止位标志着一帧数据的结束&#xff0c;数据位是一帧数据中的有效数据。 通常用…

springboot-mybatis的增删改查

目录 一、准备工作 二、常用配置 三、尝试 四、增删改查 1、增加 2、删除 3、修改 4、查询 五、XML的映射方法 一、准备工作 实施前的准备工作&#xff1a; 准备数据库表 创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动…

【BASH】回顾与知识点梳理(五)

【BASH】回顾与知识点梳理 五 五. 数据流重导向5.1 什么是数据流重导向standard output 与 standard error output/dev/null 垃圾桶黑洞装置与特殊写法standard input &#xff1a; < 与 << 5.2 命令执行的判断依据&#xff1a; ; , &&, ||cmd ; cmd (不考虑指…

jvm总结

1.jvm内存结构&#xff1a;程序计数器、虚拟机栈、本地方法栈、java堆、方法区 程序计数器&#xff1a;线程私有的&#xff0c;一块很小的内存空间&#xff0c;作为当前线程的行号指示器&#xff0c;用于记录当前虚拟机正在执行的线程指令地址。虚拟机栈&#xff1a;线程私有的…

使用angular和electron 构建桌面应用

使用angular和electron 构建桌面应用 初始设置 新建一个angular app npm install -g @angular/cli ng new angular-electron cd angular-electron修改src/index.html文件内容 将绝对路径改为相对路径,加个点,使electron可以访问到angular文件资源 <base href=".…

SpringBoot复习:(20)如何把bean手动注册到容器?

可以通过实现BeanDefinitionRegistryPostProcessor接口&#xff0c;它的父接口是BeanFactoryPostProcessor. 步骤&#xff1a; 一、自定义一个组件类&#xff1a; package com.example.demo.service;public class MusicService {public MusicService() {System.out.println(&q…