综合办公系统
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.

mescroll-options.vue 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <template>
  2. <mescroll-body ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"
  3. :down="downOption"
  4. :up="upOption"
  5. :top="0"
  6. :bottom="0"
  7. :topbar="false"
  8. :bottombar="true"
  9. :fixed="true"
  10. height="100%"
  11. :safearea="false"
  12. @emptyclick="emptyClick"
  13. @topclick="topClick"
  14. @scroll="scroll">
  15. <view class="tip">展示down和up的所有配置项</view>
  16. <view class="tip" @click="triggerDownScroll">点此主动触发下拉刷新</view>
  17. <view class="tip" @click="scrollToY(200)">点此测试滚动到指定位置 (如: 200px)</view>
  18. <!-- 滚动到本页元素,只需普通的id或class选择器即可 -->
  19. <view class="tip" @click="scrollIntoView('#anchorPoint')" id="anchorPoint">点此测试滚动到指定view (元素在本页)</view>
  20. <!-- 滚动到子组件,小程序必须用'跨自定义组件的后代选择器' -->
  21. <view class="tip" @click="scrollIntoView('.good-comp >>> #good2')">点此测试滚动到指定view (元素在子组件)</view>
  22. <!-- tab组件 -->
  23. <me-tabs v-model="tabIndex" :tabs="tabs" @change="tabChange"></me-tabs>
  24. <!-- 视频请尽量使用me-video组件 (video在APP中是原生组件, 真机APP端下拉渲染不及时.) -->
  25. <!-- 使用me-video组件, 未播放时自动展示image封面, 播放时才显示video, 提高性能; 当加上 :mescroll="mescroll"之后, 如果播放中执行下拉,会自动隐藏视频,显示封面,避免视频下拉悬浮错位(仅APP端这样处理) -->
  26. <me-video v-if="tabIndex==0" :mescroll="mescroll" poster="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-mescroll/2e3cd7a0-f31a-11ea-81ea-f115fe74321c.png" src="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-mescroll/2ae5d090-f26e-11ea-81ea-f115fe74321c.mp4"></me-video>
  27. <!-- 商品组件 -->
  28. <good-list class="good-comp" :list="goods"></good-list>
  29. </mescroll-body>
  30. </template>
  31. <script>
  32. import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
  33. import {apiSearch} from "@/api/mock.js"
  34. export default {
  35. mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件)
  36. data() {
  37. return {
  38. downOption: {
  39. use: true, // 是否启用下拉刷新; 默认true
  40. auto: true, // 是否在初始化完毕之后自动执行下拉刷新的回调; 默认true
  41. native: false, // 是否使用系统自带的下拉刷新; 默认false; 仅mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例)
  42. autoShowLoading: false, // 如果设置auto=true(在初始化完毕之后自动执行下拉刷新的回调),那么是否显示下拉刷新的进度; 默认false
  43. isLock: false, // 是否锁定下拉刷新,默认false;
  44. offset: 80, // 在列表顶部,下拉大于80upx,松手即可触发下拉刷新的回调
  45. inOffsetRate: 1, // 在列表顶部,下拉的距离小于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉
  46. outOffsetRate: 0.2, // 在列表顶部,下拉的距离大于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉
  47. bottomOffset: 20, // 当手指touchmove位置在距离body底部20upx范围内的时候结束上拉刷新,避免Webview嵌套导致touchend事件不执行
  48. minAngle: 45, // 向下滑动最少偏移的角度,取值区间 [0,90];默认45度,即向下滑动的角度大于45度则触发下拉;而小于45度,将不触发下拉,避免与左右滑动的轮播等组件冲突;
  49. bgColor: "#E75A7C", // 背景颜色 (建议在pages.json中再设置一下backgroundColorTop)
  50. textColor: "#fff", // 文本颜色 (当bgColor配置了颜色,而textColor未配置时,则textColor会默认为白色)
  51. textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本
  52. textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本
  53. textLoading: '加载中 ...' // 加载中的提示文本
  54. },
  55. upOption: {
  56. use: true, // 是否启用上拉加载; 默认true
  57. auto: true, // 是否在初始化完毕之后自动执行上拉加载的回调; 默认true
  58. isLock: false, // 是否锁定上拉加载,默认false;
  59. isBoth: true, // 上拉加载时,如果滑动到列表顶部是否可以同时触发下拉刷新;默认true,两者可同时触发;
  60. page: {
  61. num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始
  62. size: 10, // 每页数据的数量
  63. time: null // 加载第一页数据服务器返回的时间; 防止用户翻页时,后台新增了数据从而导致下一页数据重复;
  64. },
  65. noMoreSize: 3, // 如果列表已无数据,可设置列表的总数量要大于等于5条才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看
  66. offset: 80, // 距底部多远时,触发upCallback(仅mescroll-uni生效, 对于mescroll-body则需在pages.json设置"onReachBottomDistance")
  67. bgColor: "transparent", // 背景颜色 (建议在pages.json中再设置一下backgroundColorTop)
  68. textColor: "gray", // 文本颜色 (当bgColor配置了颜色,而textColor未配置时,则textColor会默认为白色)
  69. textLoading: '加载中 ...', // 加载中的提示文本
  70. textNoMore: '-- END --', // 没有更多数据的提示文本
  71. toTop: {
  72. // 回到顶部按钮,需配置src才显示
  73. src: "https://www.mescroll.com/img/mescroll-totop.png", // 图片路径
  74. offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000
  75. duration: 300, // 回到顶部的动画时长,默认300ms (当值为0或300则使用系统自带回到顶部,更流畅; 其他值则通过step模拟,部分机型可能不够流畅,所以非特殊情况不建议修改此项)
  76. zIndex: 9990, // fixed定位z-index值
  77. left: null, // 到左边的距离, 默认null. 此项有值时,right不生效. (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
  78. right: 20, // 到右边的距离, 默认20 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
  79. bottom: 120, // 到底部的距离, 默认120 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
  80. safearea: false, // bottom的偏移量是否加上底部安全区的距离, 默认false, 需要适配iPhoneX时使用 (具体的界面如果不配置此项,则取mescroll组件props的safearea值)
  81. width: 72, // 回到顶部图标的宽度, 默认72 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
  82. radius: "50%" // 圆角, 默认"50%" (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx)
  83. },
  84. empty: {
  85. use: true, // 是否显示空布局
  86. icon: "https://www.mescroll.com/img/mescroll-empty.png", // 图标路径
  87. tip: '~ 暂无相关数据 ~', // 提示
  88. btnText: '去逛逛 >', // 按钮
  89. fixed: false, // 是否使用fixed定位,默认false; 配置fixed为true,以下的top和zIndex才生效 (transform会使fixed失效,最终会降级为absolute)
  90. top: "100rpx", // fixed定位的top值 (完整的单位值,如 "10%"; "100rpx")
  91. zIndex: 99 // fixed定位z-index值
  92. },
  93. onScroll: true // 是否监听滚动事件, 默认false, 仅mescroll-uni生效; mescroll-body直接声明onPageScroll (配置为true时,可@scroll="scroll"获取到滚动条位置和方向; 注意监听列表滚动是非常耗性能的,很容易出现卡顿,非特殊情况不要配置此项)
  94. },
  95. goods: [], //列表数据
  96. tabs: ['全部', '奶粉', '图书'],
  97. tabIndex: 0 // tab下标
  98. }
  99. },
  100. methods: {
  101. /*下拉刷新的回调 */
  102. downCallback() {
  103. // 这里加载你想下拉刷新的数据, 比如刷新轮播数据
  104. // loadSwiper();
  105. // 下拉刷新的回调,默认重置上拉加载列表为第一页 (自动执行 page.num=1, 再触发upCallback方法 )
  106. this.mescroll.resetUpScroll()
  107. },
  108. /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */
  109. upCallback(page) {
  110. //联网加载数据
  111. let keyword = this.tabs[this.tabIndex]
  112. apiSearch(page.num, page.size, keyword).then(curPageData=>{
  113. //联网成功的回调,隐藏下拉刷新和上拉加载的状态;
  114. //mescroll会根据传的参数,自动判断列表如果无任何数据,则提示空;列表无下一页数据,则提示无更多数据;
  115. //方法一(推荐): 后台接口有返回列表的总页数 totalPage
  116. //this.mescroll.endByPage(curPageData.length, totalPage); //必传参数(当前页的数据个数, 总页数)
  117. //方法二(推荐): 后台接口有返回列表的总数据量 totalSize
  118. //this.mescroll.endBySize(curPageData.length, totalSize); //必传参数(当前页的数据个数, 总数据量)
  119. //方法三(推荐): 您有其他方式知道是否有下一页 hasNext
  120. //this.mescroll.endSuccess(curPageData.length, hasNext); //必传参数(当前页的数据个数, 是否有下一页true/false)
  121. //方法四 (不推荐),会存在一个小问题:比如列表共有20条数据,每页加载10条,共2页.如果只根据当前页的数据个数判断,则需翻到第三页才会知道无更多数据
  122. this.mescroll.endSuccess(curPageData.length);
  123. //设置列表数据
  124. if(page.num == 1) this.goods = []; //如果是第一页需手动制空列表
  125. this.goods=this.goods.concat(curPageData); //追加新数据
  126. }).catch(()=>{
  127. //联网失败, 结束加载
  128. this.mescroll.endErr();
  129. })
  130. },
  131. // 点击空布局按钮的回调
  132. emptyClick(){
  133. uni.showToast({
  134. title:"点击了按钮"
  135. })
  136. },
  137. // 点击回到顶部按钮的回调
  138. topClick(){
  139. console.log('点击了回到顶部按钮');
  140. },
  141. // mescroll-uni滚动事件 (需在up配置onScroll:true才生效, mescroll-body直接声明onPageScroll)
  142. scroll(){
  143. console.log('mescroll元素id: '+this.mescroll.viewId+' , 滚动内容高度:'+this.mescroll.getScrollHeight() + ', mescroll高度:'+this.mescroll.getClientHeight() + ', 滚动条位置:'+this.mescroll.getScrollTop() + ', 距离底部:'+this.mescroll.getScrollBottom() + ', 是否向上滑:'+this.mescroll.isScrollUp)
  144. },
  145. // 切换菜单
  146. tabChange() {
  147. this.goods = []// 先置空列表,显示加载进度
  148. this.mescroll.resetUpScroll() // 再刷新列表数据
  149. },
  150. // 主动触发下拉刷新
  151. triggerDownScroll(){
  152. this.mescroll.triggerDownScroll()
  153. },
  154. // 滚动到指定位置,传数字 (单位px)
  155. scrollToY(y){
  156. // this.mescroll.scrollTo(y) // 过渡动画时长默认300ms
  157. this.mescroll.scrollTo(y, 0) // 无过渡动画
  158. },
  159. // 滚动到指定view,传view的id
  160. scrollIntoView(viewId){
  161. // this.mescroll.scrollTo(viewId) // 过渡动画时长默认300ms
  162. this.mescroll.scrollTo(viewId, 0) // 无过渡动画
  163. }
  164. },
  165. // mescroll-body的滚动事件是页面的滚动事件
  166. // onPageScroll(e){
  167. // console.log("mescroll-body的滚动事件e.scrollTop=" + e.scrollTop);
  168. // }
  169. }
  170. </script>
  171. <style>
  172. .tip{
  173. font-size: 28upx;
  174. height: 60upx;
  175. line-height: 60upx;
  176. text-align: center;
  177. }
  178. </style>