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

微信小程序?qū)崿F(xiàn)圖片預加載組件

 更新時間:2017年01月18日 08:31:46   作者:凹凸實驗室  
預加載圖片是提高用戶體驗的一個很好方法。圖片預先加載到瀏覽器中,訪問者便可順利地在你的網(wǎng)站上沖浪,并享受到極快的加載速度。下面這篇文章主要介紹了微信小程序?qū)崿F(xiàn)圖片預加載組件的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。

網(wǎng)頁中的圖片預加載

圖片預加載對圖片畫廊及圖片占據(jù)很大比例的網(wǎng)站來說十分有利,它保證了圖片快速、無縫地發(fā)布,也可幫助用戶在瀏覽你網(wǎng)站內(nèi)容時獲得更好的用戶體驗。我們知道在 Web 頁面中實現(xiàn)圖片的預加載其實很簡單,通常的做法是在 JS 中使用 Image 對象即可,代碼大致如下

var image = new Image()
image.onload = function() {
 console.log('圖片加載完成')
}
image.src = 'http://misc.360buyimg.com/lib/img/e/logo-201305.png'

下面推薦幾篇網(wǎng)頁中實現(xiàn)圖片預加載的文章:

     1、jquery 圖片預加載 自動等比例縮放插件

     2、JS實現(xiàn)圖片預加載無需等待

     3、jQuery簡單實現(xiàn)圖片預加載

然而在微信小程序(以下簡稱小程序)里要實現(xiàn)圖片的預加載要更麻煩一些,因為小程序里并沒有提供類似 Image 這樣的 JS 對象。。

小程序必知必會

在進入正題前,需要了解以下小程序相關的知識(當然最好還是完整的學習一下官方文檔):

  1. 小程序框架的核心是一個響應的數(shù)據(jù)綁定系統(tǒng),整個系統(tǒng)分為視圖層和邏輯層兩塊,視圖層即頁面模板(后綴為 .wxml 的文件),邏輯層即頁面 JS 文件
  2. 小程序的頁面模板由一系列的基礎組件組合而成,如 view、text、button 等
  3. 頁面內(nèi)容的更新基于數(shù)據(jù)的單向綁定來進行,通過 JS 調(diào)用 Page 對象的 setData 方法來更新模板中綁定的數(shù)據(jù)
  4. 視圖層到邏輯層的通信是通過事件完成的,在組件中聲明事件的回調(diào),JS 端可監(jiān)聽到界面交互的發(fā)生、組件狀態(tài)的變化等
  5. 在 WXML 文件中,可通過 template 進行模板的復用,若 template 是在不同文件里定義的,需要先通過 import 語句進行引入

這里有個官方的簡單例子可以用來幫助理解

<!-- 模板文件 foo.wxml -->
<view> Hello {{name}}! </view>
<button bindtap="changeName"> Click me! </button>
//腳本文件 foo.js
Page({
 data: {
 name: 'WeChat'
 },
 changeName: function(e) {
 this.setData({
 name: 'MINA'
 })
 }
})

運行這個頁面會看到一行 Hello WeChat! 的文字及一個按鈕,點擊按鈕后文字會變成 Hello MINA!

在小程序中加載圖片

小程序提供一個 image 組件(類似于 HTML 中的 img 標簽),可以設置 src 及加載成功或失敗的回調(diào),使用起來很簡單

<!-- 模板文件 bar.wxml -->
<image src="http://misc.360buyimg.com/lib/img/e/logo-201305.png" bindload="imageOnLoad" binderror="imageOnLoadError" />
//腳本文件 bar.js
Page({
 imageOnLoad(ev) {
 console.log(`圖片加載成功,width: ${ev.detail.width}; height: ${ev.detail.height}`)
 },
 imageOnLoadError() {
 console.log('圖片加載失敗')
 }
})

運行以上代碼,順利的話頁面上會顯示出一張圖片,同時控制臺會打印出帶圖片寬高的日志信息

將功能抽離成公用組件

