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.
|
|
<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>
|