详解微信小程序调起键盘性能优化


Posted in Javascript onJuly 24, 2018

在小程序中,我们经常有调起键盘的操作场景,但是在不同的场景下解决方案不尽相同,还是需要具体问题具体分析。

需求分析

最近在项目中有一个需求,是从列表页点击评论按钮进入详情页时,在加载完页面后自动调起键盘进入评论状态。从需求来看,我们应该在onReady函数中调起键盘,因为onReady函数是在页面初次渲染完成时被调用。但是在实践中我们发现,对于一些配置不好的手机,其加载页面速度较慢,在onReady函数调用时页面并没有渲染完毕,就会导致placeholder和input组件位置错乱的现象。其本质原因是,onReady生命周期函数并不能在调用时承若已经将页面渲染完成了。(尽管文档中描述是已经完成了。)

之前的操作是在onReady生命周期函数中调起键盘。

this.setData({ focus: true })

发现这个问题后做了相应的延迟处理

setTimeout(() => {
 this.setData({ focus: true })
}, 300)

但这是治标不治本的方法,手机性能好的用户会无谓的等待300毫秒,而手机性能很差的用户等待300毫秒也不一定就能解决这个问题。

解决思路

那么既然小程序并没有提供给我们一个理想的渲染结束后的回调函数,那么我们就换个思路: 使用短轮询来处理,当页面渲染完成后才调起键盘的操作。

既然要使用短轮询,那么我们去轮询什么呢?什么标志代表着页面渲染完成了呢?在这里,我是使用 wx.createSelectorQuery() 方法,它会返回一个SelectorQuery对象实例,在这个实例上调用select方法选择我想要去轮询的节点,在回调函数中判断参数是否为 null 。如果返回了监控的节点信息,那么说明已经渲染完成。这时就可以进行键盘调起操作了。

let timer = setInterval(() => {
 wx.createSelectorQuery().select('#comment-section').boundingClientRect(rect => {
 if (rect !== null && timer !== null) {
  clearInterval(timer)
  timer = null
  this.setData({ focus: true })
 }
 }).exec()
}, 50)

在此之上,如果我们只粗暴的让 focustrue 并不是个明智的做法。

在调起键盘时默认页面会上推,如果在评论很少的情况下这样的体验并不好。所以需要判断一个高度,超过这个值就上推,没超过就不上推。这个值视实际情况而定。 上推的操作是由input组件的 adjust-position 属性决定,为true则上推,否则则不上推。这时回调返回的参数中的节点信息就可以派上用场了。

// 在this.setData({ focus: true })前对节点高度进行判断
if (rect.height < 500) this.setData({ push: false })
else this.setData({ push: true })

onBlur函数问题

在实际的操作中,我们发现在键盘被调起后会有概又自动收回。经过排查发现时onBlur函数的问题,在onBlur函数中,我们手动的设置 focusfalse ,但其实并不需要这一步操作,反而带来了副作用。在我们去除了这部分代码后,键盘自动收起的问题得到了解决。

封装起来

虽然我们完成了这次任务的需求,但是显而易见的,这样的任务在未来肯定还会再次出现。所以机智的我们应该赶快把整套流程封装起来,以便下次直接调用。

详解微信小程序调起键盘性能优化

那么这时我们使用的方式就是这样的:

const Util = require("xxx") // 引入封装的库

/**
 * 生命周期函数--监听页面初次渲染完成
 */
onReady: function () {
 Util.onTotalReady('#comment-section', 50, rect => {
 if (rect.bottom < 500) this.setData({ push: false })
 else this.setData({ push: true }}
 this.setData({ focus: true })
 })
}

小结

在解决键盘调起的这个过程中我们可以看出微信小程序开发流程的简陋,这个问题的出现本质上是小程序提供给我们的生命周期函数的不够准确。否则在页面渲染完成的情况下我怎么会拿不到节点信息呢?像react中的componentWillMount生命周期函数中就不会出现这样的问题,所以希望小程序能再变强大一些,也让我们少写一点这种hack代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js关闭子窗体刷新父窗体实现方法
Dec 04 Javascript
jquery实现marquee效果(文字或者图片的水平垂直滚动)
Jan 07 Javascript
现如今最流行的JavaScript代码规范
Mar 08 Javascript
让人蛋疼的JavaScript语法特性
Sep 30 Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 Javascript
jQuery实现自定义事件的方法
Apr 17 Javascript
javascript实现跨域的方法汇总
Jun 25 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
Jun 16 Javascript
AngularJs基于角色的前端访问控制的实现
Nov 07 Javascript
vue-router 路由基础的详解
Oct 17 Javascript
vue中mint-ui的使用方法
Apr 04 Javascript
Node.js API详解之 querystring用法实例分析
Apr 29 Javascript
原生JavaScript实现remove()和recover()功能示例
Jul 24 #Javascript
js+canvas实现验证码功能
Sep 21 #Javascript
微信小程序网络请求封装示例
Jul 24 #Javascript
js实现敏感词过滤算法及实现逻辑
Jul 24 #Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
Jul 24 #jQuery
jQuery实现菜单的显示和隐藏功能示例
Jul 24 #jQuery
Vue三种常用传值示例(父传子、子传父、非父子)
Jul 24 #Javascript
You might like
饭制《星际争霸》Mod:优化游戏机制 增加新单位
2017/07/02 星际争霸
日本收入最高的漫画家:海贼王作者版税年收入高达8.45亿元
2020/03/04 日漫
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
一个完整的PHP类包含的七种语法说明
2015/06/04 PHP
PHP简单实现二维数组赋值与遍历功能示例
2017/10/19 PHP
javascript版的in_array函数(判断数组中是否存在特定值)
2014/05/09 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
js表单验证实例讲解
2016/03/31 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
结合axios对项目中的api请求进行封装操作
2020/09/21 Javascript
JS实现页面侧边栏效果探究
2021/01/08 Javascript
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
TensorFlow实现RNN循环神经网络
2018/02/28 Python
python3.X 抓取火车票信息【修正版】
2018/06/19 Python
python 实现读取一个excel多个sheet表并合并的方法
2019/02/12 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
如何使用Python抓取网页tag操作
2020/02/14 Python
详解Anaconda 的安装教程
2020/09/23 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
美国迪克体育用品商店:DICK’S Sporting Goods
2018/07/24 全球购物
客服工作职责
2013/12/11 职场文书
单位单身证明样本
2014/10/11 职场文书
旷工检讨书1000字
2015/01/01 职场文书
邀请函样本
2015/02/02 职场文书
宣传委员竞选稿
2015/11/19 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android