最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解微信小程序調(diào)起鍵盤性能優(yōu)化

 更新時間:2018年07月24日 11:45:31   作者:MeloGuo  
這篇文章主要介紹了詳解微信小程序調(diào)起鍵盤性能優(yōu)化,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在小程序中,我們經(jīng)常有調(diào)起鍵盤的操作場景,但是在不同的場景下解決方案不盡相同,還是需要具體問題具體分析。

需求分析

最近在項目中有一個需求,是從列表頁點擊評論按鈕進入詳情頁時,在加載完頁面后自動調(diào)起鍵盤進入評論狀態(tài)。從需求來看,我們應(yīng)該在onReady函數(shù)中調(diào)起鍵盤,因為onReady函數(shù)是在頁面初次渲染完成時被調(diào)用。但是在實踐中我們發(fā)現(xiàn),對于一些配置不好的手機,其加載頁面速度較慢,在onReady函數(shù)調(diào)用時頁面并沒有渲染完畢,就會導(dǎo)致placeholder和input組件位置錯亂的現(xiàn)象。其本質(zhì)原因是,onReady生命周期函數(shù)并不能在調(diào)用時承若已經(jīng)將頁面渲染完成了。(盡管文檔中描述是已經(jīng)完成了。)

之前的操作是在onReady生命周期函數(shù)中調(diào)起鍵盤。

this.setData({ focus: true })

發(fā)現(xiàn)這個問題后做了相應(yīng)的延遲處理

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

但這是治標(biāo)不治本的方法,手機性能好的用戶會無謂的等待300毫秒,而手機性能很差的用戶等待300毫秒也不一定就能解決這個問題。

解決思路

那么既然小程序并沒有提供給我們一個理想的渲染結(jié)束后的回調(diào)函數(shù),那么我們就換個思路: 使用短輪詢來處理,當(dāng)頁面渲染完成后才調(diào)起鍵盤的操作。

既然要使用短輪詢,那么我們?nèi)ポ喸兪裁茨??什么?biāo)志代表著頁面渲染完成了呢?在這里,我是使用 wx.createSelectorQuery() 方法,它會返回一個SelectorQuery對象實例,在這個實例上調(diào)用select方法選擇我想要去輪詢的節(jié)點,在回調(diào)函數(shù)中判斷參數(shù)是否為 null 。如果返回了監(jiān)控的節(jié)點信息,那么說明已經(jīng)渲染完成。這時就可以進行鍵盤調(diào)起操作了。

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 并不是個明智的做法。

在調(diào)起鍵盤時默認頁面會上推,如果在評論很少的情況下這樣的體驗并不好。所以需要判斷一個高度,超過這個值就上推,沒超過就不上推。這個值視實際情況而定。 上推的操作是由input組件的 adjust-position 屬性決定,為true則上推,否則則不上推。這時回調(diào)返回的參數(shù)中的節(jié)點信息就可以派上用場了。

// 在this.setData({ focus: true })前對節(jié)點高度進行判斷
if (rect.height < 500) this.setData({ push: false })
else this.setData({ push: true })

onBlur函數(shù)問題

在實際的操作中,我們發(fā)現(xiàn)在鍵盤被調(diào)起后會有概又自動收回。經(jīng)過排查發(fā)現(xiàn)時onBlur函數(shù)的問題,在onBlur函數(shù)中,我們手動的設(shè)置 focusfalse ,但其實并不需要這一步操作,反而帶來了副作用。在我們?nèi)コ诉@部分代碼后,鍵盤自動收起的問題得到了解決。

封裝起來

雖然我們完成了這次任務(wù)的需求,但是顯而易見的,這樣的任務(wù)在未來肯定還會再次出現(xiàn)。所以機智的我們應(yīng)該趕快把整套流程封裝起來,以便下次直接調(diào)用。

那么這時我們使用的方式就是這樣的:

const Util = require("xxx") // 引入封裝的庫

/**
 * 生命周期函數(shù)--監(jiān)聽頁面初次渲染完成
 */
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 })
 })
}

小結(jié)

