useMescrollMore.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { ref } from 'vue';
  2. // 小程序无法在hook中使用页面级别生命周期,需单独传入: https://ask.dcloud.net.cn/question/161173
  3. // import { onPageScroll, onReachBottom, onPullDownRefresh} from '@dcloudio/uni-app';
  4. /** mescroll-more示例写在子组件时,需通过useMescrollMore补充子组件缺少的生命周期, 相当于vue2的mescroll-more.js文件 */
  5. function useMescrollMore(mescrollItems, onPageScroll, onReachBottom, onPullDownRefresh){
  6. // 当前tab下标
  7. const tabIndex = ref(0)
  8. // 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件
  9. onPageScroll && onPageScroll(e=>{
  10. handlePageScroll(e)
  11. })
  12. onReachBottom && onReachBottom(()=>{
  13. handleReachBottom()
  14. })
  15. // 当down的native: true时, 还需传递此方法进到子组件
  16. onPullDownRefresh && onPullDownRefresh(()=>{
  17. handlePullDownRefresh()
  18. })
  19. const handlePageScroll = (e)=>{
  20. let mescroll = getMescroll(tabIndex.value);
  21. mescroll && mescroll.onPageScroll(e);
  22. }
  23. const handleReachBottom = ()=>{
  24. let mescroll = getMescroll(tabIndex.value);
  25. mescroll && mescroll.onReachBottom();
  26. }
  27. const handlePullDownRefresh = ()=>{
  28. let mescroll = getMescroll(tabIndex.value);
  29. mescroll && mescroll.onPullDownRefresh();
  30. }
  31. // 根据下标获取对应子组件的mescroll
  32. const getMescroll = (i)=>{
  33. if (mescrollItems && mescrollItems[i]) {
  34. return mescrollItems[i].value.getMescroll()
  35. } else{
  36. return null
  37. }
  38. }
  39. // 切换tab,恢复滚动条位置
  40. const scrollToLastY = ()=>{
  41. let mescroll = getMescroll(tabIndex.value);
  42. if(mescroll){
  43. // 恢复上次滚动条的位置
  44. let y = mescroll.getScrollTop()
  45. mescroll.scrollTo(y, 0)
  46. // 再次恢复上次滚动条的位置, 确保元素已渲染
  47. setTimeout(()=>{
  48. mescroll.scrollTo(y, 0)
  49. },20)
  50. }
  51. }
  52. return {
  53. tabIndex,
  54. getMescroll,
  55. scrollToLastY
  56. }
  57. }
  58. export default useMescrollMore