吉媒互动平台前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

202 lines
5.5 KiB

<template>
<view class="gui-sbutton-in"
:class="[
baseClass,
status == 1 ? defaultClass : '' ,
status == 2 ? loadingClass : '' ,
status == 3 ? successClass : '',
status >= 3 ? 'gui-btn-fade-in' : '',
status == 4 ? failClass : '',]">
<view class="gui-sbutton" v-if="status == 1">
<slot name="default"></slot>
</view>
<view
class="gui-sbutton gui-flex gui-rows gui-nowrap gui-justify-content-center gui-align-items-center"
:class="[baseClass]"
v-if="status == 2">
<view ref="loadingPoints1" :class="[loaingPointClass, 'gui-sbutton-loading1']"></view>
<view ref="loadingPoints2" :class="[loaingPointClass, 'gui-sbutton-loading2']"></view>
<view ref="loadingPoints3" :class="[loaingPointClass, 'gui-sbutton-loading3']"></view>
</view>
<view class="gui-sbutton" v-if="status == 3">
<slot name="success"></slot>
</view>
<view class="gui-sbutton" v-if="status == 4">
<slot name="error"></slot>
</view>
<view class="gui-sbutton gui-sbutton-slot"><slot name="realBtn"></slot></view>
</view>
</template>
<script>
// #ifdef APP-NVUE
const BindingX = uni.requireNativePlugin('bindingx');
// #endif
export default{
name : "gui-submit-button",
props : {
titleClass : {type:String, default : 'gui-sbutton-text'},
loaingPointClass : {type:String, default : 'gui-sbutton-loading-point'},
baseClass : {type:String, default : 'gui-sbutton'},
defaultClass : {type:String, default : 'gui-sbutton-default'},
loadingClass : {type:String, default : 'gui-sbutton-loading'},
successClass : {type:String, default : 'gui-sbutton-success'},
failClass : {type:String, default : 'gui-sbutton-fail'}
},
data() {
return {
status : 1,
animateTimer : 800,
BindingXObjs : [null,null,null],
AnimateObjs : [null,null,null],
intervalID : null
}
},
// #ifdef APP-NVUE
watch:{
status:function(val){
switch(val){
case 1 :
clearInterval(this.intervalID);
break;
case 2 :
setTimeout(()=>{
this.getRefs('loadingPoints1', 0, (refs)=>{
this.BindingXObjs = [
refs.ref,
this.$refs.loadingPoints2.ref,
this.$refs.loadingPoints3.ref
];
this.startAnimate();
});
}, 100);
this.intervalID = setInterval(()=>{
this.startAnimate();
}, 1000);
break;
case 3 :
clearInterval(this.intervalID);
break;
case 4 :
clearInterval(this.intervalID);
break;
default :
clearInterval(this.intervalID);
}
}
},
// #endif
methods : {
reset : function () {
this.status = 1;
},
loading : function () {
this.status = 2;
},
success : function () {
this.status = 3;
},
fail : function () {
this.status = 4;
},
// #ifdef APP-NVUE
startAnimate : function(){
this.loadingAnimate(0);
setTimeout(()=>{this.loadingAnimate(1);},300);
setTimeout(()=>{this.loadingAnimate(2);},600);
},
loadingAnimate : function (id) {
this.AnimateObjs[id] = BindingX.bind({
eventType : 'timing',
exitExpression : 't>'+this.animateTimer,
props : [
{
element : this.BindingXObjs[id],
property : 'transform.scale',
expression : "1+t/"+this.animateTimer+"/3"
},
{
element : this.BindingXObjs[id],
property : 'opacity',
expression : "0.6+t/"+this.animateTimer
}
]
}, (e)=>{
if(e.state === 'exit') {
BindingX.unbind({
token : this.AnimateObjs[id].token,
eventType: 'timing'
});
this.AnimateObjs[id] = BindingX.bind({
eventType : 'timing',
exitExpression : 't>'+this.animateTimer,
props : [
{
element : this.BindingXObjs[id],
property : 'transform.scale',
expression : "1.35-t/"+this.animateTimer+"/3"
},
{
element : this.BindingXObjs[id],
property : 'opacity',
expression : "1.6-t/"+this.animateTimer
}
]
}, (e)=>{
if(e.state === 'exit') {
BindingX.unbind({
token : this.AnimateObjs[id].token,
eventType: 'timing'
});
}
});
}
});
},
// #endif
getRefs : function(ref, count, fun){
if(count >= 30){return null;}
var refReturn = this.$refs[ref];
if(refReturn){
fun(refReturn);
return;
}else{
count++;
setTimeout(()=>{
this.getRefs(ref, count, fun);
}, 50);
}
}
}
}
</script>
<style>
.gui-sbutton-in{position:relative; overflow:hidden;}
.gui-sbutton-slot{opacity:0; position:absolute; left:0; top:0; z-index:1;}
/* #ifndef APP-NVUE */
.gui-sbutton-loading1{animation:gui-sbutton-loading1 1200ms ease-in infinite;}
@keyframes gui-sbutton-loading1{
0%{transform: translateY(0px);}
25%{transform: translateY(2px);}
100%{transform: translateY(0px);}
}
.gui-sbutton-loading2{animation:gui-sbutton-loading2 1200ms ease-in infinite;}
@keyframes gui-sbutton-loading2{
0%{transform: translateY(0px);}
25%{transform: translateY(0px);}
50%{transform: translateY(2px);}
75%{transform: translateY(2px);}
100%{transform: translateY(0px);}
}
.gui-sbutton-loading3{animation:gui-sbutton-loading3 1200ms ease-in infinite;}
@keyframes gui-sbutton-loading3{
0%{transform: translateY(0px);}
25%{transform: translateY(0px);}
50%{transform: translateY(0px);}
75%{transform: translateY(2px);}
100%{transform: translateY(0px);}
}
@keyframes gui-btn-fade-in{0%{opacity:0.5;} 100%{opacity:1;}}
.gui-btn-fade-in{animation:gui-btn-fade-in 350ms ease-in forwards;}
/* #endif */
</style>