Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【愚公系列】2022年08月 微信小程序-下拉刷新功能实现

【愚公系列】2022年08月 微信小程序-下拉刷新功能实现

作者头像
愚公搬代码
发布于 2022-09-26 10:49:30
发布于 2022-09-26 10:49:30
76300
代码可运行
举报
文章被收录于专栏:历史专栏历史专栏
运行总次数:0
代码可运行

文章目录


前言

下拉刷新是移动端的专有名词,是指通过手指在屏幕上的下拉滑动操作,从而重新加载页面数据的行为。

一、下拉刷新功能实现

1.自定义下拉刷新

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<wxs module="refresh">
var pullingMessage = "下拉刷新"

module.exports = {
	onRefresh: function(e, instance) {
		// 此时手拉开了,进入了加载中的状态
		pullingMessage = "更新中"
		console.log(pullingMessage)
		instance.callMethod("setData", {
			pullingMessage: pullingMessage,
			refresherTriggered: true
		})
		instance.callMethod("willCompleteRefresh", {})
	},
	onAbort: function(e, instance) {
		// 异常状态,例如被事件突然打断,事件包括电话等,被迫松手了
		pullingMessage = "下拉刷新"
		console.log(pullingMessage)
	},
	onRestore: function(e, instance) {
		// 回去了,松手了,恢复原位了,不刷了
		pullingMessage = "下拉刷新"
		console.log(pullingMessage)
	},
	onPulling: function(e, instance) {
		// 80的高度,因为refresher-threshold设置的是80,手指按住往下拉的状态
		var p = Math.min(e.detail.dy / 80, 1)
		// console.log(p)
		// 这里在视图层,不怕频繁操作DOM
		var icon = instance.selectComponent('#refresherIcon')
		icon.setStyle({
			opacity: p,
			transform: "rotate(" + (90 + p * 180) + "deg)"
		})
		var view = instance.selectComponent('.refresh-container')
		view.setStyle({
			opacity: p,
			transform: "scale(" + p + ")"
		})
		if (e.detail.dy >= 80) {
			if (pullingMessage == "下拉刷新") {
				pullingMessage = "释放更新"
				instance.callMethod("setData", {
					pullingMessage
				})
			}
		}
	}
}
</wxs>

<view class="page-section">
	<view class="page-section-title">自定义下拉刷新</view>
	<scroll-view scroll-y style="width: 100%; height: 400px;overflow-anchor:auto;" bindscroll="onScroll" bindscrolltoupper="onScrolltoupper" scroll-top="{{scrollTopValue}}" scroll-into-view="{{scrollIntoViewId}}" scroll-with-animation enable-back-to-top enable-flex scroll-anchoring refresher-enabled refresher-threshold="{{80}}" refresher-default-style="none" refresher-background="#FFF" bindrefresherpulling="{{refresh.onPulling}}" bindrefresherrefresh="{{refresh.onRefresh}}" bindrefresherrestore="{{refresh.onRestore}}" bindrefresherabort="{{refresh.onAbort}}" refresher-triggered="{{refresherTriggered}}">
		<view slot="refresher" class="refresh-container" style="display: block; width: 100%; height: 80px; background: #F8f8f8; display: flex; align-items: center;">
			<view class="view1" style="position: absolute; text-align: center; width: 100%;display:flex;align-items:center;justify-content:center;color:#888;">
				<mp-icon id="refresherIcon" icon="arrow" color="#888" size="{{20}}" style="margin-right:5px;transform:rotate(90deg)"></mp-icon>
				<text style="min-width:80px;text-align:left;">{{pullingMessage}}</text>
			</view>
		</view>

		<view wx:for="{{arr}}" id="view{{item+1}}" style="display: flex;height: 100px;">
			<text style="position:relative;top:5px;left:5px;color:black;">{{item+1}}</text>
			<image src="https://img1.baidu.com/it/u=3749523982,1411558844&fm=253&fmt=auto&app=138&f=JPEG?w=1070&h=500"></image>
			<image src="https://img1.baidu.com/it/u=3749523982,1411558844&fm=253&fmt=auto&app=138&f=JPEG?w=1070&h=500"></image>
			<image src="https://img1.baidu.com/it/u=3749523982,1411558844&fm=253&fmt=auto&app=138&f=JPEG?w=1070&h=500"></image>
			<image src="https://img1.baidu.com/it/u=3749523982,1411558844&fm=253&fmt=auto&app=138&f=JPEG?w=1070&h=500"></image>
			<image src="https://img1.baidu.com/it/u=3749523982,1411558844&fm=253&fmt=auto&app=138&f=JPEG?w=1070&h=500"></image>
		</view>
	</scroll-view>
	<view class="btn-area">
		<button bindtap="plusScrollUpValue">向上滚动</button>
		<button bindtap="scrollToView1">滚动到子视图</button>
		<button bindtap="unshiftOnePic">顶部添加一张图</button>
	</view>
