当前位置:   article > 正文

uni-app小程序中做页面滚动底部或顶部加载效果_uniapp加载动画

uniapp加载动画

移动应用开发中,无限滚动加载是一个常见的功能,用户可以通过滑动屏幕来加载更多的内容,从而提高应用的用户体验。本文将介绍如何使用Uniapp实现无限滚动加载的功能。

概述

我们需要实现的无限滚动加载功能的具体效果如下:

  1. 当用户滑动到底部时,自动加载更多的数据。

  2. 在加载数据时,显示一个加载动画,防止用户误以为应用已经崩溃。

  3. 当所有数据都已经加载完毕时,提示用户“没有更多数据了”。

方案

我们可以通过以下步骤来实现无限滚动加载功能:

  1. cs.vue组件中,使用uni.createIntersectionObserver()方法创建一个交叉观察器,用于观察加载动画是否进入了用户的视图区域。

  2. 在交叉观察器的回调函数中,判断加载动画是否进入了用户的视图区域,并根据需要加载更多的数据。

  3. 在加载数据时,使用事件来控制加载动画的出现与隐藏。

  4. 当所有数据都已经加载完毕时,使用事件来控制“没有更多数据了”的提示是否显示。

  5. index.vue组件中,引入cs.vue组件,并通过事件来控制加载动画和“没有更多数据了”的提示是否显示。

实现

cs.vue组件中,我们需要使用事件来控制加载动画的出现与隐藏。具体来说,当交叉观察器的回调函数中判断需要加载数据时,我们需要通过$emit方法触发一个名为aaa的事件,并传递参数0,表示加载动画需要出现。当数据加载完毕后,我们再次触发aaa事件,并传递参数1,表示加载动画需要消失。代码如下:

  1. if (res.intersectionRatio > 0) {
  2. this.$emit("aaa", 0); // 加载动画出现
  3. setTimeout(() => {
  4. this.a += 10;
  5. this.$emit("aaa", 1); // 加载动画消失
  6. }, 3000)
  7. }

cs.vue组件中,我们还需要使用事件来控制“没有更多数据了”的提示是否显示。具体来说,当所有数据都已经加载完毕时,我们需要通过$emit方法触发一个名为aaa的事件,并传递参数2,表示“没有更多数据了”的提示需要显示。代码如下:

if (this.a > 50) return this.$emit("aaa", 2);

index.vue组件中,我们需要引入cs.vue组件,并通过事件来控制加载动画和“没有更多数据了”的提示是否显示。具体来说,我们需要监听aaa事件,并根据传递的参数来控制加载动画和“没有更多数据了”的提示是否显示。代码如下:

  1. <template>
  2. <view class="container">
  3. <text>{{appear === 0 ? '小球出现' : '小球消失'}}</text>{{appear}}
  4. <view class="page-section">
  5. <scroll-view class="scroll-view" scroll-y>
  6. <cs :appear="appear" @aaa="(val) => appear=val"></cs>
  7. </scroll-view>
  8. </view>
  9. </view>
  10. </template>
  11. <script>
  12. import cs from './cs.vue';
  13. let observer = null;
  14. export default {
  15. components: {
  16. cs
  17. },
  18. data() {
  19. return {
  20. appear: 1
  21. }
  22. },
  23. }
  24. </script>

最后,为了避免内存泄漏,我们需要在cs.vue组件销毁时将交叉观察器断开连接。具体来说,我们需要在onUnload生命周期函数中使用disconnect()方法将交叉观察器断开连接。代码如下:

  1. onUnload() {
  2. if (observer) {
  3. observer.disconnect()
  4. }
  5. }

至此,我们就完成了无限滚动加载的实现。完整代码如下:

cs.vue组件代码:

  1. <template>
  2. <view>
  3. <view class="item" v-for="item of a" :key="item">
  4. {{item}}锄禾日当午
  5. </view>
  6. <qiuy-loading class="ball" :class="{'is':appear===0}"></qiuy-loading>
  7. <view v-show="appear===2">
  8. 没有数据了
  9. </view>
  10. </view>
  11. </template>
  12. <script>
  13. let observer = null;
  14. import QiuyLoading from './QiuyLoading.vue'
  15. export default {
  16. components: {
  17. QiuyLoading
  18. },
  19. props: ["appear"],
  20. data() {
  21. return {
  22. a: 20
  23. }
  24. },
  25. mounted() {
  26. observer = uni.createIntersectionObserver(this);
  27. observer.relativeTo('.scroll-view').observe('.ball', (res) => {
  28. // 当a》50时,停止加载
  29. if (this.a > 50) return this.$emit("aaa", 2);
  30. // 如果当前状态已经在加载中,则不进行。
  31. if (this.appear !== 1) return;
  32. // 出现了
  33. if (res.intersectionRatio > 60) {
  34. // 先让加载动画显示出来
  35. this.$emit("aaa", 0);
  36. setTimeout(() => {
  37. this.a += 10;
  38. // 加载出了数据,关闭加载动画
  39. this.$emit("aaa", 1);
  40. }, 3000)
  41. }
  42. })
  43. },
  44. onUnload() {
  45. if (observer) {
  46. observer.disconnect()
  47. }
  48. }
  49. }
  50. </script>
  51. <style>
  52. .notice {
  53. margin-top: 150rpx;
  54. margin: 150rpx 0 400rpx 0;
  55. }
  56. .is {
  57. height: auto;
  58. overflow: hidden;
  59. }
  60. .item {
  61. line-height: 100rpx;
  62. font-size: 40rpx;
  63. }
  64. </style>

index.vue组件代码:

  1. <template>
  2. <view class="container">
  3. <text>{{appear === 0 ? '小球出现' : '小球消失'}}</text>{{appear}}
  4. <view class="page-section">
  5. <scroll-view class="scroll-view" scroll-y>
  6. <cs :appear="appear" @aaa="(val) => appear=val"></cs>
  7. </scroll-view>
  8. </view>
  9. </view>
  10. </template>
  11. <script>
  12. import cs from './cs.vue';
  13. let observer = null;
  14. export default {
  15. components: {
  16. cs
  17. },
  18. data() {
  19. return {
  20. appear: 1
  21. }
  22. },
  23. }
  24. </script>
  25. <style>
  26. .scroll-view {
  27. height: 800rpx;
  28. background: #fff;
  29. border: 1px solid #ccc;
  30. box-sizing: border-box;
  31. /* padding-bottom: 30px; */
  32. }
  33. .scroll-area {
  34. height: 1300rpx;
  35. display: flex;
  36. flex-direction: column;
  37. align-items: center;
  38. transition: .5s;
  39. }
  40. </style>

QiuyLoading.vue里的内容

  1. <template>
  2. <view class="loader">
  3. <view class="l">L</view>
  4. <view class="o">o</view>
  5. <view class="a">a</view>
  6. <view class="d">d</view>
  7. <view class="i">i</view>
  8. <view class="n">n</view>
  9. <view class="g">g</view>
  10. <view class="d1">.</view>
  11. <view class="d2">.</view>
  12. </view>
  13. </template>
  14. <script>
  15. </script>
  16. <style>
  17. .loader {
  18. text-align: center;
  19. height: 0;
  20. overflow: hidden;
  21. }
  22. .is {
  23. height: auto;
  24. padding-bottom: 20rpx;
  25. }
  26. </style>

最后,看下效果吧!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/96964
推荐阅读
相关标签
  

闽ICP备14008679号