网页中的图片预加载

我们知道在 Web 页面中实现图片的预加载其实很简单,通常的做法是在 JS 中使用 Image 对象即可,代码大致如下

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

然而在微信小程序(以下简称小程序)里要实现图片的预加载要更麻烦一些,因为小程序里并没有提供类似 Image 这样的 JS 对象。。

小程序必知必会

在进入正题前,需要了解以下小程序相关的知识(当然最好还是完整的学习一下官方文档):

  1. 小程序框架的核心是一个响应的数据绑定系统,整个系统分为视图层和逻辑层两块,视图层即页面模板(后缀为 .wxml 的文件),逻辑层即页面 JS 文件
  2. 小程序的页面模板由一系列的基础组件组合而成,如 view、text、button 等
  3. 页面内容的更新基于数据的单向绑定来进行,通过 JS 调用 Page 对象的 setData 方法来更新模板中绑定的数据
  4. 视图层到逻辑层的通信是通过事件完成的,在组件中声明事件的回调,JS 端可监听到界面交互的发生、组件状态的变化等
  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 及加载成功或失败的回调,使用起来很简单

<!-- 模板文件 bar.wxml -->
<image src="//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('图片加载失败')}
})

运行以上代码,顺利的话页面上会显示出一张图片,同时控制台会打印出带图片宽高的日志信息

将功能抽离成公用组件

接下来我们考虑实现这么一个功能,在页面上载入一张尺寸和 K 数都很大的图片,由于图片很大,下载需要一定的时间,而在这段时间内,用户看到的是空白或是不完整的图片,体验显然不好。

一种常用的优化手段是先加载一张缩略图,该缩略图通过样式设置为和原图一样的宽高,这样用户首先能很快速地看到一张模糊的图片,此时再去对原图做预加载,加载完成之后对缩略图进行替换,因为此时图片已经下载过了,所以界面上能无缝地切换为原图显示,效果如下:

我们团队承接前端开发、小程序开发,欢迎外包合作。如有需要,敬请咨询!微信/QQ:865500888

运行以上代码,顺利的话页面上会显示出一张图片,同时控制台会打印出带图片宽高的日志信息

将功能抽离成公用组件

接下来我们考虑实现这么一个功能,在页面上载入一张尺寸和 K 数都很大的图片,由于图片很大,下载需要一定的时间,而在这段时间内,用户看到的是空白或是不完整的图片,体验显然不好。

一种常用的优化手段是先加载一张缩略图,该缩略图通过样式设置为和原图一样的宽高,这样用户首先能很快速地看到一张模糊的图片,此时再去对原图做预加载,加载完成之后对缩略图进行替换,因为此时图片已经下载过了,所以界面上能无缝地切换为原图显示,效果如下:

可以看出,由于小程序里无法动态地插入模板结构,所以相对于普通网页端的组件调用,这里多出了在 WXML 文件中引入及使用模板这个步骤,而其他部分对于调用方(即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 })})}
})

如果把图片加载完成的回调统一指定成 Page 对象中的方法,则可以很方便地处理多张图片的加载,这里也写了个例子,效果如下:

我们团队承接前端开发、小程序开发,欢迎外包合作。如有需要,敬请咨询!微信/QQ:865500888

总的来说调用起来还算方便吧,img-loader 的组件代码略多这里就不贴出来啦,Have Fun~

