ios微信小程序下拉刷新怎么配_[wx]微信小程序自定义下拉刷新
需求:
在小程序内存在列表等形式的页面内增加下拉刷新功能,提高用户体验感,加强界面操作与交互性;
实现方法:
1、小程序提供的下拉刷新(无法自定义刷新动画)
在页面设置内开启下拉(单独页面设置);
{
"enablePullDownRefresh": true,
}
使用onPullDownRefresh()监听用户下拉操作,实现刷新操作;
也可以通过wx.startPullDownRefresh和wx.stopPullDownRefresh触发和关闭页面下拉刷新;
可能遇到的问题:
1)下拉时没有出现刷新的点点动画
可能是因为设置的页面背景色与点点动画一致导致无法看到动画,可以在页面配置中配置背景文字颜色:
{
"backgroundTextStyle": "dark"
}
2、scroll-view内refresher-enabled属性开启自定义刷新
基本库要求:2.10.1
refresher-enabled
boolean
false
否
开启自定义下拉刷新
refresher-threshold
number
45
否
设置自定义下拉刷新阈值
refresher-default-style
string
"black"
否
设置自定义下拉刷新默认样式,支持设置 black/white/none, none 表示不使用默认样式
refresher-background
string
"#FFF"
否
设置自定义下拉刷新区域背景颜色
refresher-triggered
boolean
false
否
设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发
bindrefresherpulling
eventhandle
否
自定义下拉刷新控件被下拉
bindrefresherrefresh
eventhandle
否
自定义下拉刷新被触发
bindrefresherrestore
eventhandle
否
自定义下拉刷新被复位
bindrefresherabort
eventhandle
否
自定义下拉刷新被中止
3、原始scroll-view自定义下拉实现(为兼容2.10.1一下的下拉刷新
通过监听手指移动距离控制需要下拉模块的下拉距离,主要事件bindtouchstart,bindtouchmove和bindtouchend,bindtouchmove记录手指开始下拉时的起始位置,bindtouchmove计算下拉距离,bindtouchend判断并实现刷新方法。
我的自定义下拉组件(Taro框架)
import Taro, { Component, render } from "@tarojs/taro";
import { View, Image, ScrollView } from "@tarojs/components";
import { getGlobalData } from "../../state/global";
import util from "../../utils";
import "./index.less";
const rpx2px = util.rpx2px();
export default class Loading extends Component {
config = {
enablePullDownRefresh: false,
disableScroll: true
};
constructor() {
super(...arguments);
this.state = {
now_scroll_top: 0,
moveStartPosition: 0, //开始位置
moveDistance: 0, //移动距离
moveRefreshDistance: rpx2px(136), //达到刷新的阈值,没有达到不进行刷新并回弹
moveMaxDistance: rpx2px(220), //最大可滑动距离
isRefreshMaxDown: false, //是否达到了最大距离, 用来判断是否要震动提示
loading: false, //是否正在loading
loading_scale: 0,
// 2020.03.03 动态分成两个阶段,下拉时展示小鸭子浮动,放手后加载中鳄鱼
pull_moving: false,
back_top_num: ""
};
}
componentWillReceiveProps(nextProps) {
// 父组件触发刷新结束/取消刷新
// console.log(nextProps, this.state.loading)
if (nextProps.refreshLoading != this.state.loading) {
if(nextProps.refreshLoading) {
this.setState({
loading: nextProps.refreshLoading
});
} else {
this.stopPullLoading();
}
}
}
render() {
let {
now_scroll_top,
moveDistance,
loading_scale,
loading,
pull_moving,
back_top_num
} = this.state;
let { autoHeight } = this.props;
let sys_info = getGlobalData("system_info");
return (
className={["view-component component-pull-scroll", autoHeight ? "scroll-auto" : ""]}
id="pull-scroll-view"
style={{ height: autoHeight ? 'auto' : (sys_info.screenHeight - 80 + "px") }}
scrollY={true}
scrollTop={back_top_num}
data-nowScrollTop={now_scroll_top}
onTouchStart={this.pullTouchStart.bind(this)}
onTouchMove={this.pullTouchMove.bind(this)}
onTouchEnd={this.pullTouchEnd.bind(this)}
onScroll={this.pullScroll.bind(this)}
scrollWithAnimation
>
className="pull-view-container"
style={{ transform: "translateY(" + moveDistance + "px)" }}
>
className="pull-refresh-box"
style={{
transform: "scale(" + loading_scale + ") translateY(-100%)"
}}
>
{(pull_moving || loading) && (
className="loading-img"
src="http://assets-cdn.lanqb.com/manual-box/mp/mp-pullLoading-duck.gif"
>
)}
);
}
/**
* 触摸事件开始
* @param e
*/
pullTouchStart(e) {
let {
moveDistance,
moveStartPosition,
loading,
now_scroll_top
} = this.state;
if (loading || now_scroll_top >= 30) return;
moveDistance = 0; //重置移动距离
moveStartPosition = e.touches[0].clientY; //记录开始移动的位置
this.setState({
moveDistance,
moveStartPosition
});
}
/**
* 触摸事件移动
* @param e
*/
pullTouchMove(e) {
const _this = this;
let {
loading,
moveDistance,
moveStartPosition,
moveMaxDistance,
isRefreshMaxDown,
loading_scale,
moveRefreshDistance,
pull_moving,
now_scroll_top
} = this.state;
//如果正在loading,则不进行接下来的行为
if (loading || now_scroll_top >= 30) return;
//当前scroll-view所在的滚动位置
let nowScrollTop = e.currentTarget.dataset.nowscrolltop;
//开始计算移动距离
moveDistance = e.touches[0].clientY - moveStartPosition;
//如果是往下滑动,则阻止接下来的行为
if (moveDistance <= 0) {
loading_scale = 0;
// _this.stopPullLoading();
} else {
// if (nowScrollTop !== 0) {
// // 如果滚动高度 !== 0 则不进行任何操作
// } else {
if (moveDistance > moveMaxDistance) {
//达到阈值
// 显示刷新动画
pull_moving = true;
loading_scale = 1;
loading = false;
moveDistance = moveMaxDistance;
//触发一次震动
if (!isRefreshMaxDown) {
isRefreshMaxDown = true;
Taro.vibrateShort();
}
} else if (moveDistance < moveRefreshDistance) {
loading_scale = 0;
loading = false;
pull_moving = false;
} else {
loading = false;
pull_moving = true;
loading_scale =
moveDistance / rpx2px(136) > 1 ? 1 : moveDistance / rpx2px(136);
}
// }
}
this.setState({
moveDistance,
isRefreshMaxDown,
loading_scale,
pull_moving
});
}
/**
* 结束触摸事件
*/
pullTouchEnd(e) {
const _this = this;
let {
loading,
moveDistance,
moveRefreshDistance,
loading_scale,
moveMaxDistance,
pull_moving,
now_scroll_top
} = this.state;
if (loading || now_scroll_top >= 30) return;
//当前scroll-view所在的滚动位置
let nowScrollTop = e.currentTarget.dataset.nowscrolltop;
//如果是往下滑动,则阻止接下来的行为
if (moveDistance <= 0) {
// return false
loading_scale = 0;
moveDistance = 0;
loading = false;
pull_moving = false;
} else {
if (moveDistance < moveRefreshDistance) {
// 移动距离小于刷新阈值,不进行刷新
loading_scale = 0;
moveDistance = 0;
loading = false;
pull_moving = false;
console.log("需要回弹");
} else {
// 开始刷新
loading = true;
pull_moving = false;
_this.pullRefresh();
if (moveDistance >= moveMaxDistance) {
moveDistance = moveRefreshDistance;
loading_scale =
moveDistance / rpx2px(136) > 1 ? 1 : moveDistance / rpx2px(136);
}
}
// }
}
this.setState({
loading,
//重置
moveStartPosition: 0,
isRefreshMaxDown: false,
loading_scale,
moveDistance,
pull_moving
});
}
pullRefresh() {
const _this = this;
this.props.onPullRefresh();
}
pullScroll(event) {
let { scrollTop } = event.detail;
this.setState({
now_scroll_top: scrollTop,
back_top_num: ""
});
}
stopPullLoading() {
const _this = this;
setTimeout(function() {
_this.setState({
moveDistance: 0,
moveStartPosition: 0,
isRefreshMaxDown: false,
pull_moving: false,
back_top_num: 0,
now_scroll_top: 0
});
setTimeout(function() {
_this.setState({
loading_scale: 0,
loading: false,
})
}, 1500)
}, 2000)
}
}
部分问题:
1、与ios上橡皮筋效果冲突导致下拉无法触发自定义刷新
页面配置disabledScroll,禁止页面滚动,同时页面内的列表滚动需要自己再优化调整;
2、scroll-view的scroll问题
需要设定固定高度然后纵向滚动。[我都忘了是啥问题了……
3、页面下拉刷新结束后再滑动列表出现闪屏
在禁止页面橡皮筋效果后,如果页面内存在需滚动区域使用scroll-view效果比view更加流畅;
不设定固定高度不会发生闪屏但是页面滚动非常不流畅;
4、使用官方提供的scroll-view自定义的动画时,当scroll-view内容不足充满一屏时下拉出现问题
将scroll-view设置固定高度后,将其子元素的高度设置多一像素达到隐形撑满的效果。
className={["view-component component-pull-scroll", autoHeight ? "scroll-auto" : ""]}
id="pull-scroll-view"
style={{ height: (sys_info.screenHeight + "px") }}
>
className="pull-view-container"
style={{ height: (sys_info.screenHeight + 1 + "px") }}
>...
5、scroll-view内fixed元素问题
ios内scroll-view内fixed元素层级会出现问题,可能出现被遮挡的问题。
6、当页面内局部需要下拉刷新时可能导致内外两个滚动条问题
一个是页面滚动条一个是scroll-view滚动条,由于操作的时候触发的是scroll-view部分的滚动导致页面滚动无法进行从而影响页面其他操作。
Q5和Q6可以合并成一个问题,当页面需要一个吸顶操作时,即滑动距离超过阈值时导航条吸顶的功能,若scroll-view将整个页面包含就会出现Q5的问题,可能导致在ios内吸顶的导航栏无法显示,若scroll-view只包含需要刷新的部分则会出现Q6的两个滚动条的问题。
1)在页面未触发吸顶时禁止scroll-view模块下拉,触发后放开滚动,同时会导致无法下拉。
2)页面滚动触发,scroll-view模块可下拉,但是滚动区域无法滚动,且下拉动画只显示一次。
ios微信小程序下拉刷新怎么配_[wx]微信小程序自定义下拉刷新相关推荐
- 小程序按钮调用扫一扫_他在一个小程序“按钮”上动了个手脚,生意大火,赢得美人归!...
在中小企业成长的市场调查中总是有很多故事,今天给分享一个"在一个小按钮上动动手脚,赢得美人归"的小故事. 故事是这样的,这个餐饮店的老板叫大强,做的是肉夹馍生意.那天我看他家生意非 ...
- excel单元格下拉选项怎么设置_使用Excel制作搜索式下拉菜单,让你不再烦恼下拉选项多内容...
中岁颇好道,晚家南山陲.兴来每独往,胜事空自知.行到水穷处,坐看云起时.偶然值林叟,谈笑无还期. --[唐] 王维<终南别业> 下拉菜单,相信大家一定不陌生. 当我们需要快速输入数据内容, ...
- 应用程序逆向分析 有道词典_逆向工程媒体应用程序(并使其中的所有故事免费)...
应用程序逆向分析 有道词典 上周,我意识到距我在这里的最新帖子已经一年了. 我喜欢写故事,也喜欢阅读别人的故事,但前提是我认为这些故事足够有趣,而老实说这是一个很高的标准. 我最近一直在对Androi ...
- 程序开源与不开源区别_什么是开源程序办公室? 为什么需要一个?
程序开源与不开源区别 开源计划办公室是任何现代公司必不可少的组成部分,其计划要有一个雄心勃勃的计划来影响软件生态系统的各个领域. 如果公司希望增加影响力,澄清其开源消息传递,最大化其项目影响力或提高其 ...
- 微信公众号代运营公司有哪些_广州微信代运营公司有哪些
随着微信的普及,微信用户逐步在壮大,很多商家企业都开通了自己的微信公众号,然而,要运营好微信公众号还是有一定难度的.这个时候,最好找一些微信公众号代运营公司来帮忙做.微信公众号代运营公司有哪些呢?在广 ...
- ios微信小程序下拉刷新怎么配_为什么他的下拉刷新是个动画效果?
看到别人的下拉刷新动画!是不是蠢蠢欲动!也想马上拥有一个~~ 比如: 再比如: "小二,上菜!" 1 引入下拉刷新组件(组件代码可联系作者获取) 代码: ...
- taro 小程序转h5之后报错_记录微信小程序转Taro中遇到的问题
环境 系统:windows 开发工具:微信开发工具RC V1.02.1907301 + vscode 微信基础库版本:2.8.1 Taro:v1.3.15 npm: 6.4.1 node: v8.12 ...
- 微信开发修改button里的字体大小_在微信小程序中如何修改文字大小
这篇文章主要介绍了微信小程序实现点击按钮修改文字大小功能,涉及微信小程序事件绑定及setData动态修改Page页面data数据,进而控制页面元素属性动态改变的相关操作技巧,需要的朋友可以参考下 本文 ...
- 微信小程序突然多了好多动态_让微信小程序的登陆页面有云朵悬浮的动态效果...
微信小程序目前的火热程度相信不用多言,尤其是近期微信团队开发小程序很多之前被诟病的功能:模糊搜索,附近小程序等.最近有网友利用空余时间用小程序实现了个动态的登录页效果,所以下面我们51小程序就吧这篇文 ...
最新文章
- YUM(Yellow gog Updater Modifie)服务器的配置
- 【 Vivado 】UCF到XDC之间的转换
- Apache防止DDOS***的模块--mod_evasive
- matlab训练集测试集划分
- Ubuntu 软件包管理APT
- SpringBoot整合异步任务实现发送邮件
- USB转串口TTL板RX电平异常导致无法收到数据
- 如何在CSMAR中找到不同公司,不同时间的数据呢?
- ubuntu 使用root用户登录
- linux上离线安装bcp,无法在Linux上安装Pyodbc
- 计算机辅助小学数学教学的研究,计算机辅助数学教学的研究
- 虚拟机系列 | 执行引擎和垃圾回收
- 错误记录(四)java.lang.IllegalArgumentException: Control character in cookie value or attribute.
- 4.比赛F - Problem_F
- 如何在电脑手机间互传文件?
- c java 语法_java程序员要学的c语法
- [基于kk搭建k8s和kubesphere] 3 kubekey下载
- c 连接oracle otl,C++类库:OTL通用的数据库连接类库
- 用shell bash自动化程序
- PyTorch中的torch.max()和torch.maximum()的用法详解