82 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Vue
		
	
	
<template>
 | 
						|
  <uni-grid :showBorder="Boolean(data.border)" :column="data.col">
 | 
						|
    <uni-grid-item
 | 
						|
      v-for="(item, index) in data.list"
 | 
						|
      :key="index"
 | 
						|
      @tap="sheep.$router.go(item.url)"
 | 
						|
    >
 | 
						|
      <view class="grid-item-box ss-flex ss-flex-col ss-row-center ss-col-center">
 | 
						|
        <view class="img-box">
 | 
						|
          <view
 | 
						|
            class="tag-box"
 | 
						|
            v-if="item.badge.show"
 | 
						|
            :style="[{ background: item.badge.bgColor, color: item.badge.color }]"
 | 
						|
          >
 | 
						|
            {{ item.badge.text }}
 | 
						|
          </view>
 | 
						|
          <image class="menu-image" :src="sheep.$url.cdn(item.src)"></image>
 | 
						|
        </view>
 | 
						|
 | 
						|
        <view class="title-box ss-flex ss-flex-col ss-row-center ss-col-center">
 | 
						|
          <view class="grid-text" :style="[{ color: item.title.color }]">
 | 
						|
            {{ item.title.text }}
 | 
						|
          </view>
 | 
						|
          <view class="grid-tip" :style="[{ color: item.tip.color }]">
 | 
						|
            {{ item.tip.text }}
 | 
						|
          </view>
 | 
						|
        </view>
 | 
						|
      </view>
 | 
						|
    </uni-grid-item>
 | 
						|
  </uni-grid>
 | 
						|
</template>
 | 
						|
 | 
						|
<script setup>
 | 
						|
  import sheep from '@/sheep';
 | 
						|
 | 
						|
  const props = defineProps({
 | 
						|
    data: {
 | 
						|
      type: Object,
 | 
						|
      default() {},
 | 
						|
    },
 | 
						|
  });
 | 
						|
</script>
 | 
						|
 | 
						|
<style lang="scss" scoped>
 | 
						|
  .menu-image {
 | 
						|
    width: 24px;
 | 
						|
    height: 24px;
 | 
						|
  }
 | 
						|
  .grid-item-box {
 | 
						|
    flex: 1;
 | 
						|
    display: flex;
 | 
						|
    flex-direction: column;
 | 
						|
    align-items: center;
 | 
						|
    justify-content: center;
 | 
						|
    height: 100%;
 | 
						|
    .img-box {
 | 
						|
      position: relative;
 | 
						|
      .tag-box {
 | 
						|
        position: absolute;
 | 
						|
        z-index: 2;
 | 
						|
        top: 0;
 | 
						|
        right: 0;
 | 
						|
        font-size: 2em;
 | 
						|
        line-height: 1;
 | 
						|
        padding: 0.4em 0.6em 0.3em;
 | 
						|
        transform: scale(0.4) translateX(0.5em) translatey(-0.6em);
 | 
						|
        transform-origin: 100% 0;
 | 
						|
        border-radius: 200rpx;
 | 
						|
        white-space: nowrap;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    .title-box {
 | 
						|
      .grid-tip {
 | 
						|
        font-size: 24rpx;
 | 
						|
        white-space: nowrap;
 | 
						|
        text-align: center;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
</style>
 |