在小程序中,,,,我们经常有调起键盘的操作场景,,,,可是在差别的场景下解决方案不尽相同,,,,照旧需要详细问题详细剖析。。。。。

最近在项目中有一个需求,,,,是从列表页点击谈论按钮进入详情页时,,,,在加载完页面后自动调起键盘进入谈论状态。。。。。从需求来看,,,,我们应该在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)
复制代码
在此之上,,,,若是我们只粗暴的让 focus 为 true 并不是个明智的做法。。。。。
在调起键盘时默认页面会上推,,,,若是在谈论很少的情形下这样的体验并欠好。。。。。以是需要判断一个高度,,,,凌驾这个值就上推,,,,没凌驾就不上推。。。。。这个值视现真相形而定。。。。。 上推的操作是由input组件的 adjust-position 属性决议,,,,为true则上推,,,,否则则不上推。。。。。这时回调返回的参数中的节点信息就可以派上用场了。。。。。
// 在this.setData({ focus: true })前对节点高度举行判断
if (rect.height < 500) this.setData({ push: false })
else this.setData({ push: true })
复制代码
在现实的操作中,,,,我们发明在键盘被调起后会有概又自动收回。。。。。经由排查发明时onBlur函数的问题,,,,在onBlur函数中,,,,我们手动的设置 focus 为 false ,,,,但着实并不需要这一步操作,,,,反而带来了副作用。。。。。在我们去除了这部分代码后,,,,键盘自动收起的问题获得相识决。。。。。
虽然我们完成了这次使命的需求,,,,可是显而易见的,,,,这样的使命在未来肯定还会再次泛起。。。。。以是机智的我们应该赶忙把整套流程封装起来,,,,以便下次直接挪用。。。。。
那么这时我们使用的方式就是这样的:
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 })
})
}
复制代码
在解决键盘调起的这个历程中我们可以看出微信小程序开发流程的简陋,,,,这个问题的泛起实质上是小程序提供应pp电子生命周期函数的不敷准确。。。。。否则在页面渲染完成的情形下我怎么会拿不到节点信息呢????像react中的componentWillMount生命周期函数中就不会泛起这样的问题,,,,以是希望小程序能再变强盛一些,,,,也让我们少写一点这种hack代码。。。。。
小程序工具提供多类型商城/门店小程序制作,,,,可视化编辑 1秒天生5步上线。。。。。通过拖拽、拼接????榻峁剐〕绦蛏坛且趁,,,,所看即所得,,,,只需要美工就能做出细腻商城。。。。。更多小程序市肆请审查:小程序市肆
KESION pp电子软件
KESION pp电子软件是海内领先的在线教育软件及私域社交电商软件服务提供商,,,,恒久专注于为企业提供在线教育软件及社交电商SaaS平台解决方案。。。。。
公司焦点产品云开店SaaS社交电商服务平台、在线教育SaaS服务平台、教育企业数字化SaaS云平台、企微营销助手、私有化自力安排品牌网校和在线教育咨询等。。。。。KESION 一直通过手艺立异,,,,提供产品和服务,,,,助力企业向数字化转型,,,,通过科技驱动商业刷新,,,,让商业变得更智慧!
怎样让你的微信小程序支持cookies,,,,我们需要这样实现,,,,需要这样的一行代码。。。。。...
2018年可以说的上是 小程序 异常;;;;鹑鹊囊荒,,,,随着越来越多的企业结构小程序,,,,随着而来也有一个问题,,,,那就是怎样举行小程序推广,,,,如作甚小程序快速获客吸粉。。。。。 今天,,,,我们将从熟人...