89 lines
2.4 KiB
JavaScript
89 lines
2.4 KiB
JavaScript
|
// 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;
|
|||
|
}
|
|||
|
}
|
|||
|
})
|