日照项目的居民端小程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

133 lines
3.6 KiB

import baseComponent from '../helpers/baseComponent'
import classNames from '../helpers/classNames'
const getDefaultActiveKey = (elements) => {
const target = elements.filter((element) => !element.data.disabled)[0]
if (target) {
return target.data.key
}
return null
}
const activeKeyIsValid = (elements, key) => {
return elements.map((element) => element.data.key).includes(key)
}
const getActiveKey = (elements, activeKey) => {
const defaultActiveKey = getDefaultActiveKey(elements)
return !activeKey ? defaultActiveKey : !activeKeyIsValid(elements, activeKey) ? defaultActiveKey : activeKey
}
baseComponent({
relations: {
'../tab/index': {
type: 'child',
observer() {
this.debounce(this.updated)
},
},
},
properties: {
prefixCls: {
type: String,
value: 'wux-tabs',
},
defaultCurrent: {
type: String,
value: '',
},
current: {
type: String,
value: '',
observer(newVal) {
if (this.data.controlled) {
this.updated(newVal)
}
},
},
scroll: {
type: Boolean,
value: false,
},
controlled: {
type: Boolean,
value: false,
},
theme: {
type: String,
value: 'balanced',
},
direction: {
type: String,
value: 'horizontal',
},
},
data: {
activeKey: '',
keys: [],
},
computed: {
classes: ['prefixCls, direction, scroll', function(prefixCls, direction, scroll) {
const wrap = classNames(prefixCls, {
[`${prefixCls}--${direction}`]: direction,
[`${prefixCls}--scroll`]: scroll,
})
return {
wrap,
}
}],
},
methods: {
updated(value = this.data.activeKey) {
const elements = this.getRelationNodes('../tab/index')
const activeKey = getActiveKey(elements, value)
if (this.data.activeKey !== activeKey) {
this.setData({ activeKey })
}
this.changeCurrent(activeKey, elements)
},
changeCurrent(activeKey, elements) {
const { scroll, theme, direction } = this.data
if (elements.length > 0) {
elements.forEach((element) => {
element.changeCurrent({
current: element.data.key === activeKey,
scroll,
theme,
direction,
})
})
}
if (this.data.keys.length !== elements.length) {
this.setData({
keys: elements.map((element) => element.data),
})
}
},
emitEvent(key) {
this.triggerEvent('change', {
key,
keys: this.data.keys,
})
},
setActiveKey(activeKey) {
if (!this.data.controlled) {
this.updated(activeKey)
}
this.emitEvent(activeKey)
},
},
ready() {
const { defaultCurrent, current, controlled } = this.data
const activeKey = controlled ? current : defaultCurrent
this.updated(activeKey)
},
})