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

这篇具有很好参考价值的文章主要介绍了uni-app小程序中做页面滚动底部或顶部加载效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

概述

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

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

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

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

方案

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

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

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

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

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

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

实现

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

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

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

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

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

<template>
  <view class="container">
    <text>{{appear === 0 ? '小球出现' : '小球消失'}}</text>{{appear}}
    <view class="page-section">
      <scroll-view class="scroll-view" scroll-y>
        <cs :appear="appear" @aaa="(val) => appear=val"></cs>
      </scroll-view>
    </view>
  </view>
</template>

<script>
	import cs from './cs.vue';
	let observer = null;
	export default {
		components: {
			cs
		},
		data() {
			return {
				appear: 1
			}
		},

	}
</script>

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

onUnload() {
  if (observer) {
    observer.disconnect()
  }
}

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

cs.vue组件代码:

<template>
	<view>
		<view class="item" v-for="item of a" :key="item">
			{{item}}锄禾日当午
		</view>
		<qiuy-loading class="ball" :class="{'is':appear===0}"></qiuy-loading>
		<view v-show="appear===2">
			没有数据了
		</view>
	</view>
</template>

<script>
	let observer = null;
	import QiuyLoading from './QiuyLoading.vue'
	export default {
		components: {
			QiuyLoading
		},
		props: ["appear"],
		data() {
			return {
				a: 20
			}
		},
		mounted() {
			observer = uni.createIntersectionObserver(this);
			observer.relativeTo('.scroll-view').observe('.ball', (res) => {

				// 当a》50时,停止加载
				if (this.a > 50) return this.$emit("aaa", 2);
				// 如果当前状态已经在加载中,则不进行。
				if (this.appear !== 1) return;
				// 出现了
				if (res.intersectionRatio > 60) {
					// 先让加载动画显示出来
					this.$emit("aaa", 0);
					setTimeout(() => {
						this.a += 10;
						// 加载出了数据,关闭加载动画
						this.$emit("aaa", 1);
					}, 3000)
				}
			})
		},
		onUnload() {
			if (observer) {
				observer.disconnect()
			}
		}
	}
</script>

<style>
	.notice {
		margin-top: 150rpx;
		margin: 150rpx 0 400rpx 0;
	}

	.is {
		height: auto;
		overflow: hidden;
	}

	.item {
		line-height: 100rpx;
		font-size: 40rpx;
	}
</style>

index.vue组件代码:

<template>
	<view class="container">
		<text>{{appear === 0 ? '小球出现' : '小球消失'}}</text>{{appear}}
		<view class="page-section">
			<scroll-view class="scroll-view" scroll-y>
				<cs :appear="appear" @aaa="(val) => appear=val"></cs>
			</scroll-view>
		</view>

	</view>
</template>
<script>
	import cs from './cs.vue';
	let observer = null;
	export default {
		components: {
			cs
		},
		data() {
			return {
				appear: 1
			}
		},
	}
</script>
<style>
	.scroll-view {
		height: 800rpx;
		background: #fff;
		border: 1px solid #ccc;
		box-sizing: border-box;
		/* padding-bottom: 30px; */
	}

	.scroll-area {
		height: 1300rpx;
		display: flex;
		flex-direction: column;
		align-items: center;
		transition: .5s;
	}
</style>

QiuyLoading.vue里的内容

<template>
	<view class="loader">
		<view class="l">L</view>
		<view class="o">o</view>
		<view class="a">a</view>
		<view class="d">d</view>
		<view class="i">i</view>
		<view class="n">n</view>
		<view class="g">g</view>
		<view class="d1">.</view>
		<view class="d2">.</view>
	</view>
</template>

<script>
</script>

<style>
	.loader {
		text-align: center;
		height: 0;
		overflow: hidden;
	}

	.is {
		height: auto;
		padding-bottom: 20rpx;
	}
</style>

最后,看下效果吧!

uni-app小程序中做页面滚动底部或顶部加载效果文章来源地址https://www.toymoban.com/news/detail-474923.html

