index.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <template>
  2. <view class="roll-load-wrap">
  3. <scroll-view class="scroll-view"
  4. :style=styles
  5. :scroll-top="scrollTop"
  6. :scroll-with-animation="true"
  7. :scroll-y="true"
  8. @scroll="scroll"
  9. @scrolltoupper="upper"
  10. @scrolltolower="lower">
  11. <slot name="cont">
  12. <text></text>
  13. </slot>
  14. </scroll-view>
  15. <view class="toTop"
  16. v-if="topBt.show"
  17. @tap="goTop"
  18. :style="topBt.style">
  19. <slot name="toTop">
  20. <text>去顶部</text>
  21. </slot>
  22. </view>
  23. </view>
  24. </template>
  25. <script>
  26. export default{
  27. name:"roll-load",
  28. props:{
  29. total:{
  30. type:[Number,String],
  31. default:0
  32. },
  33. size:{
  34. type:[Number,String],
  35. default:10
  36. },
  37. topBt:{
  38. type:[Object],
  39. default:()=>{
  40. return{
  41. show:true,
  42. style:""
  43. }
  44. }
  45. },
  46. styles:{
  47. type:String,
  48. default:""
  49. }
  50. },
  51. computed:{
  52. maxPageNumber(){
  53. let total=this.total;
  54. let pageSize=this.size;
  55. return Math.ceil((total/pageSize));
  56. }
  57. },
  58. data:()=>{
  59. return{
  60. pageNumber:1,
  61. scrollTop: 0,
  62. old: {
  63. scrollTop: 0
  64. }
  65. }
  66. },
  67. methods:{
  68. init(){
  69. this.pageNumber=1;
  70. this.scrollTop=0;
  71. this.old={
  72. scrollTop: 0
  73. }
  74. },
  75. upper: function(e) {
  76. this.$emit('upper',{
  77. pageNumber:this.pageNumber,
  78. pageSize:this.size
  79. })
  80. },
  81. lower: function(e) {
  82. let pageNumber=this.pageNumber;
  83. let maxPageNumber=this.maxPageNumber;
  84. if(pageNumber<maxPageNumber){
  85. this.pageNumber++;
  86. this.$emit('lower',{
  87. pageNumber:this.pageNumber,
  88. pageSize:this.size,
  89. status:true
  90. })
  91. }else{
  92. uni.showToast({
  93. title:"没有数据了"
  94. })
  95. this.$emit('lower',{
  96. pageNumber:this.pageNumber,
  97. pageSize:this.size,
  98. status:false
  99. })
  100. }
  101. },
  102. scroll: function(e) {
  103. this.old.scrollTop = e.detail.scrollTop;
  104. },
  105. goTop: function(e) {
  106. this.scrollTop = this.old.scrollTop
  107. this.$nextTick(() => {
  108. this.scrollTop = 0
  109. });
  110. }
  111. }
  112. }
  113. </script>
  114. <style lang="scss" scoped>
  115. .roll-load-wrap{
  116. .scroll-view{
  117. height:100vh;
  118. }
  119. .toTop{
  120. width: 100upx;
  121. height: 100upx;
  122. border-radius: 50%;
  123. background-color:rgba(51,132,255,0.8);
  124. color: #fff;
  125. text-align: center;
  126. line-height: 100upx;
  127. position: fixed;
  128. right:20upx;
  129. top: 50%;
  130. transform: translateY(-50%);
  131. box-shadow: 0 0 2upx rgba(0,0,0,0.5);
  132. z-index: 9999;
  133. }
  134. }
  135. </style>