cl-page.uvue 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <template>
  2. <!-- #ifdef APP -->
  3. <scroll-view
  4. :style="{ flex: 1 }"
  5. :scroll-top="scrollViewTop"
  6. :scroll-with-animation="true"
  7. @scroll="onScroll"
  8. >
  9. <cl-back-top v-if="backTop"></cl-back-top>
  10. <theme></theme>
  11. <ui></ui>
  12. <slot></slot>
  13. </scroll-view>
  14. <!-- #endif -->
  15. <!-- #ifndef APP -->
  16. <cl-back-top v-if="backTop"></cl-back-top>
  17. <theme></theme>
  18. <ui></ui>
  19. <slot></slot>
  20. <!-- #endif -->
  21. </template>
  22. <script setup lang="ts">
  23. import { ref } from "vue";
  24. import Theme from "./theme.uvue";
  25. import Ui from "./ui.uvue";
  26. import { config } from "@/config";
  27. import { scroller } from "@/.cool";
  28. defineOptions({
  29. name: "cl-page"
  30. });
  31. defineProps({
  32. // 是否显示回到顶部按钮
  33. backTop: {
  34. type: Boolean,
  35. default: config.backTop
  36. }
  37. });
  38. // 滚动距离
  39. const scrollTop = ref(0);
  40. // scroll-view 滚动位置
  41. const scrollViewTop = ref(0);
  42. // view 滚动事件
  43. function onScroll(e: UniScrollEvent) {
  44. // 触发滚动事件
  45. scroller.emit(e.detail.scrollTop);
  46. }
  47. // 页面滚动事件
  48. scroller.on((top) => {
  49. scrollTop.value = top;
  50. });
  51. // 滚动到指定位置
  52. function scrollTo(top: number) {
  53. // #ifdef H5
  54. window.scrollTo({ top, behavior: "smooth" });
  55. // #endif
  56. // #ifdef MP
  57. uni.pageScrollTo({
  58. scrollTop: top,
  59. duration: 300
  60. });
  61. // #endif
  62. // #ifdef APP
  63. scrollViewTop.value = top;
  64. // #endif
  65. }
  66. // 回到顶部
  67. function scrollToTop() {
  68. scrollTo(0 + Math.random() / 1000);
  69. }
  70. defineExpose({
  71. scrollTop,
  72. scrollTo,
  73. scrollToTop
  74. });
  75. </script>