AIoT前端公共UI

CardInfo.vue 4.9KB

    <template> <!-- 卡片信息列表 --> <ul v-if="cardInfos && cardInfos.length" class="__card-infos"> <li v-for="info in cardInfos" :key="info['label']" class="__card-info-item"> <span>{{ info['label'] }}:</span> <span class="__card-info-content"> {{ cardInfo.infos[info['name']] }} </span> </li> </ul> <!-- 描述信息 --> <div class="__card-desc text-line-3">{{ cardInfo.desc }}</div> <!-- 卡片数据列表 --> <div v-if="cardNumbers?.length" class="__card-numbers"> <el-row :gutter="10"> <el-col v-for="(info, index) in cardNumbers" :key="index" :span="24 / cardNumbers.length" > <div class="__common-card-info"> <common-icon v-if="info?.['icon']" class="__card-icon" :name="info?.['icon'] || ''" :color="info?.['color'] || ''" ></common-icon> <span class="__info-text">{{ info['label'] || '-' }}</span> </div> <div class="__card-number"> {{ cardInfo?.[info?.['name']] || '-' }} </div> </el-col> </el-row> </div> <!-- 卡片按键列表 --> <div v-if="btns && btns.length" class="__card-btns"> <el-row v-if="btns.length <= 3" :gutter="10"> <el-col v-for="(btn, index) in btns" :key="index" class="__card-btn" :span="24 / btns.length" > <div class="__common-card-btn" @click.stop="btn['onClick'](cardInfo)"> <common-icon v-if="btn?.['icon']" class="__card-icon" :name="btn?.['icon'] || ''" :color="btn?.['color'] || ''" ></common-icon> <span>{{ btn['label'] }}</span> </div> </el-col> </el-row> <!-- 按钮 --> <el-row v-else :gutter="10"> <el-col v-for="btn in btns.slice(0, 2)" :key="btn.name" :span="8"> <div class="__common-card-btn" @click.stop="btn['onClick'](cardInfo)"> <common-icon v-if="btn?.['icon']" class="__card-icon" :name="btn?.['icon'] || ''" :color="btn?.['color'] || ''" ></common-icon> <span>{{ btn['label'] }}</span> </div> </el-col> <el-col :span="8" @click.stop="clickCommond"> <el-dropdown trigger="hover" @command="handleCommand"> <div class="__common-card-btn"> <common-icon class="__card-icon" name="common-gengduo" :size="16" ></common-icon> <span style="color: #7b93a7">更多</span> </div> <template #dropdown> <el-dropdown-menu> <template v-for="btn in btns.slice(2)" :key="btn.name"> <el-dropdown-item :command="btn.name"> {{ btn.label }} </el-dropdown-item> </template> </el-dropdown-menu> </template> </el-dropdown> </el-col> </el-row> </div> </template> <script setup lang="ts"> // const emits = defineEmits(['handleCommand']); const props = defineProps({ infos: { type: Array<any>, default: () => [] }, btns: { type: Array<any>, default: () => [] }, cardInfo: { type: Object, default: () => {} }, cardInfos: { type: Array<any>, default: () => [] }, cardNumbers: { type: Array<any>, default: () => [] } }); function clickCommond() {} // commond选择 function handleCommand(commond: any) { props.btns.forEach((item) => { if (item.name === commond) { item.onClick(props.cardInfo); } }); // emits('handleCommand', { commond, card: props.cardInfo }); } </script> <style scoped lang="scss"> .__card-infos { margin-top: 16px; color: #455a74; font-size: 12px; .__card-info-item { line-height: 16px; margin-bottom: 8px; } .__card-info-content { color: #2d3e53; } } .__card-desc { line-height: 16px; font-size: 12px; color: #455a74; margin-bottom: 16px; } .__card-numbers { color: #7b93a7; text-align: center; margin-top: 16px; .__card-number { margin-top: 8px; color: #2d3e53; font-size: 14px; } } .__card-btns { color: #7b93a7; text-align: center; margin-top: 16px; .__card-btn { position: relative; &:not(:last-child):after { content: ''; position: absolute; top: 0px; right: 1px; height: 16px; width: 1px; background-color: #ebebeb; } } .__common-card-info { height: 20px; display: flex; align-items: center; justify-content: center; color: #7b93a7; cursor: pointer; .__card-icon { margin-right: 17px; } } } .__common-card-btn { height: 20px; display: flex; align-items: center; justify-content: center; color: #7b93a7; cursor: pointer; .__card-icon { margin-right: 17px; } } .__info-text { text-align: center; } </style>