小程序弹幕自动滚动实时更新数据功能

这篇具有很好参考价值的文章主要介绍了小程序弹幕自动滚动实时更新数据功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需求

最近遇到的需求,写一个弹幕功能

小程序弹幕自动滚动实时更新数据功能,小程序

大致就是实现这样的效果

弹幕轮播,上下两排,一共30个弹幕,30个轮播完毕之后获取新的弹幕数据

实现方法

 目前我想到的实现方法是用css的动画来实现这个功能

              <view class="barrage">
				<view class="barrageBox">
					<view class="barrageList" v-for="(item,index) in barrage1" :key="index">
						
					</view>
				</view>
				<view class="barrageBottom barrageBox">
					<view class="barrageList" v-for="(item,index) in barrage2" :key="index">
						
					</view>
				</view>
			</view>

布局层级

给barrageBox盒子一个相对定位

给barrageList绝对定位 先将list盒子定位到box盒子的右边外面

然后是动画 最开始百分之0的时候在最右边

时间最后结束的时候移动到最左边left给0,然后再移动自身的百分之百到最左边,就可以实现整个盒子都移动到最左边并且隐藏

因为时间是固定的 所以从最右边移动到最左边的时间是一致的,但是盒子给了max-content的属性。盒子宽度根据内容的最大宽带撑开,不同大小的盒子要在同样的时间之内走完,所以会有走得快走得慢的区别,刚刚好也实现了我们现在的需求,盒子的运动速度不同

.barrageList {
				background: rgba(0, 0, 0, 0.2);
				border-radius: 60rpx 60rpx 60rpx 60rpx;
				height: 52rpx;
				width: max-content;
				display: flex;
				align-items: center;
				padding: 0 16rpx 0 6rpx;
				font-size: 24rpx;
				color: #FFFFFF;
				position: absolute;
				left: 750rpx;
				top: 0;
				animation: barrageMove 6s linear 1;

				@keyframes barrageMove {
					0% {
						left: 750rpx;
					}

					100% {
						left: 0;
						transform: translateX(-100%);
					}
				}
}

到了这个时候其实已经可以看到盒子的运动了,但是目前只有一条数据

如果一次性把所有的数据渲染,那么就会出现所有数据堆叠在一起的情况

这个时候我想到的是,动态数据,因为每次渲染一个新的数据的时候,都会重新给这个数据css,也就是都会从最右边隐藏的地方开始渲染

然后就是写算法了

先在data里面给两个数据列表

       data() {
			return {
			
				// 弹幕数据
				barrage1: [],
				barrage2: [],


			};
		},

接下来就是获取后台的数据,没有数据的时候可以自己进行模拟数据


			async getbarrageList() {
				// 每次调用方法的时候都把两个列表数据清空,避免出现数据堆叠
				this.barrage1 = []
				this.barrage2 = []
                // 获取到数据之后
				if (res) {
                    // 首先对用户name做处理,我比较懒,就除了名字第一个保留,剩下的用xxx来代替了
					res.forEach(i => {
						i.nickName = i.nickName[0] + 'xxx'
					})
					let n = 0
                    // 重点在这里,设置一个定时器,每过1.2秒判断一次数据,单还是双,分别给第一个列表和第二个列表加入数据
					this.barrageTimer = setInterval(() => {
						if ((this.barrage1.length + this.barrage2.length) < res.length - 1) {
							if ((n + 1) % 2 != 0) {
								this.barrage1.push(res[n])
								n++
							} else {
								this.barrage2.push(res[n])
								n++
							}
						} else {
							clearInterval(this.barrageTimer)
						}
						// console.log(this.barrage1, '1', this.barrage2, '2');
					}, 1200)
				}

			},

我懒得写for循环了,假设获取到数据之后 先对需要处理的数据进行处理,我这里因为需要隐藏用户name,所以先对用户name做了处理

然后定义一个n,作为起始的下标

这个时候需要定义一个定时器 因为后续需要对定时器清除 所以data里面要定义定时器

 data() {
			return {
			
				// 弹幕数据
				barrage1: [],
				barrage2: [],

                barrageTimerOut: null,
				barrageTimer: null
			};
		},

