最近工作重心转移到了uniapp上,有一说一,这个框架跨端确实牛逼,一套代码能一次编译到多端使用。但随之而来的兼容性问题也是层出不穷,同样的在面临APP底层的改动也显得力不从心。同时,uniapp的性能问题也是一直被人所诟病的一点,这个点上一还是要提高自己本身的编码能力,二还是得依靠dcloud团队能持续优化框架。
本篇博客是记录使用uniapp开发一个聊天APP的踩坑问题。

一、输入框吞字,光标闪动问题

uniapp中使用输入框,无论是input组件还是textarea组件,都存在一个问题。就是如果组件绑定v-model的话,输入的时候在苹果手机或者部分特殊的有待选区域的输入法,会存在输入框吞字,从文字中间输入时光标会闪动到最后的两个BUG。
该问题的解决方案,最终只能使用:value去绑定输入框,为输入框分配两个变量,一个真实的value值,一个是临时的tempValue值。临时tempValue值用于在输入触发的@input事件内实时接收,真实的value值只在第一次由无值到有值的时候接收一次,而后只需在发送的时候设置真实value值为空即可清空输入框。

<template><textarea :value="value" @input="handleInput"></textarea><button @click="handleClickSend">发送</button>
</template>export default {data: {value: '',tempValue: ''}handleInput(event) {const value = event.detail.valueif(!this.value) {// 第一次值为空时赋给真实值this.value = value}this.tempValue = value // 临时值用于实时接收}async handleClickSend() {if(!this.value) {return}// 发送时,临时值存储的为当前输入框内的值// 随后将真实value值设置为空实现清空输入框// 模拟发送请求const res = await this.$axios.post({url: xxxx,text: this.tempValue })this.value = '' // 清空输入框}
}

二、组件key值问题

博主封装了一个消息气泡渲染组件,只需要将必要的参数传递进去即可渲染各种消息,但是在开发过程中,发现了气泡消息抛出来长按事件所带的参数错乱的问题,后经研究为组件加上了key值才解决。

<template><view class="chat-warp" v-for="item of msgList" :key="item.id"><!-- 注意,需要给组件也给key值 --><chat-item :item="item" :key="item.id"></chat-item></view>
</template>

可能是vue中对组件的更新机制不同,所以v-for循环中的组件也需要给key值。

三、消息定位问题

项目中的聊天页,使用的是scroll-view配合封装好了的富文本组件来渲染各种消息,由于下拉加载更多消息时总会有屏幕闪动的现象出现,故最后是两层scroll-view来配合使用,一层是真消息,一层是假消息。加载更多时,假消息显示真消息隐藏,等到消息完全渲染定位完毕后再隐藏假消息、显示真消息。

(1)滚不到最底部的问题

在开发的过程中,常常遇到发送消息时,滚不到最底部;亦或者进入聊天页时,滚不到最底部的情况。
针对此,一开始是不断地瞄点滚动到底部,一进入页面就会触发七八次goBottom函数。
后经过优化,整理了思路,改成了判断消息是否完全渲染完毕后,再执行goBottom函数。而判断消息是否完全渲染完毕,则需要用到uni.createSelectorQuery()这个API。

// 在onReady钩子中调用goBottom
onReady() {this.$nextTick(() => {this.goBottom()})
}
// 滚动到底部函数
goBottom() {this.scrollView = '' // scrollview瞄点置空this.$nextTick(async () => {const res = await this.checkMsgIsRender('btm') // 检测最底部的消息是否完全渲染完毕if(res) {this.scrollView = 'bottom' // 瞄点至底部} else {this.goBottom()}})
}
// 检测消息是否渲染完毕
checkMsgIsRender(position) {let msgID = ''if(position === 'btm') {// 底部// 找到最底部的消息IDmsgID = xxxx} else {// 顶部// 找到最顶部的消息IDmsgID = yyyy}// 返回一个Promisereturn new Promise((resolve) => {const query = uni.createSelectorQuery().in(this)query.select('#id').boundingClientRect(data => {// 存在data,且存在宽和高,视为渲染完毕if(data && data.width && data.height) {resolve(true)} else {resolve(false)}}).exec();})
}

(2)下拉加载更多消息瞄点定位不准的问题

同样的,下拉加载更多消息也是存在有瞄点不准确的问题,而一开始的解决方案,是简单粗暴的延时两秒钟,这直接导致了用户等待的时间过长的问题出现,且还不一定能准确的定位到。
参照了滚动到底部的做法,博主举一反三,也通过判断消息是否完全渲染完毕来决定瞄点的时机,以确保瞄点定位准确。

// 加载更多
async loadMore() {await this.getMoreMsg() // 向服务器获取更多消息或者展示本地消息,该函数不展开let location = async () => {const res = await this.checkMsgIsRender('top') // 检测最顶部的消息是否完全渲染完毕if(res) {// 这里还需要找到需要瞄点过去的消息ID,zzzzthis.scrollView = zzzz // 瞄点到消息zzzz} else {location ()}}this.scrollView = '' // scrollview瞄点置空this.$nextTick(() => {location ()})
}

总结

其实呢,网上一直存在有声音在诟病uniapp,但是讲句道理,能够以一套代码运行到多端的技术还是挺牛逼的,尽管目前来说这项技术还不是很成熟(性能问题、兼容问题)。
uniapp能带领我们的项目走向多远,其实还是可以期待的,当然不能光指望dcloud团队,个人代码的写法也很关键,继续努力吧…

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

  1. uni-app 开发安卓app踩坑记录

    uni-app离线打包android -- 官方文档 Android studio打包apk后弹窗提示"打包时未添加ui模块" 在工程应用目录的build.gradle文件中bui ...

  2. uni-app开发,防止踩坑

    一.组件设置全屏覆盖 设置宽度和高度100%是没用的 需要在里面加设置一层view,并且设置对应宽高分别为vw和vh <uni-popup><view class="wra ...

  3. hbuilder 开发5+ APP采坑记录

    开发一款APP产品需要在安卓和苹果2大平台发布,同时开发团队也需要有安卓和IOS. HTML5 Plus移动App,简称5+App,是一种基于HTML.JS.CSS编写的运行于手机端的App,这种Ap ...

  4. 开源大数据开发平台DataSphereStudioLinkis踩坑记录

    Linkis:https://github.com/WeBankFinTech/Linkis DataSphereStudio:https://github.com/WeBankFinTech/Dat ...

  5. 微信开放标签wx-open-launch-app唤醒app踩坑记录,launch:fail问题解决

    微信开放标签调试了一天,各方面都正常,但是一直报错launch:fail,百思不得其解,早网上搜答案,辛得指点,原来问题如下 如果要唤醒app,必须使用sdk生成的卡片,或者使用微信开发者工具的浏览功 ...

  6. Unity个人开发中的踩坑记录(混沌式更新)

    DateTime时间戳计算 一言蔽之,通常使用DateTime计算时间戳,起始时间点为UTC时间1970年1月1日0点整,需手动设置一个基准DateTime来处理. DateTime StartDat ...

  7. 安卓 Native+Flutter 应用开发入门资料、亲身实战及踩坑记录

    安卓 Native+Flutter 应用开发实战及踩坑记录,练手入门项目:FluLearn 入门资料 第三方共享包检索(国内).第三方共享包检索(国外) Flutter开发环境搭建(中文版).Flut ...

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

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

  9. 【STM32+机智云】机智云手机APP点灯实验踩坑记录

    [STM32+机智云]机智云手机APP点灯实验踩坑记录 一.实验背景 因为项目开发需要用到云平台,所以开始学习机智云平台,听说机智云比较容易入门,还有手机APP.因此开始了踩坑之旅,一切的一切开始于一 ...

最新文章

  1. eclipse中使用javadoc生成文档
  2. Git学习笔记05--git stash
  3. c语言判断一个分数是不是最简分数_青岛版六年级数学上册7.2小数、分数和百分数的互化微课视频 | 练习...
  4. MFC-Tab Control控件使用
  5. Dev的多语言简单实现
  6. 命令行重启Oracle数据库
  7. c#获取本地ip地址网关子网掩码_C#--WinForm获取本机网卡的型号,IP地址,子网掩码和网关-阿里云开发者社区...
  8. uml 9图不同的角度品种分类
  9. Git - Merge: refusing to merge unrelated histories
  10. 下载Django中文官方文档
  11. 做个坚强的逆行者,献给终日奋斗的你我——《当幸福来敲门》
  12. 怎样自己创建一个个人网站,怎样将自己写的网站发布到外网?
  13. 【Opencv综合应用】自制训练集的人脸识别2——制作csv文件
  14. 中国通信服务股份有限公司之广通服的划分!
  15. 细粒度图像分类论文研读-2011
  16. 利用机器学习进行放假预测
  17. 东芝或于今秋出售子公司智能电表巨头兰吉尔
  18. 剑指offer笔记(七) 第47题至第53题
  19. MATLAB的汽车操纵稳定性仿真分析
  20. DS串应用—最长重复子串

热门文章

  1. pc c语言教程,PC C语言教程
  2. java 农历_JAVA工具例大全--阴历(农历)信息 源代码
  3. 如何设计一个通用的查询接口
  4. lol德玛西亚登录服务器未响应,LOL客户端又出现问题?大量玩家无法登陆,解决方法已出现!...
  5. 艾兰岛编辑器-实体模板
  6. STC单片机简单控制直流电机正反转
  7. CNN与RNN对比 CNN+RNN组合方式
  8. 数字电视专业术语--DTV名词扫盲
  9. php移动端url,织梦移动端跟PC端URL问题。 - 搜外SEO问答
  10. 新的放假规定,大年三十还得朝九晚五!