EP-WachatApp/eaterplanet_ecommerce/components/skeleton/skeleton.js

89 lines
2.4 KiB
JavaScript
Raw Normal View History

2023-03-24 11:24:28 +08:00
// 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;
}
}
})