vant-weapp/dist/tabs/index.js
2018-10-08 17:45:47 +08:00

170 lines
4.1 KiB
JavaScript

import { VantComponent } from '../common/component';
VantComponent({
relation: {
name: 'tab',
type: 'descendant',
linked: function linked(child) {
this.data.tabs.push({
instance: child,
data: child.data
});
this.updateTabs();
},
unlinked: function unlinked(child) {
var tabs = this.data.tabs.filter(function (item) {
return item.instance !== child;
});
this.setData({
tabs: tabs,
scrollable: tabs.length > this.data.swipeThreshold
});
this.setActiveTab();
}
},
props: {
color: String,
lineWidth: Number,
active: {
type: Number,
value: 0
},
type: {
type: String,
value: 'line'
},
border: {
type: Boolean,
value: true
},
duration: {
type: Number,
value: 0.2
},
zIndex: {
type: Number,
value: 99
},
swipeThreshold: {
type: Number,
value: 4
}
},
data: {
tabs: [],
lineStyle: '',
scrollLeft: 0,
scrollable: false
},
watch: {
swipeThreshold: function swipeThreshold() {
this.setData({
scrollable: this.data.tabs.length > this.data.swipeThreshold
});
},
color: 'setLine',
lineWidth: 'setLine',
active: 'setActiveTab'
},
mounted: function mounted() {
this.setLine();
this.scrollIntoView();
},
methods: {
updateTabs: function updateTabs() {
var tabs = this.data.tabs;
this.setData({
tabs: tabs,
scrollable: tabs.length > this.data.swipeThreshold
});
this.setActiveTab();
},
trigger: function trigger(eventName, index) {
this.$emit(eventName, {
index: index,
title: this.data.tabs[index].data.title
});
},
onTap: function onTap(event) {
var index = event.currentTarget.dataset.index;
if (this.data.tabs[index].data.disabled) {
this.trigger('disabled', index);
} else {
this.trigger('click', index);
this.setActive(index);
}
},
setActive: function setActive(active) {
if (active !== this.data.active) {
this.trigger('change', active);
this.setData({
active: active
});
this.setActiveTab();
}
},
setLine: function setLine() {
var _this = this;
if (this.data.type !== 'line') {
return;
}
this.getRect('.van-tab', true).then(function (rects) {
var rect = rects[_this.data.active];
var width = _this.data.lineWidth || rect.width;
var left = rects.slice(0, _this.data.active).reduce(function (prev, curr) {
return prev + curr.width;
}, 0);
left += (rect.width - width) / 2;
_this.setData({
lineStyle: "\n width: " + width + "px;\n background-color: " + _this.data.color + ";\n transform: translateX(" + left + "px);\n transition-duration: " + _this.data.duration + "s;\n "
});
});
},
setActiveTab: function setActiveTab() {
var _this2 = this;
this.data.tabs.forEach(function (item, index) {
var data = {
active: index === _this2.data.active
};
if (data.active) {
data.inited = true;
}
if (data.active !== item.instance.data.active) {
item.instance.setData(data);
}
});
this.setLine();
this.scrollIntoView();
},
// scroll active tab into view
scrollIntoView: function scrollIntoView() {
var _this3 = this;
if (!this.data.scrollable) {
return;
}
this.getRect('.van-tab', true).then(function (tabRects) {
var tabRect = tabRects[_this3.data.active];
var offsetLeft = tabRects.slice(0, _this3.data.active).reduce(function (prev, curr) {
return prev + curr.width;
}, 0);
var tabWidth = tabRect.width;
_this3.getRect('.van-tabs__nav').then(function (navRect) {
var navWidth = navRect.width;
_this3.setData({
scrollLeft: offsetLeft - (navWidth - tabWidth) / 2
});
});
});
}
}
});