综合办公系统
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

mescroll-uni.vue 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <template>
  2. <view>
  3. <!-- 菜单 -->
  4. <view class="top-warp">
  5. <view class="tip">基于scroll-view,常用在浮窗弹层等局部滚动区域</view>
  6. <view class="tip" @click="triggerDownScroll">点此主动触发下拉刷新</view>
  7. <view class="tip" @click="scrollToY(200)">点此测试滚动到指定位置 (如: 200px)</view>
  8. <!-- 滚动到本页元素,只需普通的id或class选择器即可 -->
  9. <view class="tip" @click="scrollIntoView('#anchorPoint')">点此测试滚动到指定view (元素在本页)</view>
  10. <!-- 滚动到子组件,小程序必须用'跨自定义组件的后代选择器' -->
  11. <view class="tip" @click="scrollIntoView('.good-comp >>> #good2')">点此测试滚动到指定view (元素在子组件)</view>
  12. <me-tabs v-model="tabIndex" :tabs="tabs" @change="tabChange"></me-tabs>
  13. </view>
  14. <!-- top="xxx"下拉布局往下偏移,防止被悬浮菜单遮住 -->
  15. <mescroll-uni ref="mescrollRef" @init="mescrollInit" top="365" @down="downCallback" :up="upOption" @up="upCallback" @emptyclick="emptyClick">
  16. <!-- 大海报 -->
  17. <image id="anchorPoint" v-if="tabIndex==0" src="https://www.mescroll.com/img/taobao/taobao3.jpg" mode="widthFix" style="width: 100%"/>
  18. <!-- 数据列表 -->
  19. <good-list class="good-comp" :list="goods"></good-list>
  20. </mescroll-uni>
  21. </view>
  22. </template>
  23. <script>
  24. import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
  25. import {apiSearch} from "@/api/mock.js"
  26. export default {
  27. mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件)
  28. data() {
  29. return {
  30. upOption:{
  31. // page: {
  32. // size: 10 // 每页数据的数量
  33. // },
  34. noMoreSize: 4, //如果列表已无数据,可设置列表的总数量要大于半页才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看; 默认5
  35. empty:{
  36. tip: '~ 搜索无数据 ~', // 提示
  37. btnText: '去看看'
  38. }
  39. },
  40. goods: [], //列表数据
  41. tabs: ['全部', '奶粉', '面膜', '图书'],
  42. tabIndex: 0 // tab下标
  43. }
  44. },
  45. methods: {
  46. /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */
  47. upCallback(page) {
  48. //联网加载数据
  49. let keyword = this.tabs[this.tabIndex]
  50. apiSearch(page.num, page.size, keyword).then(curPageData=>{
  51. //联网成功的回调,隐藏下拉刷新和上拉加载的状态;
  52. this.mescroll.endSuccess(curPageData.length);
  53. //设置列表数据
  54. if(page.num == 1) this.goods = []; //如果是第一页需手动制空列表
  55. this.goods=this.goods.concat(curPageData); //追加新数据
  56. }).catch(()=>{
  57. //联网失败, 结束加载
  58. this.mescroll.endErr();
  59. })
  60. },
  61. //点击空布局按钮的回调
  62. emptyClick(){
  63. uni.showToast({
  64. title:'点击了按钮,具体逻辑自行实现'
  65. })
  66. },
  67. // 切换菜单
  68. tabChange() {
  69. this.goods = []// 先置空列表,显示加载进度
  70. this.mescroll.resetUpScroll() // 再刷新列表数据
  71. },
  72. // 主动触发下拉刷新
  73. triggerDownScroll(){
  74. this.mescroll.scrollTo(0, 0)
  75. this.mescroll.triggerDownScroll()
  76. },
  77. // 滚动到指定位置,传数字 (单位px)
  78. scrollToY(y){
  79. // this.mescroll.scrollTo(y) // 过渡动画时长默认300ms
  80. this.mescroll.scrollTo(y, 0) // 无过渡动画
  81. },
  82. // 滚动到指定view,传view的id
  83. scrollIntoView(viewId){
  84. // this.mescroll.scrollTo(viewId) // 过渡动画时长默认300ms
  85. this.mescroll.scrollTo(viewId, 0) // 无过渡动画
  86. }
  87. }
  88. }
  89. </script>
  90. <style>
  91. .top-warp{
  92. z-index: 9990;
  93. position: fixed;
  94. top: --window-top; /* css变量 */
  95. left: 0;
  96. width: 100%;
  97. height: 365upx;
  98. background-color: white;
  99. }
  100. .top-warp .tip{
  101. font-size: 28upx;
  102. height: 60upx;
  103. line-height: 60upx;
  104. text-align: center;
  105. }
  106. </style>