聊天框 - 微信加载历史数据的效果原来这样实现的

原文:https://juejin.cn/post/7337114587123335180?searchId=20240509192958AF7D129567F92AD7E083

公众号:程序员白特,欢迎一起交流学习~

前言

我记得2021年的时候做过聊天功能,那时业务也只限微信小程序

那时候的心路历程是:

卧槽,让我写一个聊天功能这么高大上??

嗯?这么简单,不就画画页面来个轮询吗,加个websocket也还行吧

然后,卧槽?这查看历史聊天记录什么鬼,页面闪一下不太好啊,真的能做到微信的那种效果吗

然后一堆调研加测试,总算在小程序中查看历史记录没那么鬼畜了,但是总是感觉不是最佳解决方案。

那时打出的子弹,一直等到现在击中了我

最近又回想到了这个痛点,于是网上想看看有没有大佬发解决方案,结果还真被我找到了。

正文开始

1,效果展示

上才艺~~~

2,聊天页面

2.1,查看历史聊天记录的坑

常规写法加载历史记录拼接到聊天主体的顶部后,滚动条会回到顶部、不在原聊天页面

直接上图

而我们以往的解决方案也只是各种利用缓存scroll的滚动定位把回到顶部的滚动条重新拉回加载历史记录前的位置,好让我们可以继续在原聊天页面。

但即使我们做了很多优化,也会有安卓和苹果部分机型适配问题,还是不自然,可能会出现页面闪动

其实吧,解决方案只有两行css代码\~~~

2.2,解决方案:flex神功

想优雅顺滑的在聊天框里查看历史记录,这两行css代码就是flex的这个翻转属性

dispaly:flex;  
flex-direction: column-reverse  

「灵感来源~~~」

小伙伴可以看到,在加载更多数据时

滚动条位置没变、加载数据后还是原聊天页面的位置

这不就是我们之前的痛点吗~~~

所以,我们只需要翻转位置,用这个就可以优雅流畅的实现微信的加载历史记录啦

flex-direction: column-reverse

官方的意思:指定Flex容器中子元素的排列方向为列(从上到下),并且将其顺序反转(从底部到顶部)

如果感觉还是抽象,不好理解的话,那就直接上图,不加column-reverse的样子

加了column-reverse的样子

至此,我们用column-reverse再搭配data数据的位置处理就完美解决加载历史记录的历史性问题啦

代码放最后啦~~~

2.3,其他问题

2.3.1,数据过少时第一屏展示

因为用了翻转,数据少的时候会出现上图的问题

只需要.mainArea加上height:100%

然后额外写个适配盒子就行

flex-grow: 1;   
flex-shrink: 1;  

2.3.2,用了scroll-view导致的问题

这一part是因为我用了uniappscroll-view组件导致的坑以及解决方案,小伙伴们没用这个组件的**「可忽略~~~」**

如下图,.mainArea使用了height:100%后,继承了父级高度后scroll-view滚动条消失了。

.mainArea去掉height:100%后scroll-view滚动条出现,但是第一屏数据过多时不会滚动到底部展示最新信息

解决方案:第一屏手动进行滚动条置顶

scrollBottom() {  if (this.firstLoad) return;  // 第一屏后不触发  this.$nextTick(() => {  const query = uni.createSelectorQuery().in(this);  query  .select("#mainArea")  .boundingClientRect((data) => {  console.log(data);  if (data.height > +this.chatHeight) {  this.scrollTop = data.height; // 填写个较大的数  this.firstLoad = true;  }  })  .exec();  });  
},  

3,服务端

使用koa自己搭一个websocket服务端

3.1 服务端项目目录

package.json

{  "name": "websocketapi",  "version": "1.0.0",  "description": "",  "main": "index.js",  "scripts": {  "test": "echo \"Error: no test specified\" && exit 1"  },  "author": "",  "license": "ISC",  "dependencies": {  "koa": "^2.14.2",  "koa-router": "^12.0.1",  "koa-websocket": "^7.0.0"  }  
}  

koa-tcp.js

const koa = require('koa')  
const Router = require('koa-router')  
const ws = require('koa-websocket')  const app = ws(new koa())  
const router = new Router()  /**  * 服务端给客户端的聊天信息格式  * {  id: lastid,  showTime: 是否展示时间,  time: nowDate,  type: type,  userinfo: {  uid: this.myuid,  username: this.username,  face: this.avatar,  },  content: {  url:'',  text:'',  w:'',  h:''  },  }  消息数据队列的队头为最新消息,以次往下为老消息  客户端展示需要reverse(): 客户端聊天窗口最下面需要为最新消息,所以队列尾部为最新消息,以此往上为老消息  */  router.all('/websocket/:id', async (ctx) => {  // const query = ctx.query  console.log(JSON.stringify(ctx.params))  ctx.websocket.send('我是小服,告诉你连接成功啦')  ctx.websocket.on('message', (res) => {  console.log(`服务端收到消息, ${res}`)  let data = JSON.parse(res)  if (data.type === 'chat') {  ctx.websocket.send(`我也会说${data.text}`)  }  })  ctx.websocket.on('close', () => {  console.log('服务端关闭')  })  
})  // 将路由中间件添加到Koa应用中    
app.ws.use(router.routes()).use(router.allowedMethods())  app.listen(9001, () => {  console.log('socket is connect')  
})  