</view>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const app = getApp()
let viewId = 5
const createRecycleContext = require('miniprogram-recycle-view')
function rpx2px(rpx) {
  return (rpx / 750) * wx.getSystemInfoSync().windowWidth
}

Page({
  data: {
    arr: [],
    triggered: false,
    scrollTopValue:0,
    scrollIntoViewId:'',
    pullingMessage:'下拉刷新',//下拉刷新,释放更新,加新中...
    refresherTriggered:false,//
    tabs:[]
  },
  willCompleteRefresh(){
    console.log('更新中')
    let intervalId = setInterval(()=>{
      let pullingMessage = this.data.pullingMessage
      console.log(pullingMessage,pullingMessage == '更新中')
      if (pullingMessage.length < 7){
        pullingMessage += '.'
      }else{
        pullingMessage = '更新中'
      }
      this.setData({
        pullingMessage
      })
    },500)
    setTimeout(()=>{
      console.log('更新完成了')
      clearInterval(intervalId)
      this.setData({
        pullingMessage:"已刷新",
        refresherTriggered:false,
      })
    },2000)
  },
  unshiftOnePic(){
    let arr = this.data.arr
    arr.unshift(arr.length+1)
    this.setData({
      arr
    })
  },
  scrollToView1(){
    viewId += 2
    this.setData({
      scrollIntoViewId:'childview'+viewId
    })
    console.log(this.data.scrollIntoViewId)
  },
  plusScrollUpValue(){
    this.setData({
      scrollTopValue:this.data.scrollTopValue+50
    })
  },


  onPulling(e) {
    console.log('onPulling:', e)
  },

  onRefresh() {
    if (this._freshing) return
    this._freshing = true
    setTimeout(() => {
      this.setData({
        triggered: false,
      })
      this._freshing = false
    }, 3000)
  },
  onRestore(e) {
    console.log('onRestore:', e)
  },

  onAbort(e) {
    console.log('onAbort', e)
  },
  onScroll(e){
    console.log(e.detail.scrollTop, e.detail.scrollLeft, e.detail.scrollHeight,e.detail.scrollWidth)
  },
  onScrolltoupper(e){
    console.log('已达顶部后,小于50,是一种状态')
  },
})

2.recycle-view的使用

recycle-view是属于weui的组件,具体使用如下:

全局app.json

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"useExtendedLib": {
  "weui": true
}

页面的四个文件如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "component": true,
  "usingComponents": {
    "recycle-view": "miniprogram-recycle-view/recycle-view",
    "recycle-item": "miniprogram-recycle-view/recycle-item"
  },
  "pageOrientation": "auto"
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<view class="page-section">
	<view class="page-section-title">使用recycle-view扩展组件</view>
	<recycle-view height="200" batch="{{batchSetRecycleData}}" id="recycleId" batch-key="batchSetRecycleData" style="background:white;">
		<recycle-item wx:for="{{recycleList}}" wx:key="index" class='item'>
			<view>
				{{item.id}}: {{item.name}}
			</view>
		</recycle-item>
	</recycle-view>
</view>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const app = getApp()
let viewId = 5
const createRecycleContext = require('miniprogram-recycle-view')
function rpx2px(rpx) {
  return (rpx / 750) * wx.getSystemInfoSync().windowWidth
}

Page({
  data: {
  },
  onReady: function () {
    var ctx = createRecycleContext({
      id: 'recycleId',
      dataKey: 'recycleList',
      page: this,
      itemSize: {
        width: rpx2px(650),
        height: rpx2px(100)
      }
    })
    let newList = []
    for (let i = 0; i < 20; i++) {
      newList.push({
        id: i,
        name: `标题${i + 1}`
      })
    }
    ctx.append(newList)
      const arr = []
      for (let i = 0; i < 20; i++) arr.push(i)
      this.setData({
        arr
      })

      setTimeout(() => {
        this.setData({
          triggered: true,
        })
      }, 1000)
      // 
      let activeTab = 0, page=1, res = {something:''}
      let tabsData = this.data.tabs[activeTab] || {list:[]}
      tabsData.page = page+1
      tabsData.list.push(res)
      let key = `tabs[${activeTab}]`
      this.setData({
        [key]: tabsData
      })
      console.log(this.data.tabs)
  },
})

