Vue H5(手写)实现下拉刷新

ops/2024/10/19 1:59:12/

当我们在做移动端的时候 ,经常会遇到订单列表或者首页,经常会遇到下拉刷新 ,但是我经常用到 Vant 组件库中的下拉刷新 ,但是Vant 中的下拉刷新 会有一些问题  就是刷新的时候,在将页面象上滑动 ,就会出现卡顿的状态 ,这样就会导致用户体验非常不好  ,偶然看到一个博主写的一篇文章 还挺好用的  我就拿来试一试  真的还可以

1. 首先 我们在 components 下创建一个 pullRefresh.vue 公共文件

<template><divclass="weui-pull-refresh"ref="scrollBox":style="style"@touchstart="touchStart"@touchmove="touchMove"@touchend="touchEnd"><div class="weui-pull-refreshing-box"><div v-if="moveState < 2">{{ moveState === 0 ? "下拉即可刷新..." : "释放即可刷新..." }}</div><div v-else><i class="weui-loading" /> 加载中...</div></div><div class="weui-pull-present-box"><slot /></div></div>
</template><script>
export default {name: "pull-refresh",data() {return {startY: "", //保存touch时的Y坐标moveDistance: 0, //保存向下滑动的距离moveState: 0, //开始滑动到结束后状态的变化 0:下拉即可刷新 1:释放即可刷新 2:加载中duration: 0, //动画持续时间,0就是没有动画};},computed: {style() {return {transition: `${this.duration}ms`,transform: `translate3d(0,${this.moveDistance}px, 0)`,};},},methods: {touchStart(e) {this.duration = 0; // 关闭动画this.moveDistance = 0; // 滑动距离归0this.startY = e.targetTouches[0].clientY; // 获得开始Y坐标},touchMove(e) {//这里是整个下拉刷新的核心let scrollTop =document.documentElement.scrollTop || document.body.scrollTop;//首先判断我们有没有滚动条,如果有,我们下拉刷新就不能启用。if (scrollTop > 0) return;let move = e.targetTouches[0].clientY - this.startY;//判断手指滑动的距离,只有为正数才代表用户下拉了。if (move > 0) {//阻止默认事件,在微信浏览器中尤为有用,至于为什么,你去试就知道了。e.preventDefault();//增加滑动阻力的感觉this.moveDistance = Math.pow(move, 0.8);if (this.moveDistance > 50) {//如果滑动距离大于50 那我就告诉你,释放即可刷新if (this.moveState === 1) return;this.moveState = 1;} else {//否则 恢复原样if (this.moveState === 0) return;this.moveState = 0;}}},touchEnd(e) {// 只要手指拿开,我都需要加上结束时的动画,这里为300msthis.duration = 300;if (this.moveDistance > 50) {//这里逻辑跟touchMove一样,但是需要真的加载数据了,那moveState变为2 所以加载动画在这出现this.moveState = 2;//因为还没加载完,我得让加载动画显示着,所以这里移动距离为50this.moveDistance = 50;this.$emit("refresh", () => {//这里就是成功后的回调了,如果该函数被调用,那就以为着加载数据完成,所以状态要回到0,当然需要在父组件调用。this.moveState = 0;});} else {//否则 给我老老实实恢复原样this.moveDistance = 0;}},},watch: {//这里是给用户操作返回的核心moveState(state) {//我们监听moveState的状态,//0意味着开始也意味着结束,这里是结束,并且只有动画生效我们才能 moveDistance 设为0,//为什么动画生效才行,因为动画生效意味着手指离开了屏幕,如果不懂去看touchEnd方法,这时//我们让距离变为0才会有动画效果。if (state === 0 && this.duration === 300) {this.moveDistance = 0;}},},
};
</script>
<!-- css我就不讲了,你肯定比我厉害 -->
<style scoped lang="scss">
.weui-pull-refresh {display: flex;height: calc(100vh - 5px);flex-direction: column;margin-top: -50px;.weui-pull-refreshing-box {line-height: 50px;height: 50px;font-size: 14px;color: rgba(69, 90, 100, 0.6);text-align: center;margin-bottom: 20px;}.weui-pull-present-box {background-color: lighten(#fff, 10%);}
}
</style>

2. 我们在 main.js 中 进行全局的注册和引入 这样就不会在 每个页面中 都要引入了 

javascript">import pullRefresh from '@/components/pullRefresh'
Vue.component('pull-refresh',pullRefresh)

3. 我们创建一个 Scroll.vue 文件夹

javascript"><template><pull-refresh @refresh="refresh"><div class="content"><p class="text">基础用法</p>刷新次数:{{ num }}</div></pull-refresh>
</template><script>
export default {data() {return {num: 0,};},methods: {refresh(done) {setTimeout(() => {this.num++;done(); //我就想说这里,把状态归0}, 500);},},
};
</script><style scoped lang="scss">
.content {padding: 0 15px;.text {font-size: 14px;color: rgba(69, 90, 100, 0.6);}
}
</style>

 

这样就可以实现下拉刷新了 


http://www.ppmy.cn/ops/121943.html

相关文章

Oracle bbed编译安装及配置

1. 什么是bbed &#xff1f; Oracle Block Brower and EDitor Tool,是一个可以对oracle data block进行查看&#xff0c;编辑修改的内置工具。对于bbed&#xff0c;oracle本身是不提供支持的。 2. 如何编译bbed环境&#xff1f; 10g版本&#xff1a; 1) 编译bbed cd $ORACL…

RabbitTemplate与AmqpTemplate:Spring AMQP中的消息传递模板

在Spring AMQP和RabbitMQ的集成中&#xff0c;RabbitTemplate与AmqpTemplate是两个至关重要的消息传递模板。虽然两者在功能上有所重叠&#xff0c;但它们各自具有独特的特点和适用场景。本文将深入探讨RabbitTemplate与AmqpTemplate之间的区别&#xff0c;以帮助开发者更好地理…

国内超声波清洗机哪个品牌好?力荐四款超耐用超声波清洗机!

超声波清洗机作为一款高效实用的家庭与专业清洁利器&#xff0c;能够迅速且彻底地清洁多样化的物件。面对市场上琳琅满目的品牌与型号&#xff0c;每一款都各具特色与优势&#xff0c;故在决定购买前做足调研显得尤为重要&#xff0c;以免购入不尽如人意的产品&#xff0c;造成…

深度学习全景进阶:最新Python深度学习进阶与前沿应用

近年来&#xff0c;伴随着以卷积神经网络&#xff08;CNN&#xff09;为代表的深度学习的快速发展&#xff0c;人工智能迈入了第三次发展浪潮&#xff0c;AI技术在各个领域中的应用越来越广泛。注意力机制、Transformer模型&#xff08;BERT、GPT-1/2/3/3.5/4、DETR、ViT、Swin…

医药行业的智能合同审查:大模型与AI赋能合规管理

随着医药行业的快速发展&#xff0c;尤其是在全球化背景下&#xff0c;企业在业务拓展、合作协议签订中需要处理大量复杂的合同。合同不仅是业务的法律保障&#xff0c;更是风险管理的重要工具。医药行业合同审查的复杂性源于其严格的合规性要求&#xff0c;包括与政府机构、研…

PostgreSQL的pglz使用限制

PostgreSQL的pglz使用限制 在 PostgreSQL 中&#xff0c;PGLZ&#xff08;PostgreSQL Lightweight Compression Algorithm&#xff09;是一种用于压缩数据的算法&#xff0c;主要用于 TOAST&#xff08;The Oversized-Attribute Storage Technique&#xff09;机制。PGLZ 的使…

地理定位营销与开源AI智能名片O2O商城小程序的融合与发展

摘要&#xff1a;本文阐述地理定位营销的概念、手段及其在商业中的应用&#xff0c;探讨开源AI智能名片O2O商城小程序如何与地理定位营销相结合&#xff0c;为企业营销带来新的机遇与挑战。 一、引言 在当今数字化营销的时代&#xff0c;地理定位营销已成为一种重要的营销手段…

潮汕自闭症学校寄宿制度解读:了解学生生活

自闭症儿童的温馨港湾&#xff1a;广州星贝育园寄宿制学校 自闭症&#xff0c;这一复杂的神经发育障碍&#xff0c;影响着无数孩子的成长之路。他们面临着语言障碍、社交障碍以及刻板行为等多重挑战&#xff0c;使得日常生活和学习变得尤为艰难。然而&#xff0c;在广州&#…