切到server目录yarn

然后执行nodemon koa-tcp.js

没有nodemon的小伙伴要装一下

「代码区」

完整项目Github传送门

聊天页面的核心代码如下(包含data数据的位置处理和与服务端联动)

https://code.juejin.cn/pen/7337211042621521959(跳转链接或者点击下方阅读原文查看)

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

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

相关文章

syncGradle项目时报错Unknown Kotlin JVM target: 22

解决方案1 定位到build.gradle.kts的出问题行,将其注释掉然后把sourceCompatibility行也注释掉重新sync. 这样会自动使用默认兼容的版本 你也可以根据文档手动解决兼容问题2 Configure a Gradle project | Kotlin Documentation (kotlinlang.org) ↩︎ Compatibil…

经典回溯算法之N皇后问题

问题描述: 有一个N*N的棋盘,需要将N个皇后放在棋盘上,保证棋盘的每一行每一列每一左斜列每一右斜列都最多只能有一个皇后。 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如…

什么是虚拟货币?

随着科技的进步,虚拟货币逐渐进入公众视野,其影响深远且复杂。本文将从专业角度分析虚拟货币的发展现状、未来趋势,以及面临的挑战,并尝试提出一些思考。 一、虚拟货币的定义与现状 虚拟货币是一种基于区块链技术的数字资产&…

Golang入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

文章目录 一、golang 简介 1. go 语言特点2. go 语言应用领域3. 使用 go 语言的公司有哪些 二、安装 golang 1. golang 下载安装2. 配置环境变量 三、golang 开发工具 1. 安装 VSCode2. 下载所需插件 四、第一个 golang 应用 1. main 包的含义2. 示例 一、golang 简介 Go 是一…

Pytorch入门—Tensors张量的学习

Tensors张量的学习 张量是一种特殊的数据结构,与数组和矩阵非常相似。在PyTorch中,我们使用张量来编码模型的输入和输出,以及模型的参数。 张量类似于NumPy的ndarrays,只是张量可以在GPU或其他硬件加速器上运行。事实上&#xf…

音转文工具,9.8k star! 【送源码】

我们经常会遇到将音频转为文字的情况,比如在开会时录音的会议纪要、上课时录下的老师讲课内容。虽然网上也有一些在线的工具可以将音频转为文字,但是考虑到数据安全和费用问题,使用起来也不是很方便。 今天了不起给大家介绍一款开源工具——…

#友元函数与友元类

目录 1.概念 2.友元函数 3.友元类 1.概念 友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多 用。 友元分为:友元函数和友元类 2.友元函数 友元函数可以直接访问类的私有成员&a…

「MDN web 入门」学习笔记

目录 写在前面 1. MDN 简介 1.1 MDN 的主要特点 1.2 MDN 的主要功能 1.3 MDN 网页开发的指南 2. 安装基础软件 2.1 专业人士工具 2.2 初学者基本工具 3. 设计网站外观 3.1 计划 3.2 绘制草图 3.3 选定素材 3.4 文本 3.5 主题颜色 3.6 图像 3.7 字体 4. 处理文…

六西格玛项目的核心要素:理论学习、实践应用与项目经验

许多朋友担心,没有项目经验是否就意味着无法考取六西格玛证书。针对这一疑问,张驰咨询为大家详细解答。 首先,需要明确的是,六西格玛项目不仅仅是一种管理工具或方法,更是一种追求卓越、持续改进的思维方式。它强调通…

5.07 Pneumonia Detection in Chest X-Rays using Neural Networks

肺炎诊断是一个耗时的过程,需要高技能的专业人员分析胸部X光片chest X-ray (CXR),并通过临床病史、生命体征和实验室检查确认诊断。 它可以帮助医生确定肺部感染的程度和位置。呼吸道疾病在 X 光片上表现为一处膨胀的不透明区域。然而,由于不…

科技云报道:从亚运到奥运,大型国际赛事共赴“云端”

科技云报道原创。 “广播电视转播技术拯救了奥运会”前奥委会主席萨马兰奇这句话广为流传。 奥运会、世界杯、亚运会这样的全球大型体育赛事不仅是体育竞技的盛宴,也是商业盛宴,还是技术与人文的融合秀。随着科技的进步,技术在体育赛事中扮…

2.外卖点餐系统(Java项目 springboot)

目录 0.系统的受众说明 1.系统功能设计 2.系统结构设计 3.数据库设计 3.1实体ER图 3.2数据表 4.系统实现 4.1用户功能模块 4.2管理员功能模块 4.3商家功能模块 4.4用户前台功能模块 4.5骑手功能模块 5.相关说明 新鲜运行起来的项目:如需要源码数据库…