171 lines
3.7 KiB
Vue
171 lines
3.7 KiB
Vue
<template>
|
|
<view>
|
|
<view :id="'tab-' + props.index" class="ui-tab-item" :class="[{ cur: cur }, tpl]">
|
|
<view class="ui-tab-icon" :class="props.data.icon" v-if="props.data.icon"></view>
|
|
<view
|
|
class="ui-tab-text"
|
|
:class="[cur ? 'curColor cur' : 'default-color']"
|
|
:style="[{ color: cur ? titleStyle.activeColor : titleStyle.color }]"
|
|
>
|
|
{{ props.data.title }}
|
|
</view>
|
|
|
|
<view class="ui-tag badge ml-2" v-if="props.data.tag != null">{{ props.data.tag }}</view>
|
|
</view>
|
|
<view
|
|
v-if="tpl === 'subtitle'"
|
|
class="item-subtitle ss-flex ss-col-bottom ss-row-center"
|
|
:style="[{ color: cur ? subtitleStyle.activeColor : subtitleStyle.color }]"
|
|
>
|
|
{{ props.data.subtitle }}
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
export default {
|
|
name: 'UiTabItem',
|
|
};
|
|
</script>
|
|
|
|
<script setup>
|
|
/**
|
|
* 基础组件 - uiTabItem
|
|
*/
|
|
import { computed, onMounted, getCurrentInstance, inject } from 'vue';
|
|
import sheep from '@/sheep';
|
|
const vm = getCurrentInstance();
|
|
|
|
const props = defineProps({
|
|
data: {
|
|
type: [Object, String, Number],
|
|
default() {},
|
|
},
|
|
index: {
|
|
type: Number,
|
|
default: 0,
|
|
},
|
|
});
|
|
|
|
const emits = defineEmits(['up']);
|
|
|
|
onMounted(() => {
|
|
computedQuery();
|
|
uni.onWindowResize((res) => {
|
|
computedQuery();
|
|
});
|
|
});
|
|
|
|
function getParent(name) {
|
|
let parent = vm?.parent;
|
|
// 无父级返回null
|
|
if (parent) {
|
|
let parentName = parent?.type?.name;
|
|
// 父组件name 为真返回父级,为假循环
|
|
while (parentName !== name) {
|
|
parent = parent?.parent;
|
|
// 存在父级循环,不存在打断循环
|
|
if (parent) {
|
|
parentName = parent?.type?.name;
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
return parent;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
const UiTab = getParent('SuTab');
|
|
|
|
// 获取抛出的数据和方法
|
|
let uiTabProvide;
|
|
if (UiTab) {
|
|
uiTabProvide = inject('suTabProvide');
|
|
}
|
|
const cur = computed(() => uiTabProvide?.curValue.value === props.index);
|
|
const tpl = computed(() => uiTabProvide?.props?.tpl);
|
|
const subtitleStyle = computed(() => uiTabProvide?.props?.subtitleStyle);
|
|
const titleStyle = computed(() => uiTabProvide?.props?.titleStyle);
|
|
|
|
const computedQuery = () => {
|
|
uni
|
|
.createSelectorQuery()
|
|
.in(vm)
|
|
.select('#tab-' + props.index)
|
|
.boundingClientRect((data) => {
|
|
if (data != null) {
|
|
// 传递到父组件进行计算
|
|
emits('up', props.index, data);
|
|
} else {
|
|
console.log('tab-item data error');
|
|
}
|
|
})
|
|
.exec();
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.default-color {
|
|
color: $black;
|
|
}
|
|
.ui-tab-item {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
padding: 0 1em;
|
|
min-height: 1.5em;
|
|
line-height: 1.5em;
|
|
position: relative;
|
|
z-index: 1;
|
|
opacity: 0.6;
|
|
transition: opacity 0.3s;
|
|
min-width: 60px;
|
|
|
|
.ui-tab-text {
|
|
width: 100%;
|
|
text-align: center;
|
|
}
|
|
|
|
.ui-tab-icon {
|
|
margin: 0 0.25em;
|
|
font-size: 120%;
|
|
}
|
|
|
|
&.cur {
|
|
opacity: 1;
|
|
font-weight: bold;
|
|
}
|
|
|
|
&.btn {
|
|
.ui-tab-text {
|
|
transform: scale(0.9);
|
|
transition: color 0.3s;
|
|
font-weight: bold;
|
|
}
|
|
}
|
|
|
|
&.subtitle {
|
|
.ui-tab-text {
|
|
transform: scale(0.9);
|
|
transition: color 0.3s;
|
|
font-weight: bold;
|
|
height: calc(100% - 2.6em);
|
|
line-height: calc(100% - 2.6em);
|
|
margin-top: 1.2em;
|
|
color: $white;
|
|
}
|
|
}
|
|
}
|
|
|
|
.item-subtitle {
|
|
height: 2em;
|
|
font-size: 22rpx;
|
|
color: $dark-9;
|
|
margin-bottom: 0.6em;
|
|
}
|
|
|
|
.cur-subtitle {
|
|
color: var(--ui-BG-Main);
|
|
}
|
|
</style>
|