uni-app 聊天对话滚动到最底部

uni-app 之 聊天室滚到最底部

  请注意 !:  知识点为uni-app 与 vue 结合

  这次写到聊天室,碰到一个emmmmm问题比较严重的事情,聊天嘛,咱们想实现的就无非是微信,QQ那种聊天的效果嘛,我们研究了,,,,emmmm  (n久之长),终于是把这个功能写出来了,代码等什么时候整理出来给大家看,今天主要说一下碰到的一个问题,就是我发送消息的时候, 想要将消息弹出,发一条弹一条,代码附上

  注意:scroll-view要设置高度

  输入内容后,必然要在对话界面的底部显示内容,可以通过uni.pageScrollTo的方式,但是这个页面刷新的太厉害,输入框都刷新了,没法使用。所以只能使用scroll-view组件。但是通过scroll-view使用竖向滚动时,需要给 一个固定高度。为了适配屏幕的大小,则需要通过计算来确定scroll-view的高度。

<view class="content" id="content" :style="{height: style.contentViewHeight + 'px'}"><scroll-view id="scrollview" class="chat-window" scroll-y="true" :style="{height: style.contentViewHeight + 'px'}" :scroll-with-animation="true" :scroll-top="scrollTop"><!-- <view class="chat-window"> --><view class="small-talk_time">12:18</view><!-- 聊天内容 --><view class="content-all"><!-- 聊天窗口 --><view :class="item.type" v-for="(item, index) in chatRecord" :key="index" class="m-item"><!-- 收信人 --><view class="talk-text talk-left" v-if="item.type == 'talk-left'"><!-- 收信人头像 --><view class="talk-photo"><image src="../../static/images/myself.jpg" class="talk-img"></image></view><!-- 收信人消息 --><view class="talk-content"><view class="talk-huge"></view><view class="talk-title">{{item.message}}</view></view></view><view class="talk-text talk-right" v-if="item.type == 'talk-right'"><!-- 发信人消息 --><view class="talk-content"><view class="talk-title">{{item.message}}</view><view class="talk-huge"></view></view><!-- 发信人头像 --><view class="talk-photo"><image src="../../static/images/myself.jpg" class="talk-img"></image></view></view></view></view><!-- </view> --></scroll-view></view>

 

 既然是聊天 先将聊天页面写出来 写好了你说我说的样式  大概就是这个样子

