9 changed files with 326 additions and 3 deletions
Split View
Diff Options
-
92components/refresh-view/index.js
-
4components/refresh-view/index.json
-
21components/refresh-view/index.wxml
-
78components/refresh-view/index.wxss
-
124components/refresh-view/scroll.wxs
-
2pages/agent/fragment/index.wxml
-
3pages/agent/order/index.js
-
2pages/agent/order/index.json
-
3pages/agent/order/index.wxml
@ -0,0 +1,92 @@ |
|||
// components/swiperefreshlayout/swiperefreshlayout.js
|
|||
Component({ |
|||
options: { |
|||
addGlobalClass: true, |
|||
multipleSlots: true |
|||
}, |
|||
properties: { |
|||
height: { |
|||
type: Number, |
|||
value: 800 |
|||
}, |
|||
threshold: { // 下拉刷新阈值,下拉距离超过该值触发刷新
|
|||
type: Number, |
|||
value: 30 |
|||
}, |
|||
color: { // 下拉刷新进度条颜色
|
|||
type: String, |
|||
value: 'black' |
|||
}, |
|||
backgroundColor: { // 下拉刷新圆圈背景颜色
|
|||
type: String, |
|||
value: 'white' |
|||
}, |
|||
loadMoreEnable: { // 是否开启上拉加载
|
|||
type: Boolean, |
|||
value: true |
|||
}, |
|||
refreshing: { |
|||
type: Boolean, |
|||
value: false, |
|||
observer(value) { |
|||
this.setRefresh(false) |
|||
} |
|||
} |
|||
}, |
|||
/** |
|||
* 组件的初始数据 |
|||
*/ |
|||
data: { |
|||
progressBarHeight: '', // 下拉刷新圆圈高度
|
|||
rotate: '', |
|||
scrollTop: true, // 当前是否处于顶部
|
|||
triggered: false // 当前下拉刷新状态,true表示下拉刷新已经被触发,false表示下拉刷新未被触发
|
|||
}, |
|||
|
|||
lifetimes: { |
|||
attached: function() { |
|||
// 在组件实例进入页面节点树时执行
|
|||
this.setData({ progressBarHeight: this.rpx2px(80) }); |
|||
} |
|||
}, |
|||
/** |
|||
* 组件的方法列表 |
|||
*/ |
|||
methods: { |
|||
_scroll: function(e) { |
|||
// console.log(e);
|
|||
if (e.detail.scrollTop <= 50) { |
|||
// 滚动到顶部
|
|||
this.setData({ scrollTop: true }); |
|||
} else { |
|||
this.setData({ scrollTop: false }); |
|||
} |
|||
}, |
|||
/** |
|||
* 滚动到底部 |
|||
*/ |
|||
_scrollToLower: function(e) { |
|||
if (this.properties.loadMoreEnable) { |
|||
this.triggerEvent('loadmore'); |
|||
} |
|||
}, |
|||
/** |
|||
* 设置刷新状态 |
|||
*/ |
|||
setRefresh: function(refreshing) { |
|||
if (this.data.triggered != refreshing) { |
|||
if (refreshing) { |
|||
// 触发刷新
|
|||
this.triggerEvent('refresh'); |
|||
} |
|||
this.setData({ triggered: refreshing }); |
|||
} |
|||
}, |
|||
/** |
|||
* rpx转px |
|||
*/ |
|||
rpx2px: function(rpx) { |
|||
return rpx / 750 * wx.getSystemInfoSync().windowWidth; |
|||
} |
|||
} |
|||
}) |
|||
@ -0,0 +1,4 @@ |
|||
{ |
|||
"component": true, |
|||
"usingComponents": {} |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
<!--components/swiperefreshlayout/swiperefreshlayout.wxml--> |
|||
<wxs src="./scroll.wxs" module="scroll"></wxs> |
|||
<scroll-view class="scroll-container" scroll-y bindscroll="_scroll" bindscrolltolower="_scrollToLower" |
|||
bindtouchstart="{{scroll.touchStart}}" catchtouchmove="{{scroll.touchMove}}" bindtouchend="{{scroll.touchEnd}}" |
|||
bindtouchcancel="{{scroll.touchCancel}}" data-scrolltop="{{scrollTop}}" data-threshold="{{threshold}}" |
|||
data-progressbarheight="{{progressBarHeight}}" change:prop="{{scroll.refreshStateChange}}" prop="{{triggered}}" |
|||
style="height:{{height}}rpx" lower-threshold="80"> |
|||
<view class="view-container"> |
|||
<!-- 下拉刷新圆圈 --> |
|||
<view class="circle-progress-bar" style="background-color:{{backgroundColor}};"> |
|||
<text class="iconfont icon-shuaxin" style="font-size:50rpx;color:{{color}};" /> |
|||
</view> |
|||
<!-- 刷新中圆圈 --> |
|||
<view class="circle-progress-bar" style="background-color:{{backgroundColor}};margin-top:40rpx;" hidden="{{!triggered}}"> |
|||
<view class="loading" style="border-top:5rpx solid {{color}};border-left:5rpx solid {{color}};border-right:5rpx solid {{color}};" /> |
|||
</view> |
|||
<!-- 刷新内容 --> |
|||
<view style="height:10rpx"></view> |
|||
<slot></slot> |
|||
</view> |
|||
</scroll-view> |
|||
@ -0,0 +1,78 @@ |
|||
/* components/swiperefreshlayout/swiperefreshlayout.wxss */ |
|||
|
|||
.scroll-container { |
|||
width: 100%; |
|||
height: 100%; |
|||
} |
|||
|
|||
.view-container { |
|||
display: flex; |
|||
flex-direction: column; |
|||
} |
|||
|
|||
.view-refresh-content { |
|||
width: 100%; |
|||
height: 100%; |
|||
position: absolute; |
|||
z-index: 8; |
|||
} |
|||
|
|||
.circle-progress-bar { |
|||
width: 80rpx; |
|||
height: 80rpx; |
|||
align-self: center; |
|||
display: flex; |
|||
justify-content: center; |
|||
align-items: center; |
|||
border-radius: 50%; |
|||
box-shadow: 0 0 18rpx #ccc; |
|||
/* position: fixed; */ |
|||
/* 这里margin-top没有取80rpx是为了防止露出阴影部分 */ |
|||
margin-top: -90rpx; |
|||
z-index: 12; |
|||
} |
|||
|
|||
@font-face { |
|||
font-family: "iconfont"; |
|||
src: url('//at.alicdn.com/t/font_1677220_3np58ejrjzs.eot?t=1585209535266'); /* IE9 */ |
|||
src: url('//at.alicdn.com/t/font_1677220_3np58ejrjzs.eot?t=1585209535266#iefix') format('embedded-opentype'), |
|||
/* IE6-IE8 */ url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAK8AAsAAAAABmgAAAJwAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCcApwgRABNgIkAwgLBgAEIAWEbQcxG7cFyA4lQRHBTO0GAEwE4Ro5m+QJQLJiXUBZV1VXWUtoNEpSbBSTrL6f9nMP9VCOPrGEelL58u6L7nazhknCu3noy9AmCRoNfOLe8f/VeRfIfEC5rLlo0aQuoC4OpADHWhRZkUTeMHaBSzhOoNEoj6L9oYlpqFRY4wJxRlMEqMyFFIVl64XamqVF3FamPl1Jn8Ct8PvxRygqSWoyq+TQ6UEZer5n7BF5o9qwnLdszOcAW0XGMlCIY7WpA0oEY5RoTJWaBPsqDL5nqsq3iL0aBfvrrPxmMAxF9yR2JbeaTXBbXU0Cm6NuIybPZbPH8vkThcJJ2Oi5OO6bu9rsnb08B3X0XO54aeRkIx0/eXIt2Xxf4E3de/DwfINUHpwobf17ua+xD0zrPV9Gb6oLH/Jdfv78+Q6QZ8iHv6MHoPqXz/KWIgSvZv9+TzV0/K9vKuD19ebTMFD9K9DPA+r37Q7+kbhnQ9GlljkVVVzbmkyeu6xRIyrY1+lnrK7nhnKhXs8IT52RFFm9aaLQllGjyQpq1dtCoyXDq5t0YUpEacCiXYDQ7gNJq6fI2n0RhfaNGr3+Uas9StDoRLRs2WQ2tOp+hgJHmYhpokmOTR0rr44KJ1GJmwLLSkPmLLKYFiVBX6CYHUYb2RwzYgklxDkllDkWGQKnoWk6xGWOjhL3qZy7bX4/rXuTT3IsqLaHQQIOyQhRGqGROGzUb89Vlz4/CSniTALWUlfjnYWYGK13Isgn0IMYVtm96u7llZgERQjHUQTFOCzEEBiETCYH4dYP0iEJ56OOSLja+O1mtK/Kt77G+rod0MjSp7D7ZnVn1biQ0mwAAA==') format('woff2'), |
|||
url('//at.alicdn.com/t/font_1677220_3np58ejrjzs.woff?t=1585209535266') format('woff'), |
|||
url('//at.alicdn.com/t/font_1677220_3np58ejrjzs.ttf?t=1585209535266') format('truetype'), |
|||
/* chrome, |
|||
firefox, |
|||
opera, |
|||
Safari, |
|||
Android, |
|||
iOS 4.2+ */ url('//at.alicdn.com/t/font_1677220_3np58ejrjzs.svg?t=1585209535266#iconfont') format('svg'); /* iOS 4.1- */ |
|||
} |
|||
|
|||
.iconfont { |
|||
font-family: "iconfont" !important; |
|||
font-size: 16px; |
|||
font-style: normal; |
|||
-webkit-font-smoothing: antialiased; |
|||
-moz-osx-font-smoothing: grayscale; |
|||
} |
|||
|
|||
.icon-shuaxin:before { |
|||
content: "\e6c2"; |
|||
} |
|||
|
|||
.loading { |
|||
width: 36rpx; |
|||
height: 36rpx; |
|||
border-radius: 50%; |
|||
border-bottom: 5rpx solid transparent; |
|||
animation: loading 1.5s infinite; |
|||
} |
|||
|
|||
@keyframes loading { |
|||
0% { |
|||
transform: rotate(0deg); |
|||
} |
|||
|
|||
100% { |
|||
transform: rotate(360deg); |
|||
} |
|||
} |
|||
@ -0,0 +1,124 @@ |
|||
/** |
|||
* 下拉刷新的控制 |
|||
*/ |
|||
var startmark = 0; // 开始触摸屏幕的位置 |
|||
var newmark = 0; // 当前移动到的位置 |
|||
var maxDistance = 75; // 下拉最大距离(单位px) |
|||
var triggered = false; // 当前下拉刷新状态,true表示下拉刷新已经被触发,false表示下拉刷新未被触发 |
|||
|
|||
/** |
|||
* 手指触摸动作开始 |
|||
*/ |
|||
var touchStart = function(e, instance) { |
|||
var scrollTop = e.instance.getDataset().scrolltop; |
|||
// 当前处于顶部并且没有处于刷新状态 |
|||
if (scrollTop && !triggered) { |
|||
startmark = e.touches[0].pageY; |
|||
} else { |
|||
return; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 手指触摸后移动 |
|||
*/ |
|||
var touchMove = function(e, instance) { |
|||
var scrollTop = e.instance.getDataset().scrolltop; |
|||
var circleProgressBarHeight = e.instance.getDataset().progressbarheight; |
|||
// 当前处于顶部并且没有处于刷新状态 |
|||
if (scrollTop && !triggered) { |
|||
newmark = e.touches[0].pageY; |
|||
if (newmark < startmark) { |
|||
// 向上滑动 |
|||
instance.selectComponent('.circle-progress-bar').setStyle({ 'transform': 'none' }) |
|||
instance.selectComponent('.icon-shuaxin').setStyle({ 'transform': 'none', 'opacity': 0 }) |
|||
} else if (newmark - startmark > maxDistance + circleProgressBarHeight) { |
|||
// 达到最大滑动距离 |
|||
instance.selectComponent('.circle-progress-bar').setStyle({ |
|||
'transform': 'translateY(' + (maxDistance + circleProgressBarHeight) + 'px)' |
|||
}); |
|||
instance.selectComponent('.icon-shuaxin').setStyle({ |
|||
'transform': 'rotate(270deg)', |
|||
'opacity': 1 |
|||
}); |
|||
} else { |
|||
// 向下滑动,未到达最大滑动距离 |
|||
instance.selectComponent('.circle-progress-bar').setStyle({ |
|||
'transform': 'translateY(' + (newmark - startmark) + 'px)' |
|||
}); |
|||
// 计算加载进度条的透明度,当滑动距离为最大滑动距离的一半时opacity为1 |
|||
var opacity = 0; |
|||
if (newmark - startmark <= (maxDistance + circleProgressBarHeight) / 2) { |
|||
opacity = 1 * (newmark - startmark) / (maxDistance + circleProgressBarHeight); |
|||
} else { |
|||
opacity = 1; |
|||
} |
|||
instance.selectComponent('.icon-shuaxin').setStyle({ |
|||
'transform': 'rotate(' + 270 * (newmark - startmark) / (maxDistance + circleProgressBarHeight) + 'deg)', |
|||
'opacity': opacity |
|||
}); |
|||
} |
|||
} else { |
|||
return |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 手指触摸动作结束 |
|||
*/ |
|||
var touchEnd = function(e, instance) { |
|||
var scrollTop = e.instance.getDataset().scrolltop; |
|||
var threshold = e.instance.getDataset().threshold; |
|||
// 当前处于顶部并且没有处于刷新状态 |
|||
if (scrollTop && !triggered) { |
|||
if (newmark - startmark < (threshold + 40)) { |
|||
// 滑动距离未达到阈值(这里的40为加载圈高度),回到原位 |
|||
startmark = 0; |
|||
newmark = 0; |
|||
instance.selectComponent('.circle-progress-bar').setStyle({ |
|||
'transform': 'none', |
|||
'opacity': 0, |
|||
'transition-duration': '0.6s' |
|||
}); |
|||
} else { |
|||
// 滑动距离达到阈值,触发刷新 |
|||
startmark = 0; |
|||
newmark = 0; |
|||
instance.selectComponent('.circle-progress-bar').setStyle({ |
|||
'transform': 'none', |
|||
'opacity': 0 |
|||
}); |
|||
instance.callMethod('setRefresh', true); |
|||
} |
|||
} else { |
|||
return; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 手指触摸动作被打断,如来电提醒,弹窗 |
|||
*/ |
|||
var touchCancel = function(e, instance) { |
|||
// 回到原位 |
|||
startmark = 0; |
|||
newmark = 0; |
|||
instance.selectComponent('.circle-progress-bar').setStyle({ |
|||
'transform': 'none', |
|||
'opacity': 0 |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* 刷新状态变化监听 |
|||
*/ |
|||
var refreshStateChange = function(newValue, oldValue, ownerInstance, ins) { |
|||
triggered = newValue; |
|||
} |
|||
|
|||
module.exports = { |
|||
touchStart: touchStart, |
|||
touchMove: touchMove, |
|||
touchEnd: touchEnd, |
|||
touchCancel: touchCancel, |
|||
refreshStateChange: refreshStateChange |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save