89 lines
1.4 KiB
Vue
89 lines
1.4 KiB
Vue
<template>
|
|
<view :class="{ active, inactive: !active, tab: true }" :style="shouldShow ? '' : 'display: none;'">
|
|
<slot v-if="shouldRender"></slot>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
props: {
|
|
dot: {
|
|
type: Boolean,
|
|
},
|
|
name: {
|
|
type: [Number, String],
|
|
value: ''
|
|
}
|
|
},
|
|
inject: ['tabs'],
|
|
|
|
data() {
|
|
return {
|
|
active: false,
|
|
shouldShow: false,
|
|
shouldRender: false
|
|
}
|
|
},
|
|
created() {
|
|
this.tabs.childrens.push(this)
|
|
},
|
|
mounted() {
|
|
this.update()
|
|
},
|
|
methods: {
|
|
getComputedName: function() {
|
|
if (this.data.name !== '') {
|
|
return this.data.name;
|
|
}
|
|
|
|
return this.index;
|
|
},
|
|
updateRender: function(active, parent) {
|
|
|
|
let parentData = parent;
|
|
this.inited = this.inited || active;
|
|
this.active = active
|
|
this.shouldRender = this.inited
|
|
this.shouldShow = active
|
|
|
|
},
|
|
update: function() {
|
|
if (this.tabs) {
|
|
this.tabs.updateTabs();
|
|
}
|
|
}
|
|
},
|
|
computed: {
|
|
changeData() {
|
|
const {
|
|
dot,
|
|
info,
|
|
} = this
|
|
return {
|
|
dot,
|
|
info,
|
|
}
|
|
}
|
|
},
|
|
watch: {
|
|
changeData(value) {
|
|
this.update()
|
|
},
|
|
name(val) {
|
|
this.update()
|
|
}
|
|
},
|
|
}
|
|
</script>
|
|
|
|
<style>
|
|
.tab.active {
|
|
height: auto;
|
|
}
|
|
|
|
.tab.inactive {
|
|
height: 0;
|
|
overflow: visible;
|
|
}
|
|
</style>
|