gui-submit-button.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <template>
  2. <view
  3. class="gui-sbutton-in"
  4. :class="[
  5. baseClass,
  6. status == 1 ? defaultClass : '' ,
  7. status == 2 ? loadingClass : '' ,
  8. status == 3 ? successClass : '',
  9. status >= 3 ? 'gui-btn-fade-in' : '',
  10. status == 4 ? failClass : ''
  11. ]">
  12. <view
  13. class="gui-sbutton"
  14. v-if="status == 1">
  15. <slot name="default"></slot>
  16. </view>
  17. <view
  18. class="gui-sbutton gui-flex gui-rows gui-nowrap gui-justify-content-center gui-align-items-center"
  19. :class="[baseClass]"
  20. v-if="status == 2">
  21. <view
  22. ref="loadingPoints1"
  23. :class="[loaingPointClass, 'gui-sbutton-loading1']"></view>
  24. <view
  25. ref="loadingPoints2"
  26. :class="[loaingPointClass, 'gui-sbutton-loading2']"></view>
  27. <view
  28. ref="loadingPoints3"
  29. :class="[loaingPointClass, 'gui-sbutton-loading3']"></view>
  30. </view>
  31. <view
  32. class="gui-sbutton"
  33. v-if="status == 3">
  34. <slot name="success"></slot>
  35. </view>
  36. <view
  37. class="gui-sbutton"
  38. v-if="status == 4">
  39. <slot name="error"></slot>
  40. </view>
  41. <view
  42. class="gui-sbutton gui-sbutton-slot">
  43. <slot name="realBtn"></slot>
  44. </view>
  45. </view>
  46. </template>
  47. <script>
  48. // #ifdef APP-NVUE
  49. const BindingX = uni.requireNativePlugin('bindingx');
  50. // #endif
  51. export default{
  52. name : "gui-submit-button",
  53. props : {
  54. titleClass : {type:String, default : 'gui-sbutton-text'},
  55. loaingPointClass : {type:String, default : 'gui-sbutton-loading-point'},
  56. baseClass : {type:String, default : 'gui-sbutton'},
  57. defaultClass : {type:String, default : 'gui-sbutton-default'},
  58. loadingClass : {type:String, default : 'gui-sbutton-loading'},
  59. successClass : {type:String, default : 'gui-sbutton-success'},
  60. failClass : {type:String, default : 'gui-sbutton-fail'}
  61. },
  62. data() {
  63. return {
  64. status : 1,
  65. animateTimer : 800,
  66. BindingXObjs : [null,null,null],
  67. AnimateObjs : [null,null,null],
  68. intervalID : null
  69. }
  70. },
  71. // #ifdef APP-NVUE
  72. watch:{
  73. status:function(val){
  74. switch(val){
  75. case 1 :
  76. clearInterval(this.intervalID);
  77. break;
  78. case 2 :
  79. setTimeout(()=>{
  80. this.getRefs('loadingPoints1', 0, (refs)=>{
  81. this.BindingXObjs = [
  82. refs.ref,
  83. this.$refs.loadingPoints2.ref,
  84. this.$refs.loadingPoints3.ref
  85. ];
  86. this.startAnimate();
  87. });
  88. }, 100);
  89. this.intervalID = setInterval(()=>{
  90. this.startAnimate();
  91. }, 1000);
  92. break;
  93. case 3 :
  94. clearInterval(this.intervalID);
  95. break;
  96. case 4 :
  97. clearInterval(this.intervalID);
  98. break;
  99. default :
  100. clearInterval(this.intervalID);
  101. }
  102. }
  103. },
  104. // #endif
  105. methods : {
  106. reset : function () {
  107. this.status = 1;
  108. },
  109. loading : function () {
  110. this.status = 2;
  111. },
  112. success : function () {
  113. this.status = 3;
  114. },
  115. fail : function () {
  116. this.status = 4;
  117. },
  118. // #ifdef APP-NVUE
  119. startAnimate : function(){
  120. this.loadingAnimate(0);
  121. setTimeout(()=>{this.loadingAnimate(1);},300);
  122. setTimeout(()=>{this.loadingAnimate(2);},600);
  123. },
  124. loadingAnimate : function (id) {
  125. this.AnimateObjs[id] = BindingX.bind({
  126. eventType : 'timing',
  127. exitExpression : 't>'+this.animateTimer,
  128. props : [
  129. {
  130. element : this.BindingXObjs[id],
  131. property : 'transform.scale',
  132. expression : "1+t/"+this.animateTimer+"/3"
  133. },
  134. {
  135. element : this.BindingXObjs[id],
  136. property : 'opacity',
  137. expression : "0.6+t/"+this.animateTimer
  138. }
  139. ]
  140. }, (e)=>{
  141. if(e.state === 'exit') {
  142. BindingX.unbind({
  143. token : this.AnimateObjs[id].token,
  144. eventType: 'timing'
  145. });
  146. this.AnimateObjs[id] = BindingX.bind({
  147. eventType : 'timing',
  148. exitExpression : 't>'+this.animateTimer,
  149. props : [
  150. {
  151. element : this.BindingXObjs[id],
  152. property : 'transform.scale',
  153. expression : "1.35-t/"+this.animateTimer+"/3"
  154. },
  155. {
  156. element : this.BindingXObjs[id],
  157. property : 'opacity',
  158. expression : "1.6-t/"+this.animateTimer
  159. }
  160. ]
  161. }, (e)=>{
  162. if(e.state === 'exit') {
  163. BindingX.unbind({
  164. token : this.AnimateObjs[id].token,
  165. eventType: 'timing'
  166. });
  167. }
  168. });
  169. }
  170. });
  171. },
  172. // #endif
  173. getRefs : function(ref, count, fun){
  174. if(count >= 30){return null;}
  175. var refReturn = this.$refs[ref];
  176. if(refReturn){
  177. fun(refReturn);
  178. return;
  179. }else{
  180. count++;
  181. setTimeout(()=>{
  182. this.getRefs(ref, count, fun);
  183. }, 50);
  184. }
  185. }
  186. }
  187. }
  188. </script>
  189. <style scoped>
  190. .gui-sbutton-in{position:relative; overflow:hidden;}
  191. .gui-sbutton-slot{opacity:0; position:absolute; left:0; top:0; z-index:1;}
  192. /* #ifndef APP-NVUE */
  193. .gui-sbutton-loading1{animation:gui-sbutton-loading1 1200ms ease-in infinite;}
  194. @keyframes gui-sbutton-loading1{
  195. 0%{transform: translateY(0px);}
  196. 25%{transform: translateY(2px);}
  197. 100%{transform: translateY(0px);}
  198. }
  199. .gui-sbutton-loading2{animation:gui-sbutton-loading2 1200ms ease-in infinite;}
  200. @keyframes gui-sbutton-loading2{
  201. 0%{transform: translateY(0px);}
  202. 25%{transform: translateY(0px);}
  203. 50%{transform: translateY(2px);}
  204. 75%{transform: translateY(2px);}
  205. 100%{transform: translateY(0px);}
  206. }
  207. .gui-sbutton-loading3{animation:gui-sbutton-loading3 1200ms ease-in infinite;}
  208. @keyframes gui-sbutton-loading3{
  209. 0%{transform: translateY(0px);}
  210. 25%{transform: translateY(0px);}
  211. 50%{transform: translateY(0px);}
  212. 75%{transform: translateY(2px);}
  213. 100%{transform: translateY(0px);}
  214. }
  215. @keyframes gui-btn-fade-in{0%{opacity:0.5;} 100%{opacity:1;}}
  216. .gui-btn-fade-in{animation:gui-btn-fade-in 350ms ease-in forwards;}
  217. /* #endif */
  218. </style>