由于前段时间开发出来的vue版本的聊天页,性能、用户体验等方面十分不尽人意,故开启了新的征途,nvue版本聊天页的开发。

痛点一、进入页面保持在最底部

这次重构nvue版本的聊天页,使用了标新立异的渲染方式。众所周知,前端渲染页面都是由上而下渲染的,那么如果需要进入页面的时候,便保持在页面的最底部,就需要等待页面渲染完毕后跳转至最底部。这样的渲染方式就会导致在进入页面时,用户能很明显的感受到页面抖动了一下(可能多次)。
所以此次重构,博主选择将整个页面旋转180度,原本的最顶部,变成了页面的最底部,进入页面无需滚动到最底,用户视角里页面会固定在底部,且渲染消息是自下而上渲染。具体css代码如下:

/* 由于nvue中不支持全部的css,需要将这段样式写进对应dom元素的style上 */
direction: rtl;
transform: rotate(180deg);
-ms-transform: rotate(180deg);
-moz-transform: rotate(180deg);
-webkit-transform: rotate(180deg);
-o-transform: rotate(180deg);

痛点二、进入页面有长时间白屏

原先的vue版本聊天页,在进入页面时,会有长时间的白屏。后来博主将其中onLoad钩子中所做的大部分计算操作,转移到onReady中,白屏时间也优化了蛮多。
现在nvue版本的聊天页,使用uniapp原生的顶部导航栏,渲染速度快,不会出现白屏。具体配置在pages.json中。