接下來我們考慮實現(xiàn)這么一個功能,在頁面上載入一張尺寸和 K 數(shù)都很大的圖片,由于圖片很大,下載需要一定的時間,而在這段時間內(nèi),用戶看到的是空白或是不完整的圖片,體驗顯然不好。

一種常用的優(yōu)化手段是先加載一張縮略圖,該縮略圖通過樣式設置為和原圖一樣的寬高,這樣用戶首先能很快速地看到一張模糊的圖片,此時再去對原圖做預加載,加載完成之后對縮略圖進行替換,因為此時圖片已經(jīng)下載過了,所以界面上能無縫地切換為原圖顯示,效果如下:

單張圖片預加載

完成這個優(yōu)化操作的關鍵就在于需要一個公共的圖片預加載組件的支持,接下來我們分步驟來看看如何實現(xiàn)

  1. 新建 demo 頁面及組件相關的文件 img-loader.js 和 img-loader.wxml,組件需要和頁面一樣有個模板文件,是因為小程序里無法動態(tài)地插入模板結(jié)構(gòu)。然后在 demo.wxml 里通過 import 語句引用組件模板,在 demo.js 里通過 require 語句將組件腳本進行引入
  2. 在頁面中通過 template 調(diào)用組件模板并傳入數(shù)據(jù),這里我們傳遞一個名為 imgLoadList 的圖片數(shù)組過去
  3. 在頁面腳本中的 onLoad 方法中對組件進行初始化,并將 this 對象傳入,因為組件內(nèi)必須通過 Page 對象的 setData 來更新模板里的內(nèi)容
  4. 在組件的 img-loader.js 中定義一個 load 方法用來創(chuàng)建一個圖片的加載,將傳入的 src 添加到加載隊列中,并使用 setData 方法更新隊列數(shù)據(jù)
  5. 接下來在組件 img-loader.wxml 中通過接收到的圖片隊列數(shù)據(jù),用 wx:for 指令去生成 image 組件來對圖片進行加載,同時將成功及失敗的回調(diào)綁定到 img-loader.js 中的方法中,最終再回調(diào)回 Page 對象中

可以看出,由于小程序里無法動態(tài)地插入模板結(jié)構(gòu),所以相對于普通網(wǎng)頁端的組件調(diào)用,這里多出了在 WXML 文件中引入及使用模板這個步驟,而其他部分對于調(diào)用方(即Demo 頁面)來說則是相似的,下面是完整的 Demo 頁面的代碼

<!-- demo.wxml -->
<view class="img_wrap">
 <image wx:if="{{ imgUrl }}" src="{{ imgUrl }}" />
</view>
<button bindtap="loadImage">Click To Load Image</button>
<view class="msg">{{ msg }}</view>
<!-- 引入圖片預加載組件 -->
<import src="../../img-loader/img-loader.wxml"/>
<template is="img-loader" data="{{ imgLoadList }}"></template>
// ------ demo.js ------
//引入圖片預加載組件
const ImgLoader = require('../../img-loader/img-loader.js')
//縮略圖 80x50 3KB
const imgUrlThumbnail = 'http://storage.360buyimg.com/mtd/home/lion1483683731203.jpg'
//原圖 3200x2000 1.6MB
const imgUrlOriginal = 'http://storage.360buyimg.com/mtd/home/lion1483624894660.jpg'
Page({
 data: {
 msg: '',
 imgUrl: ''
 },
 onLoad() {
 //初始化圖片預加載組件
 this.imgLoader = new ImgLoader(this)
 },
 loadImage() {
 //加載縮略圖
 this.setData({
 msg: '大圖正拼命加載..',
 imgUrl: imgUrlThumbnail
 })
 //同時對原圖進行預加載,加載成功后再替換
 this.imgLoader.load(imgUrlOriginal, (err, data) => {
 console.log('圖片加載完成', err, data.src)
 this.setData({ msg: '大圖加載完成~' })
 if (!err)
 this.setData({ imgUrl: data.src })
 })
 }
})

如果把圖片加載完成的回調(diào)統(tǒng)一指定成 Page 對象中的方法,則可以很方便地處理多張圖片的加載,這里也寫了個例子,效果如下:

