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


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时间日期和毫秒的相互转换
Feb 22 Javascript
Javascript中valueOf与toString区别浅析
Mar 19 Javascript
js匿名函数作为函数参数详解
Jun 01 Javascript
总结javascript中的六种迭代器
Aug 16 Javascript
Bootstrap在线电子商务网站实战项目5
Oct 14 Javascript
H5移动端适配 Flexible方案
Oct 24 Javascript
javascript实现鼠标点击页面 移动DIV
Dec 02 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
Mar 09 Javascript
Vue实现动态创建和删除数据的方法
Mar 17 Javascript
对vue中v-on绑定自定事件的实例讲解
Sep 06 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 Javascript
js核心基础之闭包的应用实例分析
May 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
UCenter Home二次开发指南
2009/05/28 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
PHP正则表达式入门教程(推荐)
2016/05/18 PHP
Yii框架的路由配置方法分析
2019/09/09 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
javascript与CSS复习(二)
2010/06/29 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
iview中Select 选择器多选校验方法
2018/03/15 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
vue--点击当前增加class,其他删除class的方法
2018/09/15 Javascript
小程序红包雨的实现示例
2019/02/19 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
three.js显示中文字体与tween应用详析
2021/01/04 Javascript
vue组件是如何解析及渲染的?
2021/01/13 Vue.js
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
python使用mysqldb连接数据库操作方法示例详解
2013/12/03 Python
python中dir函数用法分析
2015/04/17 Python
Python中Continue语句的用法的举例详解
2015/05/14 Python
Python读取指定目录下指定后缀文件并保存为docx
2017/04/23 Python
python excel使用xlutils类库实现追加写功能的方法
2018/05/02 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
python通过实例讲解反射机制
2019/10/17 Python
解决python脚本中error: unrecognized arguments: True错误
2020/04/20 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
2020/06/02 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
财务助理岗位职责
2013/11/10 职场文书
经济职业学院毕业生自荐书
2014/03/17 职场文书
java开发双人五子棋游戏
2022/05/06 Java/Android
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技