初始化
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
|
||||
|
||||
Component({
|
||||
options: {
|
||||
addGlobalClass: true,
|
||||
pureDataPattern: /^_/,
|
||||
multipleSlots: true
|
||||
},
|
||||
properties: {
|
||||
vtabs: {type: Array, value: []},
|
||||
tabBarClass: {type: String, value: ''},
|
||||
activeClass: {type: String, value: ''},
|
||||
tabBarLineColor: {type: String, value: '#07c160'},
|
||||
tabBarInactiveTextColor: {type: String, value: '#000000'},
|
||||
tabBarActiveTextColor: {type: String, value: '#07c160'},
|
||||
tabBarInactiveBgColor: {type: String, value: '#eeeeee'},
|
||||
tabBarActiveBgColor: {type: String, value: '#ffffff'},
|
||||
activeTab: {type: Number, value: 0},
|
||||
animation: {type: Boolean, value: true}
|
||||
},
|
||||
data: {
|
||||
currentView: 0,
|
||||
contentScrollTop: 0,
|
||||
_heightRecords: [],
|
||||
_contentHeight: {}
|
||||
},
|
||||
observers: {
|
||||
activeTab: function activeTab(_activeTab) {
|
||||
this.scrollTabBar(_activeTab)
|
||||
}
|
||||
},
|
||||
relations: {
|
||||
'../vtabs-content/vtabs-content': {
|
||||
type: 'child',
|
||||
linked: function linked(target) {
|
||||
const _this = this
|
||||
|
||||
target.calcHeight(function (rect) {
|
||||
_this.data._contentHeight[target.data.tabIndex] = rect.height
|
||||
if (_this._calcHeightTimer) {
|
||||
clearTimeout(_this._calcHeightTimer)
|
||||
}
|
||||
_this._calcHeightTimer = setTimeout(function () {
|
||||
_this.calcHeight()
|
||||
}, 100)
|
||||
})
|
||||
},
|
||||
unlinked: function unlinked(target) {
|
||||
delete this.data._contentHeight[target.data.tabIndex]
|
||||
}
|
||||
}
|
||||
},
|
||||
lifetimes: {
|
||||
attached: function attached() {}
|
||||
},
|
||||
methods: {
|
||||
calcHeight: function calcHeight() {
|
||||
const length = this.data.vtabs.length
|
||||
const _contentHeight = this.data._contentHeight
|
||||
const _heightRecords = []
|
||||
let temp = 0
|
||||
for (let i = 0; i < length; i++) {
|
||||
_heightRecords[i] = temp + (_contentHeight[i] || 0)
|
||||
temp = _heightRecords[i]
|
||||
}
|
||||
this.data._heightRecords = _heightRecords
|
||||
},
|
||||
scrollTabBar: function scrollTabBar(index) {
|
||||
const len = this.data.vtabs.length
|
||||
if (len === 0) return
|
||||
let currentView = index < 6 ? 0 : index - 5
|
||||
if (currentView >= len) currentView = len - 1
|
||||
this.setData({currentView})
|
||||
},
|
||||
handleTabClick: function handleTabClick(e) {
|
||||
const _heightRecords = this.data._heightRecords
|
||||
const index = e.currentTarget.dataset.index
|
||||
const contentScrollTop = _heightRecords[index - 1] || 0
|
||||
this.triggerEvent('tabclick', {index})
|
||||
this.setData({
|
||||
activeTab: index,
|
||||
contentScrollTop
|
||||
})
|
||||
},
|
||||
handleContentScroll: function handleContentScroll(e) {
|
||||
const _heightRecords = this.data._heightRecords
|
||||
if (_heightRecords.length === 0) return
|
||||
const length = this.data.vtabs.length
|
||||
const scrollTop = e.detail.scrollTop
|
||||
let index = 0
|
||||
if (scrollTop >= _heightRecords[0]) {
|
||||
for (let i = 1; i < length; i++) {
|
||||
if (scrollTop >= _heightRecords[i - 1] && scrollTop < _heightRecords[i]) {
|
||||
index = i
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if (index !== this.data.activeTab) {
|
||||
this.triggerEvent('change', {index})
|
||||
this.setData({activeTab: index})
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"component": true,
|
||||
"usingComponents": {}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
|
||||
|
||||
<view class="weui-vtabs">
|
||||
<view class="weui-vtabs-bar__wrp {{tabBarClass}}">
|
||||
<scroll-view
|
||||
scroll-y
|
||||
class="weui-vtabs-bar__scrollview"
|
||||
scroll-into-view="weui-vtabs-item__{{currentView}}"
|
||||
>
|
||||
<view class="weui-vtabs-bar__content">
|
||||
<block wx:for="{{vtabs}}" wx:key="title">
|
||||
<view
|
||||
id="weui-vtabs-item__{{index}}"
|
||||
class="{{activeTab === index ? 'weui-vtabs-bar__activeitem' : ''}} weui-vtabs-bar__item"
|
||||
data-index="{{index}}"
|
||||
|
||||
bindtap="handleTabClick"
|
||||
>
|
||||
<view class="weui-vtabs-bar__title {{activeTab === index ? activeClass : ''}}">
|
||||
<text class="">{{item.title}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
<view class="weui-vtabs-content__wrp">
|
||||
<scroll-view
|
||||
scroll-y
|
||||
class="weui-vtabs-content__scrollview"
|
||||
scroll-top="{{contentScrollTop}}"
|
||||
scroll-with-animation="{{animation}}"
|
||||
bindscroll="handleContentScroll"
|
||||
>
|
||||
<view class="weui-vtabs-content">
|
||||
<slot ></slot>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</view>
|
||||
<!--
|
||||
style="background-color: {{activeTab === index ? tabBarActiveBgColor : tabBarInactiveBgColor}}; color: {{activeTab === index ? tabBarActiveTextColor : tabBarInactiveTextColor}}; border-left-color: {{activeTab === index ? tabBarLineColor : tabBarInactiveBgColor}}" -->
|
||||
@@ -0,0 +1,53 @@
|
||||
.weui-vtabs {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex
|
||||
}
|
||||
|
||||
.weui-vtabs-bar__wrp {
|
||||
width: 110px;
|
||||
height: 100%;
|
||||
background: #eeeeee;
|
||||
}
|
||||
|
||||
.weui-vtabs-bar__scrollview {
|
||||
height: 100%
|
||||
}
|
||||
|
||||
.weui-vtabs-bar__content {
|
||||
width: 110px;
|
||||
height: 100%
|
||||
}
|
||||
|
||||
.weui-vtabs-bar__item {
|
||||
display: inline-block;
|
||||
width: 110px;
|
||||
height: 55px;
|
||||
border-left: 4px solid transparent
|
||||
}
|
||||
|
||||
.weui-vtabs-bar__title {
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 14px;
|
||||
white-space: nowrap;
|
||||
overflow: hidden
|
||||
}
|
||||
|
||||
.weui-vtabs-content__wrp {
|
||||
overflow: hidden;
|
||||
flex: 1;
|
||||
height: 100%
|
||||
}
|
||||
|
||||
.weui-vtabs-content__scrollview {
|
||||
height: 100%
|
||||
}
|
||||
|
||||
.weui-vtabs-content {
|
||||
height: 100%
|
||||
}
|
||||
Reference in New Issue
Block a user