在解決鍵盤調(diào)起的這個過程中我們可以看出微信小程序開發(fā)流程的簡陋,這個問題的出現(xiàn)本質(zhì)上是小程序提供給我們的生命周期函數(shù)的不夠準(zhǔn)確。否則在頁面渲染完成的情況下我怎么會拿不到節(jié)點信息呢?像react中的componentWillMount生命周期函數(shù)中就不會出現(xiàn)這樣的問題,所以希望小程序能再變強大一些,也讓我們少寫一點這種hack代碼。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaScript對象與數(shù)組的幾種常見復(fù)制方法

    JavaScript對象與數(shù)組的幾種常見復(fù)制方法

    在 JavaScript 開發(fā)中,對象和數(shù)組的復(fù)制是一個非常常見的操作,無論是函數(shù)參數(shù)傳遞、狀態(tài)管理,還是避免不必要的副作用,了解和掌握各種復(fù)制方式至關(guān)重要,我們將系統(tǒng)梳理 JavaScript 中的幾種常見復(fù)制方法,并對其應(yīng)用場景進行詳細說明,需要的朋友可以參考下
    2024-10-10
  • js中數(shù)組Array的一些常用方法總結(jié)

    js中數(shù)組Array的一些常用方法總結(jié)

    Array()是我們在js中常常寫到的代碼,今天就總結(jié)哈Array的對象具有哪些方法,感興趣的朋友可以了解下
    2013-08-08
  • JavaScript中toLocaleString()和toString()的區(qū)別實例分析

    JavaScript中toLocaleString()和toString()的區(qū)別實例分析

    這篇文章主要介紹了JavaScript中toLocaleString()和toString()的區(qū)別,結(jié)合實例形式對比分析了toLocaleString()和toString()針對字符串、數(shù)組與日期操作過程中的區(qū)別與使用技巧,需要的朋友可以參考下
    2018-08-08
  • js和php如何獲取當(dāng)前url的內(nèi)容

    js和php如何獲取當(dāng)前url的內(nèi)容

    js和php獲取當(dāng)前url的內(nèi)容在某些特殊的情況下還是蠻實用的,下面有個不錯的示例,感興趣的朋友可以參考下,希望對大家有所幫助
    2013-09-09
  • JS頁面刷新與重新加載功能實現(xiàn)(關(guān)閉當(dāng)前窗口)

    JS頁面刷新與重新加載功能實現(xiàn)(關(guān)閉當(dāng)前窗口)

    在計算機網(wǎng)頁中如果我們想獲取當(dāng)前頁面最新的內(nèi)容,可以刷新當(dāng)前頁面重新獲取數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于JS頁面刷新與重新加載功能實現(xiàn)(關(guān)閉當(dāng)前窗口)的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • JavaScript判斷數(shù)組類型的方法

    JavaScript判斷數(shù)組類型的方法

    這篇文章主要介紹了JavaScript判斷數(shù)組類型的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • js實現(xiàn)簡單頁面全屏

    js實現(xiàn)簡單頁面全屏

    這篇文章主要為大家詳細介紹了js實現(xiàn)簡單頁面全屏的功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • layui table去掉右側(cè)滑動條的實現(xiàn)方法

    layui table去掉右側(cè)滑動條的實現(xiàn)方法

    今天小編就為大家分享一篇layui table去掉右側(cè)滑動條的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 百度地圖自定義控件分享

    百度地圖自定義控件分享

    本文給大家介紹的是如何使用百度地圖的自定義控件,附上示例,分享給大家,小伙伴們根據(jù)自己的需求稍微改動下即可使用。
    2015-03-03
  • 獲取dom元素那些討厭的位置封裝代碼

    獲取dom元素那些討厭的位置封裝代碼

    你還在為offset,scroll,inner,client,screen,mouse發(fā)愁嗎? 頭都大了。而且各個瀏覽器方法還不太一樣。所以往往很浪費我們的時間。 于是我產(chǎn)生了寫一個方法用戶 專門獲取這樣的數(shù)據(jù)。
    2010-06-06

最新評論

郁南县| 通州市| 双牌县| 阜宁县| 赫章县| 贵阳市| 温泉县| 邮箱| 加查县| 西青区| 吉安市| 石阡县| 铜川市| 紫阳县| 钟山县| 石门县| 南涧| 阿克苏市| 嘉兴市| 同江市| 西城区| 鹰潭市| 顺义区| 梅州市| 明水县| 德钦县| 松江区| 西和县| 浠水县| 张掖市| 辽源市| 弥渡县| 浦东新区| 屏边| 四平市| 枣强县| 习水县| 富源县| 金坛市| 竹山县| 南雄市|