{"path": "pages/xxx/xxx","style": {"titleNView": {"autoBackButton":false,"buttons": [{"float":"left","fontSize": "46rpx",// iconfont自定义按钮写法"fontSrc": "/style/iconfont/iconfont.ttf","text": "\ue61d"},{"float":"right","fontSize": "46rpx","fontSrc": "/style/iconfont/iconfont.ttf","text": "\ue68d"}]},"transparentTitle": "none","navigationBarTextStyle": "xxxx","navigationBarTitleText": "xxxx","navigationBarBackgroundColor": "xxxx"}
}

痛点三、弹出键盘,切换表情框页面闪动严重

在原先的vue版本聊天页中,弹出键盘,切换表情框会导致页面需重新计算弹出软键盘或表情框后页面的位置(保持用户在看的消息的位置)。
在对聊天页进行180度颠倒渲染后,弹出键盘、表情框的时候,就无需对其页面的位置去做重新计算了,但需要在弹出键盘、表情框的时候,撑高底部栏。比如写个计算属性computed:

<template><!-- 滚动区域 --><scroller>xxxx</scroller><!-- 底部区域 --><div :style="footerHeight"></div>
</template>
<script>
export default {computed: {footerHeight() {if (弹出键盘) {return `${键盘高度}rpx`;} else if (弹出表情框) {return '450rpx';} else {return '0';}}}
}
</script>

痛点四、消息富文本渲染

作为一个聊天软件,@人、自定义表情(图片)、普通文本、链接都是需要去做个性化的自定义。在原本的vue版本聊天页中,这些事情均交由uParse去处理。
转为nvue开发后,uParse不兼容,以博主亲身体验尝试来讲,只有rich-text组件和mp-html插件能使用上。但是!这两个东西都有它的问题,rich-text组件,在ios端设置其内部节点的样式会不生效,已报BUG;而mp-html插件,首先渲染采用的webview,比weex渲染慢,其次就是iOS端使用该插件,无法加载本地图片(表情)。
所以博主最后放弃了这两个选项,改为planC,自己写富文本消息解析,通过大致计算文本的宽度,将文本表情链接等拆分成一块块元素拼接成一条消息。

痛点五、各种兼容细节

  1. 使用textarea不能使用auto-height属性,在iOS端会导致textarea无法滚动。
  2. 使用textarea不能使用v-model,尽管绑定v-model在nvue版本的iOS端不会出现吞字的问题,但是在Android端会出现无法长按删除的问题,所以只能使用value
  3. textarea组件的blur事件中没有cursor(光标位置)参数。
  4. nvue中无法使用main.js中挂载的全局变量,需要在页面内再次单独引入。
  5. nvue页面中能直接使用vuex,但是页面内引用的js文件中,无法访问vuex(访问的state为初始值)。若需要在其内引用的js中也使用vuex,则需要在nvue页面中,将其$store传进js文件中。
  6. 官方推荐nvue中长列表使用list组件,但是list组件在iOS端下拉加载历史消息的时候,存在卡顿的现象,故博主推荐的是使用scroller组件,其配置项跟list一致。
  7. 在iOS端和Android端长按textarea,是不同的表现,iOS端会弹出键盘,而Android端不会弹出键盘,而是弹出上下文菜单。
  8. 使用dom.scrollToElement这个API,设置其offset值在iOS端和Android端的表现不一致。
  9. 下拉加载更多功能在iOS端需要做限制操作,两次加载更多触发的时间差最好不小于1.5s,因为iOS端滚动有回弹的效果。

总结

其实还有很多细节点的问题,比如样式问题等没有罗列出来。继续加油,keep learning…

uniapp聊天页nvue开发踩坑记录相关推荐

  1. 微信vue路由跳转兼容_Vue微信公众号开发踩坑记录

    需求 微信授权登录(基于公众号的登录方案) 接入JS-SDK实现图片上传,分享等功能 现状及难点 采用的Vue框架,前后端分离模式(vue工程仅作为客户端),用户通过域名访问的是客户端,但是微信授权中 ...

  2. 乐视体感摄像头开发踩坑记录

    乐视三合一体感相机开发踩坑记录 第一次用Cmake,以下如有错误请大佬指正 开发环境: Linux ARM(树莓派4) AstraSDK-v2.1.3 Arm/Arm64(https://orbbec ...

  3. uniapp通过v-for动态绑定ref踩坑记录

    ##uniapp通过动态绑定子组件ref踩坑纪录, 入职公司4个月了刚开发完一个reac框架的后台管理的子模块后,在两周前又加入了uniapp架子开发同时兼容mpass端和微信小程序项目,最近有一个功 ...

  4. uniapp 开发踩坑记录

    使用dcloud 的 uniapp开发了一个app,把遇到的问题总结一下: 1.uniapp 前端的布局代码与小程序 高度相似(如果没有接触过 建议多看看文档):js是用的vue 布局比较简单,比jq ...

  5. Flutter 开发踩坑记录(干货总结)

    Flutter 太好学了!BUG 真的太少了!issues 只有 5000 多!也就那么亿点!简单得我都枯了!毕竟每次遇到问题,???????? 都是直接去找群里的法佬.低调.Alex 等几位大佬(? ...

  6. 2020年开发踩坑记录

    20200207 mybatis plus 自带insert插入异常 sql injection violation 解决方法: 使用逆向工程脚本时,生成的映射实体类在下面的注解会多table: 删除 ...

  7. Vue SPA应用微信开发踩坑记录

    解决难点 JS-SDK需要向服务端获取签名,且获取签名中需要的参数包括所在页面的网址,但由于单页应用的路由特殊,其中涉及到的iOS和Android的微信客户端浏览器内核的差异性导致的兼容问题 JS-S ...

  8. 首次c#蓝牙开发踩坑记录

    异常如下 [尝试一] 百度搜索cc7b13ffcd2ddd51找到类似情况 https://learningintheopen.org/tag/publickeytokencc7b13ffcd2ddd ...

  9. Flutter 开发踩坑记录

    Flutter 太好学了!BUG 真的太少了! issues 只有 5000 多!也就那么亿点!简单得我都枯了!毕竟每次遇到问题,

最新文章

  1. hdl四位二进制计数器_四位二进制计数器这样接成十进制计数器
  2. html代码转换成为纯文本
  3. 在YII2框架中使用UEditor编辑器发布文章
  4. Windows anaconda python3 import ssl报错的解决方案
  5. 独立按键控制数码管c语言,各位大佬,独立按键控制数码管为什么按下的时候要加一呢?...
  6. Python 程序员经常犯的 10 个错误
  7. SAP Spartacus 默认路由配置的工作原理
  8. Leedcode7-binary-tree-postorder-traversal
  9. AspxTreeList获取选中项的值
  10. Ubuntu学习(应用集合、命令行以及遇到的问题)
  11. UITableView长按拖动排序(支持不同行高,不同section间交换)
  12. 一篇文章带你登顶 MacBook高效工作环境配置
  13. 轻量级DI框架Guice使用详解
  14. python时间格式毫秒_Python获取秒级时间戳与毫秒级时间戳
  15. 乒乓球技术要领总结(保持更新)
  16. 详述 Kafka 基本原理
  17. 艾思瑞吡非尼酮在哪报销
  18. 【数据库技术课程设计】 电信学院考研信息管理系统 +【Visual FoxPro】
  19. Word 有时候百度输入法用不
  20. 正确认识形势 提升信心 增强斗志

热门文章

  1. html制作当当网首页的报告,当当网首页——JS代码
  2. 哥哥与弟弟的游戏故事
  3. 激光测距仪系统设计 c语言程序),激光测距仪系统设计(机械图,电路图,c语言程序)...
  4. 物理学转行?读了四年物理学,优势在哪里?
  5. 《实用VC编程之玩转控件》第6课:ComboBox下拉框控件
  6. 2017.06.21日作业
  7. 天空之城简谱用计算机,原神天空之城曲谱是什么_天空之城琴谱简谱分享_3DM单机...
  8. 传统文化之广场舞乱相到底反映出中国社会怎样的深层次矛盾
  9. 微阵列数据分析(Microarray data analysis)
  10. 百度云服务器最新活动,最新百度云服务器活动 11元购半年