除了现在用的这个计时器,后续还有一个,所以我两个一起定义了,具体第二个用来干嘛的,等下我会说

然后就是判断数据是否完全分别加入两个列表里面了,如果没有的话,单数的数据加入第一个列表里面,双数的数据加入到第二个数据里面,我们需求是1.2秒加一条数据,刚好这样能形成数据的错开,n的下标是从0开始的 我们一共是30条数据 所以算是单双的时候需要+1,算数据是否完毕的时候,因为第一条数据判断是两个列表都为0的时候,所以总数的res.length需要-1。

这个时候再回头去看弹幕,已经开始滚动起来了

实现原理

实现的原理就是动态数据,每次间隔一段时间渲染一条数据,每次渲染数据的时候会重新赋一个class,css属性会给初始值也就是在最右边,同时也会开始动画,6秒的时间,从最右边到最左边,而新数据渲染的时候,之前渲染的数据已经在往左边走了,所以两条数据会错开,就会有滚动的效果,如果要实现无限滚动,只需要用第二个动画,把循环次数改为infinite无限就行

				animation: barrageMove 6s linear 1;
				animation: barrageMove 6s linear infinite;

实现过一段时间刷新新的弹幕数据

先上代码

        onShow() {
			this.barrage1 = []
			this.barrage2 = []
			if (this.barrageTimerOut) {
				clearInterval(this.barrageTimerOut)
			}
			this.getbarrageList()
			this.barrageTimerOut = setInterval(() => {
				this.getbarrageList()
			}, 42000)
		},
		onHide() {
			console.log('hide');
			clearInterval(this.barrageTimerOut)
			clearInterval(this.barrageTimer)
		},

在获取数据之前,记得一定要在onshow里面先把两个列表数据进行一次清空,不清空的话,可能会出现数据堆叠的情况,我写代码喜欢多写一次判断,判断是否有定时器存在,没有被清除,有的话先把定时器清除

然后说一下算法为什么是需求是30条数据后获取新数据,我要写42秒

算法是1.2秒*30条数据+最后一条数据完全走完所需的时间6秒

1.2*30+6 就是所有数据完全走完所需要的时间,如果没有完全走完的话就获取新的数据的话,会出现数据还没走完,然后就被完全清空的情况,我们觉得不美观,数据突然消失,所以还是在数据走完后获取

在onshow里写定时器,每过42秒获取新数据,就可以实现弹幕的实时更新,最后记得,离开页面的时候,把所有的定时器清除,如果觉得onHide不保险,可以在onUnload里面也写一次

补充

今天测试发现的一个bug,数据如果后端忘记做限制最大30条的时候会出现bug,所以在获取到数据的时候要做一个判断

let newArr=[]                    
if(res.length>30){
    newArr=res.slice(0,30)
}else{
    newArr=res                      
}

截取数据到只有30条,后续的res替换成resArr就行

作为保险

onShow里面的定时器里面记得清除调用方法时候的计时器

         onShow() {
			this.barrage1 = []
			this.barrage2 = []
			if (this.barrageTimerOut) {
				clearInterval(this.barrageTimerOut)
			}
			this.getbarrageList()
			this.barrageTimerOut = setInterval(() => {
				clearInterval(this.barrageTimer)
				this.getbarrageList()
			}, 42000)
		},

this.barrageTimerOut = setInterval(() => {
                clearInterval(this.barrageTimer)
                this.getbarrageList()
            }, 42000)文章来源地址https://www.toymoban.com/news/detail-807281.html

