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


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 相关文章推荐
js中top的作用深入剖析
Mar 04 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
Dec 22 Javascript
jquery中change()用法实例分析
Feb 06 Javascript
如何使用HTML5地理位置定位功能
Apr 27 Javascript
javascript格式化日期时间方法汇总
Jun 19 Javascript
纯javascript模仿微信打飞机小游戏
Aug 20 Javascript
jquery事件与绑定事件
Mar 16 Javascript
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
angularjs 获取默认选中的单选按钮的value方法
Feb 28 Javascript
JS实现将二维数组转为json格式字符串操作示例
Jul 12 Javascript
Layui实现数据表格默认全部显示(不要分页)
Oct 26 Javascript
Js on及addEventListener原理用法区别解析
Jul 11 Javascript
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
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
Smarty Foreach 使用说明
2010/03/23 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
2019/10/17 PHP
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
将数字转换成大写的人民币表达式的js函数
2014/09/21 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
javascript中异常处理案例(推荐)
2016/10/03 Javascript
JS将unicode码转中文方法
2017/05/08 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
docker中编译nodejs并使用nginx启动
2017/06/23 NodeJs
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
小程序云开发实战小结
2018/10/25 Javascript
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
Vue 前端实现登陆拦截及axios 拦截器的使用
2019/07/17 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
在Python中实现贪婪排名算法的教程
2015/04/17 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
matplotlib在python上绘制3D散点图实例详解
2017/12/09 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
Python实现滑动平均(Moving Average)的例子
2019/08/24 Python
使用opencv将视频帧转成图片输出
2019/12/10 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
美国内衣品牌:Leonisa
2016/08/14 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
读《茶花女》有感:山茶花的盛开与凋零
2020/01/17 职场文书
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers