oak-general-business/lib/miniprogram_npm/lin-ui/sticky/index.js

164 lines
3.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import validator from '../behaviors/validator';
Component({
externalClasses: ['l-class'],
behaviors: [validator],
relations: {
'../sticky-item/index': {
type: 'child',
linked() {
this.checkSupportCssSticky().then((isSupportCssSticky) => {
if (!isSupportCssSticky) {
this.updateStickyItemsSizeData();
}
}).catch(err => {
console.error(err);
});
},
linkChanged() {
this.checkSupportCssSticky().then((isSupportCssSticky) => {
if (!isSupportCssSticky) {
this.updateStickyItemsSizeData();
}
}).catch(err => {
console.error(err);
});
},
unlinked() {
this.checkSupportCssSticky().then((isSupportCssSticky) => {
if (!isSupportCssSticky) {
this.updateStickyItemsSizeData();
}
}).catch(err => {
console.error(err);
});
}
}
},
properties: {
/**
* 吸顶容器实现模式
* js - 使用js实现
* css - 使用css实现若不支持css则回滚到js模式
*/
mode: {
type: String,
value: 'js',
options: ['js', 'css']
},
/**
* 页面垂直滚动的距离
*/
scrollTop: Number,
},
observers: {
/**
* 监听页面滚动,实时更新吸顶容器位置
*/
'scrollTop': function () {
this.checkSupportCssSticky().then((isSupportCssSticky) => {
if (!isSupportCssSticky) {
this.updateStickyItemsPosition();
}
}).catch(err => {
console.error(err);
});
}
},
lifetimes: {
attached() {
this.checkSupportCssSticky().then((isSupportCssSticky) => {
if (!isSupportCssSticky) {
this.initSticky();
}
}).catch(err=>{
console.error(err);
});
}
},
methods: {
/**
* 创建wx.lin函数
*/
initSticky() {
wx.lin = wx.lin || {};
wx.lin.flushSticky = () => {
this.updateStickyItemsSizeData();
};
// 传入scrollTop的值的函数
wx.lin.setScrollTop = (scrollTop) => {
this.data.scrollTop = scrollTop;
this.checkSupportCssSticky().then((isSupportCssSticky) => {
if (!isSupportCssSticky) {
this.updateStickyItemsPosition();
}
}).catch(err=>{
console.error(err);
});
};
},
/**
* 更新所有sticky-item组件的position属性
*/
updateStickyItemsPosition() {
const stickyItemNodes = this.getStickyItemNodes();
for (let stickyItemNode of stickyItemNodes) {
stickyItemNode.updateStickyItemPosition(this.data.scrollTop);
}
},
/**
* 更新所有sticky-item组件的基础数据
*/
updateStickyItemsSizeData() {
const stickyItemNodes = this.getStickyItemNodes();
stickyItemNodes.forEach((item, index) => {
item.updateStickyItemBaseData(index);
});
},
/**
* 获取所有的sticky-item组件
* @return {Object} sticky-item组件集合
*/
getStickyItemNodes() {
return this.getRelationNodes('../sticky-item/index');
},
/**
* 检测当前webview内核是否支持css设置sticky
* @return {Boolean} css是否支持设置sticky
*/
checkSupportCssSticky() {
return new Promise((resolve) => {
const stickyItemNodes = this.getStickyItemNodes();
if (stickyItemNodes.length === 0) {
resolve(false);
}
// 根据position判断是否支持position:sticky
wx
.createSelectorQuery()
.in(stickyItemNodes[0])
.select('.l-sticky-item-header')
.fields({computedStyle: ['position']})
.exec((res) => {
if (res[0] === null) {
resolve(false);
} else {
resolve(res[0].position === 'sticky');
}
});
});
},
}
});