3.案例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//1 单击左侧菜单
menuListOnClick: function (e){
	let me=this;
	me.setData ({
		activeViewld:e.target.id,
		currentIndex:e.target.dataset.index
	})
}
//滚动时触发,计算当前滚动到的位置对应的菜单是哪个
scrollFunc:function (e){
	this.setData ({
		scrollTop:e.detail.scrollTop
	})
	for (let i= 0;i<this.data.heightList.length; i++){
		let height1 = this. data.heightlist [il;
		let height2 = this.data.heightList [i + 1];
		if (!height2ll (e.detail.scrollTop >= height1 && e.detail.scrollTop<height2)){
			this.setData ({
				currentIndex: i
			})
			return;
		}
	}
	this.setData ({
		currentIndex:0
	})
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/08/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
微信小程序实践:2.3 可滚动的容器组件之 scroll-view
说什么真理无穷,进一寸有一寸的欢喜。大家好,我是石桥码农,今天继续为大家分享微信小程序实践相关的技术内容。
LIYI
2020/04/15
16K1
微信小程序实践:2.3 可滚动的容器组件之 scroll-view
微信小程序官方组件展示之视图容器scroll-view
以下将展示小程序官方组件能力,组件样式仅供参考,开发者可根据自身需求定义组件样式,具体属性参数详见小程序开发文档。
软件事业部
2022/08/15
2.6K0
【愚公系列】2022年03月 微信小程序-视图容器
覆盖在原生组件之上的图片视图。可覆盖的原生组件同cover-view,支持嵌套在cover-view里。
愚公搬代码
2022/12/01
6710
【愚公系列】2022年03月 微信小程序-视图容器
微信小程序新闻信息列表展示
微信小程序信息展示列表 效果展示 wxml <!-- 轮播图 --> <view class='haibao' bindtap="seeDetail" id="{{item.activityCon
达达前端
2019/07/03
3.1K0
微信小程序新闻信息列表展示
【愚公系列】2022年08月 微信小程序-省市区三联动功能实现
多级联动下拉菜单是前端常见的效果,省市区三级联动又属于其中最典型的案例。多级联动一般都是与数据相关联的,根据数据来生成和修改联动的下拉菜单。完成一个多级联动效果,有助于增强对数据处理的能力。
愚公搬代码
2022/09/26
3.7K0
【愚公系列】2022年08月 微信小程序-省市区三联动功能实现
【愚公系列】2022年08月 微信小程序-纵向和横向选项卡功能实现
以下讲解的是weui版,相关的还有antd-mini版本:https://help.aliyun.com/document_detail/438087.html
愚公搬代码
2022/09/27
1.4K0
【愚公系列】2022年08月 微信小程序-纵向和横向选项卡功能实现
【愚公系列】2022年10月 微信小程序-电商项目-收货地址功能实现
在电商系统中,收货地址是必不可少的功能,没有收货地址用户在下单就没法收到货,而且一个用户会有多个收货地址,比如寄给自己,或者寄给别人。一搬在收货地址选择中会有个默认收货地址以防止每次下单都要选择地址。
愚公搬代码
2022/10/27
5680
微信小程序——轮播图、组件传值、下拉刷新、导航 实战开发
滑块视图容器。其中只可放置swiper-item组件,否则会导致未定义的行为。 属性表如下
wsuo
2020/09/22
1.7K0
小程序 下拉刷新 上拉加载
至此,一个简单的下拉刷新上拉加载基本搞定了。巧用微信的各种Api,就很舒服。 继续扩展的话: 1.updateDom那里下拉刷新是简单的清空重新加载,其实可以进行数组比较插入最新记录; 2.出错提示没加; 3.可以使用腾讯开源框架Wepy这种现代化的类Vue框架进行组件化开发。
从今若
2019/09/19
1.5K0
微信小程序实现下拉刷新怎么实现数据的追加
在微信小程序中提供了下拉刷新的api(onPullDownRefresh()),那么实现下拉刷新的业务就是再下拉的时候,在原有的数据中追加新的数据
天天_哥
2018/09/29
2.5K0
小程序百问百答
this对象在程序调用时,如点击事件中会随时改变,而var that=this之后,that没重新赋值之前仍然是指向当时的this,这样就不会出现找不到原来的对象而导致报错
用户10175992
2022/11/15
7550
小程序百问百答
【愚公系列】2022年02月 微信小程序-页面生命周期
注册小程序中的一个页面。接受一个 Object 类型参数,其指定页面的初始数据、生命周期回调、事件处理函数等。
愚公搬代码
2022/12/01
5720
基于腾讯云开发微信小程序(新闻发布及共享平台)下
微信小程序云开发是腾讯云和微信团队联合开发的,集成于微信小程序控制台的原生Serverless 云服务,解决了Serverless架构对端的“最后一公里”问题,通过集成端SDK,配合云开发后台的API网关,为开发者提供了一站式后端云服务。云开发支持多种客户端,帮助开发者统一构建和管理资源,免去了开发中服务器搭建、极大简化了URL配置、鉴权管理等流程,让微信小程序开发者专注于业务逻辑的实现,而无须理解后端逻辑及服务器运维知识,门槛更低,效率更高。只需要一名开发人员就可以完成所有的工作。
淼学派对
2022/11/20
3.4K0
基于腾讯云开发微信小程序(新闻发布及共享平台)下
【愚公系列】2022年09月 微信小程序-Page页面扩展
在小程序日常开发中,有些功能是所有页面都需要使用的,所以就需要对每个page页面进行扩展,在小程序中Page 的作用相当于构造函数, Page 会初始化页面对象然后将配置参数中的属性 merge 到页面对象上。
愚公搬代码
2022/09/27
5190
【愚公系列】2022年09月 微信小程序-Page页面扩展
微信小程序开发学习笔记(二)——小程序框架、组件、WXML
小程序开发框架的目标是通过尽可能简单、高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务。
张果
2023/04/28
2.2K0
微信小程序开发学习笔记(二)——小程序框架、组件、WXML
开发一个微信小程序(2):编写博客园随笔列表
首先我们需要拿到个人博客园的 access_token,这里我希望不要频繁调用这个接口,当进入小程序时调用一次就够了
冰霜
2022/06/06
1.5K3
小程序页面跳转传参-this和that的区别-登录流程-下拉菜单-实现画布自适应各种手机尺寸
小程序调用wx.login() 获取 登录凭证code ,并回传到开发者服务器 调用接口wx.login() 获取临时登录凭证(code)
达达前端
2019/07/04
7490
微信小程序之上拉加载与下拉刷新
在移动端,随着手指不断向上滑动,当内容将要到达屏幕底部的时候,页面会随之不断的加载后续内容,直到没有新内容为止(我们是有底线的-o-),我们称之为上拉加载,从技术角度来说,也可以称之为触底加载。
一斤代码
2018/08/21
4.5K1
微信小程序之上拉加载与下拉刷新
【愚公系列】《微信小程序与云开发从入门到实践》034-页面滚动与下拉刷新相关接口
在如今的移动互联网时代,用户对应用的交互体验要求越来越高,微信小程序作为一种轻量级的应用形式,凭借其便捷性和流畅性,受到了广泛欢迎。在小程序的开发过程中,如何实现流畅的页面滚动和高效的下拉刷新功能,成为了提升用户体验的重要环节。
愚公搬代码
2025/01/23
2610
【愚公系列】2022年08月 微信小程序-slider滑动选择器详解
文章目录 前言 一、slider滑动选择器 1.wxml 2.js 3.效果 二、自定义滑动选择器 1.组件的封装 2.组件的使用 ---- 前言 小程序中滑动选择器相关属性如下: 属性 类型 默认值 必填 说明 最低版本 min number 0 否 最小值 1.0.0 max number 100 否 最大值 1.0.0 step number 1 否 步长,取值必须大于 0,并且可被(max - min)整除 1.0.0 disabled boolean false 否 是否禁用 1.0.0 valu
愚公搬代码
2022/09/27
1.6K1
【愚公系列】2022年08月 微信小程序-slider滑动选择器详解
推荐阅读
相关推荐
微信小程序实践:2.3 可滚动的容器组件之 scroll-view
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验