uniapp聊天页面之消息滚动

news/2024/7/10 1:45:02 标签: uni-app, 开发语言, javascript, vue

目录

1、HTML部分

2、 Js部分

3、注意,滚动方法调用


1、HTML部分

用整个scroll-view的高度减去所有聊天内容的高度,得到的就是滚动条需要下拉的距离,即可使聊天页下拉至最底部。

需要给 scroll-view一个固定的高度,并获取消息信息的高度。

<view class="content">
		<scroll-view style="background-color: #f5f5f5;" class="chat-window" scroll-y="true" show-scrollbar="true"
			:scroll-with-animation="true" :scroll-top="scrollTop" :style="{height: style.contentViewHeight + 'px'}">
			<view class="all" id='chatContent'>
				<view class="word">
                  <!-- 遍历获取到的消息 -->
					<view v-for="(item ,index) in chatLog" class="cu-chat">
						<!-- 他人信息 -->
						<view class="left-pal" v-show="item.from !== sendData.from">
							<up-image :src="userMap.get(item.from)" width="100rpx" height="100rpx" shape="circle"
								@click="skipDetails"></up-image>
							<view class="container"> {{item.content}}</view>
						</view>
						<!-- 自己发送信息 -->
						<view class="right-own" v-show='item.from === sendData.from'>
							<view class="oneself">
								<view class="container"> {{item.content}}</view>
								<up-image :src="userMap.get(item.from)" width="100rpx" height="100rpx" shape="circle"
									@click="skipMy"></up-image>
							</view>
						</view>
					</view>
				</view>
			</view>
		</scroll-view>
		<view class="base">
			<up-input placeholder="请输入内容" style="background-color: #fff;" border="surround"
				v-model="sendData.content"></up-input>
			<u-button text="发送" type="success" class="button" @click="Send"
				:disabled="sendData.content.length==0"></u-button>
		</view>
	</view>

2、 Js部分

javascript">	//定义盒子的初始高度
	const style = ref({
		contentViewHeight: 0,
		mitemHeight: 0
	})
    //contentViewHeight: 消息信息展示, mitemHeight: 消息总高度

	onLoad((option) => {
		const res = uni.getSystemInfoSync(); //获取手机可使用窗口高度 
		style.value.contentViewHeight = res.windowHeight - 60;
        // res.windowHeight:屏幕的高度减去,输入框的高度,得到信息的需要展示的高度
	})
javascript">/**
	 * @information 跳转页面底部
	 */
	const scrollToBottom = () => {
		let query = uni.createSelectorQuery();
		query.selectAll('.cu-chat').boundingClientRect();
     //获取所有消息节点

		query.exec((res) => {
			style.value.mitemHeight = 0;
			res[0].forEach((rect) => style.value.mitemHeight = style.value.mitemHeight + rect.height + 40)
			//获取所有内部子元素的高度,遍历得到总高度

			/** 因为vue的虚拟DOM 每次生成的新消息都是之前的,所以采用异步setTimeout   
              * 主要就是添加了这定时器
              */
			setTimeout(
				() => {
					if (style.value.mitemHeight > (style.value.contentViewHeight - 100)) {
						//判断子元素高度是否大于显示高度
						scrollTop.value = style.value.mitemHeight - style.value.contentViewHeight
						//用子元素的高度减去显示的高度就获益获得序言滚动的高度
					}
				}, 100)
		})
	}

3、注意,滚动方法调用

        刚进入页面的时候,有可能会没有滚动效果,这可能是因为消息列表的DOM节点还没有渲染到页面上,滚动的方法变已经执行了,导致滚动效果消失。所以调用的时候最好放在nextTick中。

javascript">nextTick(() => {
				scrollToBottom()
			})
//待全部DOM节点加载完后再滚动


http://www.niftyadmin.cn/n/5414041.html

相关文章

Android14音频进阶:AudioTrack如何拿到AudioFlinger创建的匿名共享内存(六十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

基于sprinbgoot的火锅店管理系统(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

151.反转字符串中的单词

题目&#xff1a;给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存…

Oracle VM VirtualBox 安装完Ubuntu系统后一直提示安装Ubuntu

是因为存储设置有问题&#xff0c;把Ubuntu镜像添加进去了,移除后重启虚拟机就不会提示了 以下是配置的移除后的界面。

第三章 OpenGL ES 基础-基础-GLSL渲染纹理

第三章 OpenGL ES 基础-GLSL渲染纹理 第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵 GLSL的s…

OC和Swift混合开发(Pod私有库的相互引用)

环境 Xcode 12.4, Swift&#xff1a;5.0 概述&#xff1a;该文档主要介绍OC和Swift混合开发相互调用&#xff0c;包括3大类情况和12种具体情形。 三大类情况&#xff1a; 1. 主工程内的混合互调&#xff0c; 2. 主工程和Pod三方库之间的混合互调&#xff0c; 3. Pod三方…

【嵌入式——QT】Model/View

【嵌入式——QT】Model/View 基本原理数据模型视图组件代理Model/View结构的一些概念QFileSystemModelQStringListModelQStandardItemModel自定义代理 基本原理 GUI应用程序的一个很重要的功能是由用户在界面上编辑和修改数据&#xff0c;典型的如数据库应用程序&#xff0c;数…

基于uniapp cli项目开发的老项目,运行报错path.replace is not a function

项目&#xff1a;基于uniapp cli的微信小程序老项目 问题&#xff1a;git拉取代码&#xff0c;npm安装包时就报错&#xff1b; cnpm能安装成功包&#xff0c;运行报错 三种方法尝试解决&#xff1a; 更改代码&#xff0c;typeof pathstring的话&#xff0c;才走path.replace…