到了这里,关于uni-app小程序中做页面滚动底部或顶部加载效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决uni-app微信小程序input,textarea输入框在底部时,键盘弹起页面整体上移问题

    问题是这样的input ,textarea获取焦点时会自动调起手机键盘,设置 :adjust-position=“true”,和不设置都会导致键盘弹起时页面整体上移 问题分析 input 获取焦点时会自动调起手机键盘,设置 :adjust-position=“true”,会导致键盘弹起时页面整体上移 思路: 设置使键盘弹起使页面不

    2024年02月11日
    浏览(65)
  • 【uni-app】【01】底部导航栏与页面切换

    1.(配置文件在哪)uni-app 路由控制是在 pages.json 文件中的。 2.(基本配置项有哪些)初学的时候主要有三个配置项,① pages ② globalStyle ③ tabbar [!TOC] 接下来主要是对这三个配置项做一个简单介绍。 负责页面管理。不需要自己写的,你在项目的 pages 文件夹下创建页面会自动生成配

    2023年04月27日
    浏览(54)
  • uni-app监听页面滚动

    在uni-app中可以通过监听页面滚动事件来实现滚动效果或响应滚动事件 在需要监听滚动的页面或组件中,添加一个 scroll 元素,用于容纳内容并实现滚动效果。 在页面或组件的方法中添加对应的滚动事件处理函数。

    2024年02月07日
    浏览(48)
  • uni-app前端H5页面底部内容被tabbar遮挡

    在用uniapp写小程序的时候,底部有一部分内容没显示出来,被底部的tabbar遮挡住了 给最外部的view设置样式 padding-bottom: var(--window-bottom) ,如下 参考1 参考2 使用 uni-app 框架开发的一个项目,发现 H5 端页面底部的内容被导航栏(Tabbar)遮挡,小程序端可以正常显示。 查阅资料

    2024年02月04日
    浏览(61)
  • uni-app微信小程序,APP都适用自定义顶部导航

    *使用自定义的导航样式,首先需要把原生的顶部的导航方式给隐藏掉(\\\"navigationStyle\\\": \\\"custom\\\") *手机顶部手机状态栏的高度 *微信小程序中胶囊的位置信息存储(使用store存储) *由于微信小程序中带有导航胶囊,所以需要根据胶囊去获取一定的参数信息 在微信小程序中,我们只需要获

    2024年02月06日
    浏览(58)
  • 关于uni-app微信小程序监听顶部左上角的返回事件

    在项目上返回上一级的时候需要清空vuex里的数据,使用了onBackPress无效。 查看官方文档后才发现onBackPress对微信小程序无效。  然后我发现了另一个生命周期——onUnload 完美解决!!!

    2024年02月08日
    浏览(53)
  • uni-app做h5IOS底部tabbar高度在不同的tabbar页面会忽高忽低

     原因不祥,解决办法的话在App.vue中

    2024年02月17日
    浏览(49)
  • uni-app滚动分页 兼容(App 小程序 H5)

    因为手机端本身屏幕空间不大 所以大家一般都会选择用滚动分页 首先 我在根目录下创建了一个 api目录 下面创建了一个bookApi.js 其中写了一个请求函数 getBookList 根据当前页 page 和 每页展示多少条 pageSize 获取数据 那么 我的组件代码是这样的 首先 我们肯定要引入bookApi.js中的

    2024年02月16日
    浏览(55)
  • 【uni-app】uni-app实现聊天页面功能(小程序)——布局篇

    在工作中使用uni-app参与开发一个小程序,其中要写一个简单的聊天页面,虽然功能不多(只有一个发送文字的功能),但是其中的细节比较多,也踩过很多坑,特此记录下来。要实现的页面如图所示,该篇主要讲讲如何布局(参考了很多文章之后根据页面需求进行一个整合)

    2024年02月05日
    浏览(89)
  • uni-app顶部下拉舒心

    操作步骤 基于 scroll-view 组件实现下拉刷新,需要通过以下方式来实现下拉刷新的功能。 配置 refresher-enabled 属性,开启下拉刷新交互 监听 @refresherrefresh 事件,判断用户是否执行了下拉操作 配置 refresher-triggered 属性,关闭下拉状态

    2024年01月24日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包