页面加载成功后调用_在微信小程序里实现图片预加载组件相关推荐

  1. mfc cimage加载显示图片_在微信小程序里实现图片预加载组件

    网页中的图片预加载 我们知道在 Web 页面中实现图片的预加载其实很简单,通常的做法是在 JS 中使用 Image 对象即可,代码大致如下 var image = new Image() image. ...

  2. 微信小程序中高清图片替换加载策略

    微信小程序中高清图片替换加载策略 前言 一.基本思想 二.具体步骤 1.图片大小对比 2.代码流程 总结 前言 随着微信的不断发展,微信小程序凭借着它用户基数大,无下载安装等优点开始逐渐替代传统app ...

  3. 小程序开发之图片预加载

    小程序图片预加载,小程序不像web的html,很多属性小程序没体现出来,比如图片预加载 我们现在来看看小程序中的图片预加载 这个是wxml <view class="img-conte ...

  4. 微信小程序—自定义(城市选择)弹窗组件,将弹窗组件的值传给调用页面并显示(图文)

    微信小程序-自定义(城市选择)弹窗组件,并传值 1.新建component文件夹用来存放自定义组件,并在其文件夹内新建cityModal Component,注意不是新建Page 新建完成之后出现四个 ...

  5. APP自动化_操作微信小程序/H5页面实现自动化_多终端并行

    APP自动化_混合App自动化理论相关 原理:本质是混合app,应该用切入webview的方法去自动化web页面. 现状:目前由于技术原因无法切到webview中做自动化. 方案:采用原生app自动方 ...

  6. 微信小程序调用PHP接口,微信小程序调用PHP后台接口教程

    微信小程序调用PHP后台接口,解析纯html文本,效果图片预览 1.微信js动态传参: wx.request({ url: 'https://m.****.com/index.php/Home/Xia ...

  7. 微信小程序下拉框插件_微信小程序自定义select下拉选项框组件的实现代码_清玖_前端开发者...

    知识点:组件,animation,获取当前点击元素的索引与内容 微信小程序中没有select下拉选项框,所以只有自定义.自定义的话,可以选择模板的方式,也可以选择组件的方式来创建. 这次我选择了组件, ...

  8. 微信小程序网络请求异常怎么办_监控微信小程序wx.request请求失败

    在微信小程序里,与后台服务器交互的主要接口函数是wx.request(),用于发起 HTTPS 网络请求.其重要性不言而喻.然而,却经常遇到请求失败的问题,笔者特意谷歌"wx.request ...

  9. 微信小程序流量主广告怎么加圆角

    微信小程序流量主广告ad加圆角 广告标签外侧加一层view标签,给view设置圆角和overflow:hidden <view style="border-radius:20upx;o ...

最新文章

  1. 【290】Python 函数
  2. 【NLP】预训练模型综述
  3. Angular元素属性绑定的一个例子
  4. 选择、插入、冒泡排序
  5. 超人气光棍节!现在时间虽然不是2011年11月11日11点11分11秒11毫秒11微秒11纳秒11皮秒11飞秒11阿秒11渺秒11......
  6. Mac----已被macOS使用
  7. 【转】Entity Framework教程
  8. C语言中函数中传入一个数组,并且返回一个数组
  9. java编程创建警告_java – 无法阻止ant生成编译器Sun专有API警告
  10. cython编译python_cython编译报错
  11. 亚马逊服务器个人文档,AmazonAWS入门-文档.PDF
  12. 新建 FrameMaker API 时引用目录的设置
  13. ossec是干什么的?
  14. linux ipp,IPP 文件扩展名: 它是什么以及如何打开它?
  15. 【MySQL】mysql数据库操作指南
  16. [JVM]了断局: 类加载机制
  17. 解决Navicat 连接Oracle时报cannot create oci handles
  18. 蓝桥杯官网python组基础练习-基础1-5
  19. UG二次开发教程(基于NX12.0/VS2015版本)
  20. Deep Learning × ECG (1) :关于心律失常ECG的基础常识

热门文章

  1. JQuery中元素的数据存储
  2. Node项目部署到阿里云服务器(ECS),以Nuxt.js服务端渲染项目为例
  3. Mint-ui框架Index List 的应用,以及高度的适配问题
  4. 三维重建:Kinect几何映射-SDK景深数据处理
  5. Get Set的问题解决
  6. 购物商城Web开发第一天
  7. Python自动化开发学习22-Django下(Form)
  8. python2.7.12操作Hbase
  9. linux小知识之终端
  10. WinPE ISO制作