多張圖片預加載

總的來說調(diào)用起來還算方便吧,img-loader 的組件代碼略多這里就不貼出來啦,有興趣的同學可以前往 Github 項目頁面 查看,目前此組件已應用在京東購物小程序版中。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關文章

  • postman數(shù)據(jù)加解密實現(xiàn)APP登入接口模擬請求

    postman數(shù)據(jù)加解密實現(xiàn)APP登入接口模擬請求

    對于Postman的使用,一般情況下只要發(fā)發(fā)確定的請求與參數(shù)就可以的了,然而,在使用的時候,尤其是接口測試時,請求接口的設計里面都有數(shù)據(jù)加密,參數(shù)驗簽,返回數(shù)據(jù)也有進行加密的,這個時候就需要使用一些腳本做處理,模擬app登入請求的操作
    2021-08-08
  • 微信小程序?qū)崙?zhàn)之運維小項目

    微信小程序?qū)崙?zhàn)之運維小項目

    這篇文章主要介紹了微信小程序?qū)崙?zhàn)之運維小項目,就是利用微信小程序?qū)崿F(xiàn)了一個類似138的功能,輸入IP就可以查看IP的詳細信心,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 高級前端面試手寫扁平數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)Tree

    高級前端面試手寫扁平數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)Tree

    這篇文章主要為大家介紹了高級前端面試手寫扁平數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)Tree示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • TypeScript中的聯(lián)合類型使用示例詳解

    TypeScript中的聯(lián)合類型使用示例詳解

    這篇文章主要為大家介紹了TypeScript中的聯(lián)合類型使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • ThreeJS使用紋理貼圖創(chuàng)建一個我的世界草地方塊

    ThreeJS使用紋理貼圖創(chuàng)建一個我的世界草地方塊

    這篇文章主要為大家介紹了ThreeJS使用紋理貼圖創(chuàng)建一個我的世界草地方塊的實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 簡單三行代碼函數(shù)實現(xiàn)幾十行Typescript類型推導

    簡單三行代碼函數(shù)實現(xiàn)幾十行Typescript類型推導

    這篇文章主要為大家介紹了簡單三行代碼函數(shù)實現(xiàn)幾十行Typescript類型推導的方案示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 開發(fā)typescript項目tsconfig.json配置及選項使用解析

    開發(fā)typescript項目tsconfig.json配置及選項使用解析

    這篇文章主要為大家介紹了tsconfig.json配置及選項使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • TypeScript逆變之條件推斷和泛型的應用示例詳解

    TypeScript逆變之條件推斷和泛型的應用示例詳解

    這篇文章主要為大家介紹了TypeScript逆變之條件推斷和泛型的應用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • type challenge刷題之(middle 部分)示例解析

    type challenge刷題之(middle 部分)示例解析

    這篇文章主要為大家介紹了type challenge刷題之(middle 部分)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • typescript快速上手的基礎知識篇

    typescript快速上手的基礎知識篇

    靜態(tài)類型的typescript與傳統(tǒng)動態(tài)弱類型語言javascript不同,在執(zhí)行前會先編譯成javascript,因為它強大的type類型系統(tǒng)加持,能讓我們在編寫代碼時增加更多嚴謹?shù)南拗啤W⒁?,它并不是一門全新的語言,所以并沒有增加額外的學習成本
    2022-12-12

最新評論

合作市| 金坛市| 清徐县| 延长县| 治多县| 砀山县| 高清| 景洪市| 临夏县| 金昌市| 柳州市| 都昌县| 宜兴市| 伊通| 开封县| 肥乡县| 洪泽县| 敦化市| 额济纳旗| 民权县| 耒阳市| 永善县| 新竹市| 应用必备| 金阳县| 巴南区| 丹江口市| 阳城县| 普定县| 雷波县| 诏安县| 大埔区| 玉田县| 和静县| 历史| 阿合奇县| 安康市| 建始县| 图木舒克市| 衢州市| 察哈|