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