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


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 相关文章推荐
IE和firefox浏览器的event事件兼容性汇总
Dec 06 Javascript
Prototype源码浅析 String部分(四)之补充
Jan 16 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
Jan 24 Javascript
node.js中的fs.createReadStream方法使用说明
Dec 17 Javascript
angular.foreach 循环方法使用指南
Jan 06 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
js中获取键盘事件的简单实现方法
Oct 10 Javascript
JS中from 表单序列化提交的代码
Jan 20 Javascript
基于vue实现分页/翻页组件paginator示例
Mar 09 Javascript
利用jQuery解析获取JSON数据
Apr 08 jQuery
微信小程序选择图片和放大预览图片功能
Nov 02 Javascript
微信小程序日历插件代码实例
Dec 04 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
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
php漏洞之跨网站请求伪造与防止伪造方法
2013/08/15 PHP
JavaScript学习笔记(十七)js 优化
2010/02/04 Javascript
JavaScript DOM 学习第二章 编辑文本
2010/02/19 Javascript
怎么清空javascript数组
2013/05/11 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
js实现拖拽效果(构造函数)
2015/12/14 Javascript
Js实现简单的小球运动特效
2016/02/18 Javascript
javascript-解决mongoose数据查询的异步操作
2016/12/22 Javascript
微信小程序图表插件(wx-charts)实例代码
2017/01/17 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
vue项目打包部署_nginx代理访问方法详解
2018/09/20 Javascript
vue中,在本地缓存中读写数据的方法
2018/09/21 Javascript
用Object.prototype.toString.call(obj)检测对象类型原因分析
2018/10/11 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
vue实现点击按钮切换背景颜色的示例代码
2020/06/23 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
Python实现的堆排序算法示例
2018/04/29 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
python交换两个变量的值方法
2019/01/12 Python
Python设计模式之原型模式实例详解
2019/01/18 Python
基于Python的Post请求数据爬取的方法详解
2019/06/14 Python
pyqt5之将textBrowser的内容写入txt文档的方法
2019/06/21 Python
python中 * 的用法详解
2019/07/10 Python
Python爬虫基于lxml解决数据编码乱码问题
2020/07/31 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
Electrolux伊莱克斯巴西商店:家用电器、小家电和配件
2018/05/23 全球购物
安全资料员岗位职责
2013/12/14 职场文书
养生餐厅创业计划书范文
2014/03/26 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
办理房产证委托书
2014/09/18 职场文书
民间借贷借条如何写
2015/05/26 职场文书
Sql Server之数据类型详解
2022/02/28 SQL Server
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android