12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- // components/skeleton.js
- import SystemInfo from 'getSystemInfo.js'
- Component({
- /**
- * 组件的属性列表
- */
- properties: {
- },
- /**
- * 组件的初始数据
- */
- data: {
- height: 0, //卡片高度,用来做外部懒加载的占位
- showSlot: true, //控制是否显示当前的slot内容
- skeletonId: ''
- },
- created() {
- //设置一个走setData的数据池
- this.extData = {
- listItemContainer: null,
- }
- },
- detached() {
- try {
- this.extData.listItemContainer.disconnect()
- } catch (error) {
- }
- this.extData = null
- },
- ready() {
- this.setData({
- skeletonId: this.randomString(8) //设置唯一标识
- })
- wx.nextTick(() => {
- // 修改了监听是否显示内容的方法,改为前后showNum屏高度渲染
- // 监听进入屏幕的范围relativeToViewport({top: xxx, bottom: xxx})
- let info = SystemInfo.getInfo()
- let { windowHeight = 667 } = info.source.system
- let showNum = 3 //超过屏幕的数量,目前这个设置是上下2屏
- try {
- this.extData.listItemContainer = this.createIntersectionObserver()
- this.extData.listItemContainer.relativeToViewport({ top: showNum * windowHeight, bottom: showNum * windowHeight })
- .observe(`#list-item-${this.data.skeletonId}`, (res) => {
- let { intersectionRatio } = res
- if (intersectionRatio === 0) {
- console.log('【卸载】', this.data.skeletonId, '超过预定范围,从页面卸载')
- this.setData({
- showSlot: false
- })
- } else {
- console.log('【进入】', this.data.skeletonId, '达到预定范围,渲染进页面')
- this.setData({
- showSlot: true,
- height: res.boundingClientRect.height
- })
- }
- })
- } catch (error) {
- console.log(error)
- }
- })
-
- },
- /**
- * 组件的方法列表
- */
- methods: {
- /**
- * 生成随机的字符串
- */
- randomString(len) {
- len = len || 32;
- var $chars = 'abcdefhijkmnprstwxyz2345678'; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
- var maxPos = $chars.length;
- var pwd = '';
- for (var i = 0; i < len; i++) {
- pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
- }
- return pwd;
- }
- }
- })
|