到了这里,关于小程序弹幕自动滚动实时更新数据功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Java面试基础|数据结构 -实时更新

    1.HashMap和ConcurrentHashMap介绍 核心是一个Node数组, 数据结构与hashMap相似 使用CAS操作来实现无锁的更新,提高了并发性。当更新节点时,它会使用CAS来替换节点的值或链接,如果CAS失败,表明有其他线程也在进行修改,当前线程可以重试或锁定节点 对于复杂的结构修改操作

    2024年01月17日
    浏览(53)
  • WebSocket实现后端数据变化,通知前端实时更新数据

    背景 ​ 项目中需要做一个消息提示功能,当有用户处理相关待办信息后,别的用户需要实时更新处理后的待办信息。 解决方案: ​ 1、使用最原始的方法,写个定时器去查询待办信息。但这种方式在大多数情况是不被允许的,它会浪费系统中的许多资源,同时也并不是完全

    2024年04月15日
    浏览(49)
  • Rust采集天气预报信息并实时更新数据

    最近天气温度时高时低,虽说这是大自然的力量人无法抗拒,不能改变那么我们就做预防工作。今天我将用Rust写一个爬虫程序实现电脑桌面实时更新天气情况,这个是一个底层逻辑,需要多方面配合,不仅要有完善的代码还有爬虫IP试试更新才能保证数据最完整最新。 这是一

    2024年01月19日
    浏览(49)
  • vue中组件动态传值,实现数据实时更新

    在一些项目需求中需要父组件向子组件动态传值,比如父组件动态通过axios获取数据,然后传给子组件,子组件根据拿到的数据进行展示。 props传值的时候,只会首次传递绑定的值,不会变化 方式1 利用watch监听props变化 方式2 利用ref获取子组件,调用子组件的方法将值传递过

    2024年02月16日
    浏览(51)
  • WPF绑定数据,增删改后实时更新TreeView/ListView

    WPF的界面的确好看,也引入了很多新功能,和winform相比更先进更强大......那么狗儿蛋,代价是什么? 代价就是WPF学起来比较费力。 数据绑定是WPF的特色之一,可以省去写代码更新UI界面的工作。这次打算做一个管理数据的小软件,自然的我也打算在界面上弄个TreeView,然后把

    2024年02月09日
    浏览(55)
  • 实时数据流无忧:用 SpringBoot 和 SSE 打造动态前端更新的终极指南

    你知道什么是开发者的梦魇吗?慢!慢!慢!在一个需要实时数据更新的应用中,如果数据像乌龟一样慢吞吞地爬行,那用户体验就会像坐过山车一样直线下降。所以今天,我们要化身为数据传输的超级英雄,用 SpringBoot 和 SSE(服务器发送事件)打造一个超酷、超快、而且超

    2024年02月02日
    浏览(44)
  • Android:实时更新时间

    心想着也就是更新精确到分钟,不用精确到秒,定时器就没有必要,系统是有广播 Intent.ACTION_TIME_TICK 可以直接用 动态注册广播 主方法里面调用一下 接收广播并处理 精确到时:分的方法 

    2024年02月15日
    浏览(108)
  • 2023最新AI创作系统/ChatGPT商业运营版网站程序源码+支持GPT4+支持ai绘画(MJ)+实时语音识别输入+免费更新版本

    1、提问:程序已经支持GPT3.5、GPT4.0接口 2、支持三种Ai绘画模型(官方Midjourney模型、GPT3.5KEY绘画、国内其他绘画模型) 3、中英文实时语音识别输入,文章资讯发布功能,菜单工具栏功能,邮箱验证和手机短信验证注册登录,邀请返佣功能。 4、新增Prompt面具角色扮演功能 5、

    2024年02月11日
    浏览(85)
  • WebSocket 网络协议(实时更新 )

    WebSocket 是一种在客户端和服务器之间建立双向通信信道的网络协议。它在客户端和服务器之间建立一个持久的、全双工的连接,允许数据在两个方向上实时传输,而不需要像HTTP一样进行多次请求和响应。  WebSocket 的主要优势是减少了服务器和客户端之间的通信延迟,因为数

    2024年01月17日
    浏览(50)
  • ClickHouse如何处理实时更新

    本文通过示例介绍如何处理ClickHouse实时更新。OLAP数据库并不欢迎数据变更操作,ClickHouse也不例外,和其他OLAP产品一样,刚开始ClickHouse甚至不支持更新,更新能力是后来才加上的,但是按照ClickHouse方式增加的。当前ClickHouse更新是异步的,使得在交互应用中难以使用。有很多

    2024年02月15日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包