更优雅的微信小程序骨架屏实现详解


Posted in Javascript onAugust 07, 2019

一、演示

更优雅的微信小程序骨架屏实现详解

更优雅的微信小程序骨架屏实现详解

二、说明:

实现思路:需要默认数据,这样才能完美应对list,wx:if的情况,及flex宽度靠内容撑开的样式。

替换思路:和imageLoader加载器类似:先展示默认图片,拿到数据之后显示真实的图片

具体实现:

页面准备一份默认数据:defaultData

xml中:<skeleton watchData={{与卡槽笨蛋一样的对象}}><slot/></skeleton>

页面onload时,data=defaultData

此时:watchData第一次收到数据(第一次为onload时),靠默认数据,撑开卡槽容器,自身opacity:0;

此后,再收到数据就关闭骨架屏

优点:

1.好维护:页面没有额外的xml。也没有额外的css。只需要维护一份默认数据即可。

2.更优雅,更真实:多个请求,会看到分批次的替换。而不需要全请求成功才替换。

3.可以和imageLoader共处,而不会出现和美团等骨架屏没有之后,图片区域还出现短暂空白

4.可定制:

  • 可以共存:文字,图片/imageLoader,或其它的。低入侵
  • 骨架屏不是一个完整的,而是items,且可以有不同的样式或过渡
  • 可以完美支持触底加载时的骨架屏

注意事项:

1、custom-class:需要传与卡槽一样的[border-radius];可选[背景色],或者其它

2、custom-class:宽高不需要传,默认数据就是撑开宽高的

三、代码:

import {
 extendComponent
} from '../../common/component';
extendComponent({
 properties: {
  watchData: null,//观察对应的请求对象
  transition:{//过渡名称,对应该组件的name
   type:String,
   value:null
  }
 },
 observers: {
  "watchData":function(newVal){
   this.data.counter+=1;
   if(this.data.counter>=2){
    this.setData({success:true});
   }
  }
 },
 data: {
  counter:0,//第一次显示骨架屏,之后就显示真实节点。
  success:false //不可逆,只能false->true
 }
})
<!--components/skeleton/skeleton.wxml-->
<!-- 这里是真实渲染 -->
<view wx:if="{{success}}" >
  <slot />
</view>

<!-- 这里是骨架屏:有动画情况 -->
 <transition 
  wx:elif="{{transition}}"
  show="{{true}}"
  name="{{ transition }}"
  duration="{{800}}"
  custom-class="skeleton custom-class"
 >
  <view style="opacity:0;">
    <slot />
  </view>
</transition>

<!-- 这里是骨架屏:无动画情况 -->
<view wx:else class="skeleton custom-class">
  <view style="opacity:0;">
    <slot />
  </view>
</view>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript开发包大全整理
Dec 22 Javascript
FireFox中textNode分片的问题
Apr 10 Javascript
js定时器(执行一次、重复执行)
Mar 07 Javascript
Angularjs 自定义服务的三种方式(推荐)
Aug 02 Javascript
基于BootStrap实现局部刷新分页实例代码
Aug 08 Javascript
COM组件中调用JavaScript函数详解及实例
Feb 23 Javascript
Bootstrap 树控件使用经验分享(图文解说)
Nov 06 Javascript
Postman模拟发送带token的请求方法
Mar 31 Javascript
基于vue-element组件实现音乐播放器功能
May 06 Javascript
详解Angular如何正确的操作DOM
Jul 06 Javascript
jquery实现购物车基本功能
Oct 25 jQuery
jquery获取input输入框中的值
Nov 13 jQuery
vue 集成jTopo 处理方法
Aug 07 #Javascript
vue 集成 vis-network 实现网络拓扑图的方法
Aug 07 #Javascript
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
Aug 07 #Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
Aug 07 #Javascript
javascript for循环性能测试示例
Aug 07 #Javascript
弱类型语言javascript中 a,b 的运算实例小结
Aug 07 #Javascript
解决一个微信号同时支持多个环境网页授权问题
Aug 07 #Javascript
You might like
PHP的范围解析操作符(::)的含义分析说明
2011/07/03 PHP
php的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
php如何解决无法上传大于8M的文件问题
2014/03/10 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
关于jQuery中的end()使用方法
2011/07/10 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
jQuery实现多按钮单击变色
2014/11/27 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
微信用户访问小程序的登录过程详解
2019/09/20 Javascript
vue组件中节流函数的失效的原因和解决方法
2020/12/02 Vue.js
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
Python实现SQL注入检测插件实例代码
2019/02/02 Python
Nili Lotan官网:Nili Lotan同名品牌
2018/01/07 全球购物
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
节省高达65%的城市景点费用:Go City
2019/07/06 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
内科护士实习自我鉴定
2013/10/17 职场文书
十八大闭幕感言
2014/01/22 职场文书
作弊检讨书1000字
2014/02/01 职场文书
航海技术专业毕业生推荐信
2014/07/09 职场文书
借名购房协议书范本
2014/10/06 职场文书
班级光棍节联谊会策划书
2014/10/10 职场文书
信用卡工资证明范本
2014/10/17 职场文书
钳工实训报告总结
2014/11/04 职场文书
幼儿园小朋友毕业感言
2015/07/30 职场文书