亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

     1、jquery 圖片預(yù)加載 自動(dòng)等比例縮放插件

     2、JS實(shí)現(xiàn)圖片預(yù)加載無(wú)需等待

     3、jQuery簡(jiǎn)單實(shí)現(xiàn)圖片預(yù)加載

然而在微信小程序(以下簡(jiǎn)稱小程序)里要實(shí)現(xiàn)圖片的預(yù)加載要更麻煩一些,因?yàn)樾〕绦蚶锊](méi)有提供類似 Image 這樣的 JS 對(duì)象。。

小程序必知必會(huì)

在進(jìn)入正題前,需要了解以下小程序相關(guān)的知識(shí)(當(dāng)然最好還是完整的學(xué)習(xí)一下官方文檔):

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

這里有個(gè)官方的簡(jiǎn)單例子可以用來(lái)幫助理解

<!-- 模板文件 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'
 })
 }
})

運(yùn)行這個(gè)頁(yè)面會(huì)看到一行 Hello WeChat! 的文字及一個(gè)按鈕,點(diǎn)擊按鈕后文字會(huì)變成 Hello MINA!

在小程序中加載圖片

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

<!-- 模板文件 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('圖片加載失敗')
 }
})

運(yùn)行以上代碼,順利的話頁(yè)面上會(huì)顯示出一張圖片,同時(shí)控制臺(tái)會(huì)打印出帶圖片寬高的日志信息

將功能抽離成公用組件

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

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

單張圖片預(yù)加載

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

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

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

<!-- 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>
<!-- 引入圖片預(yù)加載組件 -->
<import src="../../img-loader/img-loader.wxml"/>
<template is="img-loader" data="{{ imgLoadList }}"></template>
// ------ demo.js ------
//引入圖片預(yù)加載組件
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() {
 //初始化圖片預(yù)加載組件
 this.imgLoader = new ImgLoader(this)
 },
 loadImage() {
 //加載縮略圖
 this.setData({
 msg: '大圖正拼命加載..',
 imgUrl: imgUrlThumbnail
 })
 //同時(shí)對(duì)原圖進(jìn)行預(yù)加載,加載成功后再替換
 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 對(duì)象中的方法,則可以很方便地處理多張圖片的加載,這里也寫(xiě)了個(gè)例子,效果如下:

多張圖片預(yù)加載

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

總結(jié)

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

相關(guān)文章

  • TypeScript與JavaScript的區(qū)別分析

    TypeScript與JavaScript的區(qū)別分析

    TypeScript可以使用JavaScript中的所有代碼和編程概念,TypeScript是為了使JavaScript的開(kāi)發(fā)變得更加容易而創(chuàng)建的。推薦先精通JS的的前提下再學(xué)習(xí)TS,這樣更有利于同時(shí)學(xué)習(xí)兩門(mén)語(yǔ)言。
    2022-12-12
  • jsf實(shí)現(xiàn)微信小程序簡(jiǎn)潔登錄頁(yè)面(附源碼)

    jsf實(shí)現(xiàn)微信小程序簡(jiǎn)潔登錄頁(yè)面(附源碼)

    這篇文章主要介紹了實(shí)現(xiàn)微信小程序簡(jiǎn)潔登錄頁(yè)面?,對(duì)于正在學(xué)習(xí)的小伙伴都有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-01-01
  • Typescript裝飾器AOP示例詳解

    Typescript裝飾器AOP示例詳解

    這篇文章主要為大家介紹了Typescript裝飾器AOP示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Manipulation-TypeScript?DOM操作示例解析

    Manipulation-TypeScript?DOM操作示例解析

    這篇文章主要為大家介紹了DOM?Manipulation-TypeScript?DOM操作示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • TypeScript交叉運(yùn)算的算法示例解析

    TypeScript交叉運(yùn)算的算法示例解析

    這篇文章主要為大家介紹了TypeScript交叉運(yùn)算的算法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • DS-SDK封裝ThreeJS的三維場(chǎng)景核心庫(kù)Viewer

    DS-SDK封裝ThreeJS的三維場(chǎng)景核心庫(kù)Viewer

    這篇文章主要為大家介紹了基于DS-SDK封裝ThreeJS的三維場(chǎng)景核心庫(kù)Viewer封裝示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • TypeScript手寫(xiě)一個(gè)簡(jiǎn)單的eslint插件實(shí)例

    TypeScript手寫(xiě)一個(gè)簡(jiǎn)單的eslint插件實(shí)例

    這篇文章主要為大家介紹了TypeScript手寫(xiě)一個(gè)簡(jiǎn)單的eslint插件實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • layui.layer彈出層(子頁(yè)面)改變父頁(yè)面內(nèi)容(訪問(wèn)元素和函數(shù))

    layui.layer彈出層(子頁(yè)面)改變父頁(yè)面內(nèi)容(訪問(wèn)元素和函數(shù))

    當(dāng)前頁(yè)面(父框架或父頁(yè)面)使用layer以iframe層的方式彈出新的窗口(子框架或子頁(yè)面)時(shí),如何在子頁(yè)面中訪問(wèn)父頁(yè)面的元素和函數(shù),從而改變父元素的頁(yè)面顯示,給用戶合理舒適的體驗(yàn)。
    2023-02-02
  • 基于tsup打包TypeScript實(shí)現(xiàn)過(guò)程

    基于tsup打包TypeScript實(shí)現(xiàn)過(guò)程

    這篇文章主要為大家介紹了基于tsup打包TypeScript實(shí)現(xiàn)過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • postman數(shù)據(jù)加解密實(shí)現(xiàn)APP登入接口模擬請(qǐng)求

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

    對(duì)于Postman的使用,一般情況下只要發(fā)發(fā)確定的請(qǐng)求與參數(shù)就可以的了,然而,在使用的時(shí)候,尤其是接口測(cè)試時(shí),請(qǐng)求接口的設(shè)計(jì)里面都有數(shù)據(jù)加密,參數(shù)驗(yàn)簽,返回?cái)?shù)據(jù)也有進(jìn)行加密的,這個(gè)時(shí)候就需要使用一些腳本做處理,模擬app登入請(qǐng)求的操作
    2021-08-08

最新評(píng)論