js代码:

 created () {const res = uni.getSystemInfoSync();   //获取手机可使用窗口高度     api为获取系统信息同步接口this.style.pageHeight = res.windowHeight;this.style.contentViewHeight = res.windowHeight - uni.getSystemInfoSync().screenWidth / 750 * (100) - 70; //像素   因为给出的是像素高度 然后我们用的是upx  所以换算一下 this.scrollToBottom();   //创建后调用回到底部方法},     export default {data (){// 聊天页面时时滚动样式style: {pageHeight: 0,contentViewHeight: 0,footViewHeight: 90,mitemHeight: 0},}
}
   /*** @author gongliying* @date 2019-07-26* @information 跳转页面底部*/scrollToBottom: function () {let that = this;let query = uni.createSelectorQuery();query.selectAll('.m-item').boundingClientRect();query.select('#scrollview').boundingClientRect();query.exec((res) => {that.style.mitemHeight = 0;res[0].forEach((rect) => that.style.mitemHeight = that.style.mitemHeight + rect.height + 40)   //获取所有内部子元素的高度if (that.style.mitemHeight > (that.style.contentViewHeight - 100)) {   //判断子元素高度是否大于显示高度that.scrollTop = that.style.mitemHeight - that.style.contentViewHeight    //用子元素的高度减去显示的高度就获益获得序言滚动的高度}})}
  这一步做的主要就是获取这个‘.m-item’这个里面的节点信息   uni-app虽然不支持window和document 但是咱们还是有一个api可以获取他元素的信息的 就算是uni.createSelectorQuery()这个api,他会返回一个 SelectorQuery 对象实例。可以在这个实例上使用 select 等方法选择节点,并使用 boundingClientRect 等方法选择需要查询的信息。这个exec()他会执行这里面所有的请求,我们最后会获取到他的id dataset 左边界坐标  右边界坐标 上边界坐标 下边界左边 节点的宽度  节点的高度   具体的这个方法的使用可以去官网查看一番,我就不具体解释了  毕竟今天重点不是他呀    回到 原题   咱们说了   在最开始created的时候获取你当前使用手机的品牌啊  型号啊   我们这里主要的是获取可使用窗口的高度     然后我们又获取了所有子元素的告诉   然后就可以看着我的注释走了~~~~

  但是呢。你们不要以为这样就好了  , 还有一个很重要的事情,如果你们认真看了这段代码还有就是实验了一下, 你们会发现到最后那个滚动条没有滚动到最底部,会发现最后一调消息被隐藏了,也不是没有 ,页面上有这条消息,但是呢就是没有弹出来,后来呢,

仔细分析了一下,因为由于vue采用虚拟dom,我每次生成新的消息时获取到的div的scrollHeight的值是生成新消息之前的值,所以造成每次都是最新的那条消息被隐藏掉了!这就是开头我跟大家说注意这是uni-app和vue结合的原因了

  解决方法:采用异步处理settimeout函数获取最新的scrollheight  让他先全部执行完了之后去走这个异步,这样就能确保滚动条每次滚到的都是最底部  上段代码更改如下:

/*** @author gongliying* @date 2019-07-26* @information 跳转页面底部*/scrollToBottom: function () {let that = this;let query = uni.createSelectorQuery();query.selectAll('.m-item').boundingClientRect();query.select('#scrollview').boundingClientRect();query.exec((res) => {that.style.mitemHeight = 0;res[0].forEach((rect) => that.style.mitemHeight = that.style.mitemHeight + rect.height + 40)   //获取所有内部子元素的高度// 因为vue的虚拟DOM 每次生成的新消息都是之前的,所以采用异步setTimeout    主要就是添加了这定时器setTimeout(() => {if (that.style.mitemHeight > (that.style.contentViewHeight - 100)) {   //判断子元素高度是否大于显示高度that.scrollTop = that.style.mitemHeight - that.style.contentViewHeight    //用子元素的高度减去显示的高度就获益获得序言滚动的高度}}, 100)})}

最后实现了每次聊天都是滚到最底部  要是想要进入页面就滚到最底部呢  我们是在socket链接读取文件的时候调用了这个方法

 

此文章转载自https://www.cnblogs.com/gongliying/p/11258189.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5866.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用uniapp跨平台开发一款商用的ai绘图ai作画软件的全过程

随着科技的发展&#xff0c;人工智能将会是以后的主流方向&#xff0c;ai绘图、chatgpt高科技先后出台&#xff0c;都获得了火爆的发展&#xff0c;因此想借着势头开发一款主打ai绘图的app小程序 一、前期准备 1、选定技术框架 因为后面需要多平台发布&#xff0c;而尽可能减…

对话风变科技 CTO|从线上教育服务商到教育资源供给平台,风变背后的第二增长曲线思维

Authing 是用户中心团队&#xff0c;我们是业务系统&#xff0c;大家冲刺一个目标、再做合并&#xff0c;然后让基于多租户的 B 端产品成功上线。那个阶段刚好有个客户卡在当时的时间点&#xff0c;一定要赶着上线&#xff0c;最后 Authing 的协作让我们赢得了客户信任&#xf…

盘古石晋级赛复盘

这篇复盘是这次暑假对上次取证的一次复盘&#xff0c;复盘中参考了部分大佬的博客。后面软路由和服务器暂时还没有整完&#xff0c;还会继续更新。 Android分析 1.涉案应用刷刷樂的签名序列号是(答案格式&#xff1a;123ca12a) 11fcf899 通过雷电一跑就出来了 2.涉案应用刷…

基于android音乐播放器的设计

本科毕业论文&#xff08;设计&#xff09;诚信声明 本人郑重声明&#xff1a;所呈交的毕业论文&#xff08;设计&#xff09;&#xff0c;题目《………基于android音乐播放器的设计……………………………》是本人在指导教师的指导下&#xff0c;进行研究工作所取得的成果。对…

微信支付兑换今日好礼不再累积提现免费额度;ChatGPT 上线最强应用「代码解释器」;GCC 10.5 发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

扫个二维码微信就崩溃的原因找到了|附源码分析

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) 建议别尝试&#xff1a;转发这个二维码到群里&#xff0c;3秒后你会回来骂我&#xff08;抖m求骂&#xff09; 近日&#xff0c;网传微信识别上方二维码就会出现闪退BUG&#xff0c;小编也忍不住尝试了一下&#xff…

如何管理你的手机存储空间,告别微信内存过大!

开始这篇文章之前&#xff0c;先说说这两天我在清理电脑存储上的一个插曲。 有着良好电脑使用习惯的我&#xff0c;直到上一次打开 Mac 的储存空间界面&#xff0c;还始终保持着预留至少 50G 的空间来避免可用存储空间过少造成的「心理健康」问题&#xff0c;直到某天清理电脑…

在微信小程序上添加chartGPT会怎么样?

字典工具类等小程序开发 目前小程序的使用者大部分来自&#xff1a;广州执信中学、广州二中、华南师范大学附属中学、华南师范大学、也有昆明三中&#xff08;同学在那边当老师推荐了一下&#xff0c;非常感谢&#xff09;等基本都是来自广东。 让它为你写个代码试试&#xff…

ChatGLM本地部署应用的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

本地部署 MiniGPT-4

本地部署 MiniGPT-4 1. 什么是 MiniGPT-42. Github 地址3. 安装 MiniGPT-44. 准备预训练的 MiniGPT-4 checkpoint5. 在本地启动演示其他 1&#xff0c;安装 CUDA Toolkit 11.8其他 2&#xff0c;安装 GCC 9 版本&#xff0c;并设置为默认GCC版本其他 3(成功)&#xff0c;重新安…

MiniGPT-4本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

深度学习实战32-构建ChatT5模型,实现智能问答系统,类ChatGPT(CPU部署)

大家好,我是微学AI,今天给大家介绍一下深度学习实战32-构建ChatT5模型,实现智能问答系统,类ChatGPT(CPU部署),ChatT5使用了T5架构来处理输入文本,具有高度的并行性和扩展性,使其能够快速处理大规模数据集。与传统NLP模型不同,ChatT5采用端到端的方式进行训练,从而可以…

本地部署 gpt4free

本地部署 gpt4free 什么是 gpt4free效果演示安装 ffmpeg启动 gpt4free访问 gpt4free guiWindows 下本地部署 gpt4free(20230515追记)其他 什么是 gpt4free GPT4Free 是一个由 xtekky 创建的基于 OpenAI GPT-4 和 GPT-3.5 的 API。它可以向用户提供类似于 OpenAI GPT-3 的功能&…

【类ChatGPT】本地CPU部署中文羊驼大模型LLaMA和Alpaca

昨天在github上看到一个在本地部署中文大模型的项目&#xff0c;和大家分享一下。先把地址po出来。 项目名称&#xff1a;中文LLaMA&Alpaca大语言模型本地部署 (Chinese LLaMA & Alpaca LLMs) 项目地址&#xff1a;https://github.com/ymcui/Chinese-LLaMA-Alpaca 以…

国内的几款强大的智能AI语言模型

1、Tomchat &#xff1a;Tomchat https://www.tomchat.work 支持gpt4 -3.5 支持 midjourny绘画 可长篇写作 无使用月限额 1、国内百度研发的&#xff0c;文心一言&#xff1a; https://yiyan.baidu.com/welcome 大家如果像我的界面一样有【开始体验】就是可以使用的&…

好用免费,国内手机人人都能玩的GPT!

用了这个长时间的chatgpt真的是觉得离不开它&#xff0c;太好用的&#xff01;又是是写作&#xff0c;编程&#xff0c;日常的一些咨询搜索的事情全部交给它了&#xff01;但是很少有人在手机上能玩GPT! 对于大多数普通选手来说&#xff0c;想在手机上玩GPT&#xff0c;始终离不…

ChatGPT能够知道当下最流行的开发语言,以及各语言哪个开发框架最火吗?

如果你准备成为一名开发人员&#xff0c;但是面对琳琅满目的开发语言&#xff0c;然后每种语言的开发框架却无从下手&#xff0c;张三推荐你学这个&#xff0c;李四推荐你学那个&#xff0c;而你的时间又是有限的&#xff0c;于是我决定问一问这个万事通ChatGPT。 目录 1. 目前…

拼多多驳斥有关其应用程序为“恶意软件”的指控;Google向部分用户预览Bard;ChatGPT出现严重漏洞|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

OpenAI使用条款、使用策略和支持的地区汇总:必读指南,避免OpenAI API被封禁

最近&#xff0c;一些群友反馈他们的OpenAI API被限制,其中包括试用金用户以及绑定了信用卡的用户。当他们调用API时&#xff0c;会收到以下报错信息&#xff1a; Your access was terminated due to violation of our policies, please check your email for more information…

通过云函数搭建内地可用的OpenAI代理(腾讯云centos系统)

需求&#xff1a; 大陆内地云服务器无须搭梯子&#xff0c;无须NGINX反向代理访问openAI。 背景&#xff1a; 平时工作环境是局域网&#xff0c;不方便分享给朋友用&#xff0c;即使不是局域网也不可能一直开着自己的电脑啦&#xff0c;于是想着给弄到云服务器上。 一般来说&…