7021f2fd创建于 2025年5月14日历史提交
<template>
  <view class="quickNav-container">
    <uni-section :title="cardOption.title" type="line" padding>
      <uni-grid :column="3" :square="false" :highlight="false">
        <template v-for="item in dataSource" :key="item">
          <uni-grid-item :class="cardClass">
            <view class="card-div">
              <view class="card-icon">
                <img :src="item.icon" :style="getImgStyle" v-if="item.icon?.indexOf('http') > -1 || item.icon?.indexOf('data:image') > -1" />
              </view>
              <text>{{ item.title }}</text>
            </view>
          </uni-grid-item>
        </template>
      </uni-grid>
    </uni-section>
  </view>
</template>

<script lang="ts" name="JQuickNav" setup>
import { computed, onMounted } from 'vue';
import useChartHook from "@/pages-work/components/hooks/useEchart";
import UniSection from '@/uni_modules/uni-section/components/uni-section/uni-section.vue'
import UniGrid from '@/uni_modules/uni-grid/components/uni-grid/uni-grid.vue'
import UniGridItem from '@/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue'

const props = defineProps({
  size: {
    type: Object,
    default: () => {},
  },
  textAlign: {
    type: String,
    default: 'center',
  },
  iconAlign: {
    type: String,
    default: 'top',
  },
  column: {
    type: Number,
    default: 4,
  },
  fontSize: {
    type: Number,
    default: 20,
  },
  scriptUrl: {
    type: String,
    default: '//at.alicdn.com/t/font_3237315_b3fqd960glt.js',
  },
  isView: {
    type: Boolean,
    default: false,
  },
  i: {
    type: String,
    default: ''
  },
  config: {
    type: Object,
    default: () => ({}),
  },
});
//定义事件
const emit = defineEmits(['compRouter']);
//card配置
const cardOption = props.config?.option?.card || {};
//初始化配置
let [{ dataSource, reload, pageTips, config }, { queryData }] = useChartHook(props, initOption);
/**
 * icon样式
 */
const getIconStyle = computed(() => {
  let fontSize = config.option.icon?.fontSize || props.fontSize;
  return {
    lineHeight: 'normal',
    fontSize: `${fontSize}px`,
  };
});

/**
 * 图标样式
 */
const getImgStyle = computed(() => {
  let fontSize = config.option.icon?.fontSize || props.fontSize;
  return {
    width: `${fontSize}px`,
    marginLeft: '-20px',
    height: `${fontSize}px`,
  };
});

//计算图标位置 top或者left
const cardClass = computed(() => {
  let textAlign = config.option.body?.textAlign || props.textAlign;
  let iconAlign = config.option.body?.iconAlign || props.iconAlign;
  let cls = ['card-' + textAlign];
  if (iconAlign === 'top') {
    cls.push('card-icon-top');
  } else {
    cls.push('card-icon-left');
  }
  return cls;
});

function initOption(){

}

onMounted(() => {
  queryData(config);
});
</script>

<style scoped lang="scss">
.card-icon-top {
  &.card-center .card-div {
    width: 100px;
    min-height: 80px;
    margin: 0 auto;
    display: flex;
    justify-content: center;
    align-items: center;
    text-align: center;

    .card-icon {
      text-align: center;
    }
  }

  &.card-left {
    text-align: left;
  }

  &.card-right {
    text-align: right;
  }
}

.card-icon-left {
  .card-icon {
    display: inline-block;
    margin-right: 4px;
    vertical-align: middle;
  }

  &.card-center .card-div {
    width: 100px;
    margin: 0 auto;
  }

  &.card-left {
    text-align: left;
  }

  &.card-right {
    text-align: right;
  }
}
.ant-card{
  background: transparent;
}
</style>