123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- <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>
|