186 lines
5.8 KiB
JavaScript
186 lines
5.8 KiB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
};
|
|
import { SuperComponent, wxComponent } from '../common/src/index';
|
|
import config from '../common/config';
|
|
import props from './props';
|
|
const { prefix } = config;
|
|
const classPrefix = `${prefix}-indexes`;
|
|
const topOffset = 40;
|
|
let IndexBar = class IndexBar extends SuperComponent {
|
|
constructor() {
|
|
super(...arguments);
|
|
this.externalClasses = [`${prefix}-class`, `${prefix}-class-index`];
|
|
this.properties = props;
|
|
this.observers = {
|
|
list(newValue) {
|
|
let groups = newValue;
|
|
if (!!newValue.length && newValue[0].title === undefined) {
|
|
groups = groups.map((g) => {
|
|
return Object.assign({ title: g.index }, g);
|
|
});
|
|
}
|
|
this.setData({ groups });
|
|
},
|
|
height() {
|
|
this.getDomInfo();
|
|
},
|
|
};
|
|
this.data = {
|
|
prefix,
|
|
classPrefix,
|
|
clientHeight: 0,
|
|
groups: [],
|
|
activeGroup: null,
|
|
currentGroup: null,
|
|
showScrollTip: false,
|
|
};
|
|
this.timer = null;
|
|
this.groupTop = null;
|
|
this.btnBar = null;
|
|
}
|
|
ready() {
|
|
this.getHeight();
|
|
}
|
|
getHeight() {
|
|
wx.getSystemInfo({
|
|
success: (res) => {
|
|
this.setData({
|
|
clientHeight: res.windowHeight,
|
|
}, () => {
|
|
this.getDomInfo();
|
|
});
|
|
},
|
|
});
|
|
}
|
|
getDomInfo() {
|
|
const query = this.createSelectorQuery();
|
|
query.select(`#id-${classPrefix}__bar`).boundingClientRect();
|
|
query.selectAll(`.${classPrefix}__group`).boundingClientRect();
|
|
query.exec((res) => {
|
|
if (!res[0])
|
|
return;
|
|
this.btnBar = {
|
|
top: res[0].top,
|
|
height: res[0].height,
|
|
itemHeight: res[0].height / this.data.groups.length,
|
|
};
|
|
if (!res[1])
|
|
return;
|
|
this.groupTop = res[1].map((element) => element.height);
|
|
this.groupTop.reduce((acc, cur, index) => {
|
|
const amount = acc + cur;
|
|
this.groupTop[index] = amount;
|
|
return amount;
|
|
});
|
|
});
|
|
}
|
|
computedIndex(tapY) {
|
|
const offsetY = tapY - this.btnBar.top;
|
|
let index;
|
|
if (offsetY < 0) {
|
|
index = 0;
|
|
}
|
|
else if (offsetY > this.btnBar.height) {
|
|
index = this.data.groups.length - 1;
|
|
}
|
|
else {
|
|
index = Math.floor(offsetY / this.btnBar.itemHeight);
|
|
}
|
|
return index;
|
|
}
|
|
computedIndexByScrollTop(scrollTop) {
|
|
if (!this.groupTop) {
|
|
return -1;
|
|
}
|
|
return this.groupTop.findIndex((element) => element - topOffset > scrollTop);
|
|
}
|
|
activeIndexWhenScroll(scrollTop) {
|
|
const curIndex = this.computedIndexByScrollTop(scrollTop);
|
|
if (curIndex >= 0) {
|
|
this.setData({
|
|
activeGroup: this.data.groups[curIndex],
|
|
});
|
|
}
|
|
}
|
|
scrollToY(tapY) {
|
|
const index = this.computedIndex(tapY);
|
|
this.scrollToAnchor(index);
|
|
}
|
|
scrollToAnchor(index) {
|
|
this.switchScrollTip(true);
|
|
const curGroup = this.data.groups[index];
|
|
this.setData({
|
|
activeGroup: curGroup,
|
|
currentGroup: curGroup,
|
|
});
|
|
}
|
|
switchScrollTip(val) {
|
|
val = !!val;
|
|
const switchFun = (value) => {
|
|
if (this.data.showScrollTip === value) {
|
|
return;
|
|
}
|
|
this.setData({
|
|
showScrollTip: value,
|
|
});
|
|
};
|
|
if (!val) {
|
|
clearInterval(this.timer);
|
|
this.timer = setTimeout(() => {
|
|
switchFun(false);
|
|
}, 300);
|
|
}
|
|
else {
|
|
switchFun(true);
|
|
}
|
|
}
|
|
throttleScroll() {
|
|
return new Promise((resolve) => {
|
|
const delay = 100;
|
|
const now = Date.now();
|
|
if (this.lastScrollTime && this.lastScrollTime + delay > now) {
|
|
if (this.scrollTimer) {
|
|
clearTimeout(this.scrollTimer);
|
|
}
|
|
this.scrollTimer = setTimeout(() => {
|
|
this.lastScrollTime = now;
|
|
resolve();
|
|
}, delay);
|
|
}
|
|
else {
|
|
this.lastScrollTime = now;
|
|
resolve();
|
|
}
|
|
});
|
|
}
|
|
onTouchStart() { }
|
|
onTouchMove(e) {
|
|
this.throttleScroll().then(() => this.scrollToY(e.changedTouches[0].pageY));
|
|
}
|
|
onTouchCancel() {
|
|
this.switchScrollTip(false);
|
|
}
|
|
onTouchEnd(e) {
|
|
this.switchScrollTip(false);
|
|
this.scrollToY(e.changedTouches[0].pageY);
|
|
}
|
|
onCellTap(e) {
|
|
const { indexes } = e.currentTarget.dataset;
|
|
this.triggerEvent('select', { indexes });
|
|
}
|
|
onListScroll(e) {
|
|
this.throttleScroll().then(() => {
|
|
const { scrollTop } = e.detail;
|
|
this.activeIndexWhenScroll(scrollTop);
|
|
});
|
|
}
|
|
};
|
|
IndexBar = __decorate([
|
|
wxComponent()
|
|
], IndexBar);
|
|
export default IndexBar;
|