AIoT前端公共UI

CommonInfo.vue 3.8KB

    <!-- * @Author: Devin * @Date: 2023-01-12 14:49:40 * @LastEditors: Devin * @LastEditTime: 2023-02-22 14:51:02 * @Description: --> <template> <el-descriptions class="__common-description"> <!-- custom title --> <template #title> <div class="__common-desc-title"> <img v-if="url && url.length" class="__common-desc-img" :src="url" alt="" /> <h5 v-if="title && !hasEdit" class="__common-title">{{ title }}</h5> <!-- edit title --> <el-input v-if="hasEdit" v-model="newTitle" size="small"></el-input> <common-icon v-if="hasIcon && !hasEdit" :name="editIcon" :size="18" @click.stop="() => (hasEdit = true)" ></common-icon> <common-icon v-if="hasEdit" name="common-guanbi" :size="24" @click.stop="() => (hasEdit = false)" ></common-icon> <common-icon v-if="hasEdit" :name="saveIcon" :size="24" @click.stop="editTitle" ></common-icon> </div> </template> <!-- custom extra --> <template #extra> <el-button v-for="(extra, index) in extras" :key="index" size="small" :type="extra['type'] || 'primary'" @click.stop="extra['onClick']" > {{ extra['label'] }} </el-button> </template> <!-- description list --> <el-descriptions-item v-for="(desc, index) in descriptions" :key="index" :label="`${desc?.['label']}:`" @mouseover="descMouseEnter(index)" @mouseout="descMouseLeave" > <span class="__common-description-label"> <span class="__common-label">{{ descData?.[desc?.['name']] }}</span> <common-icon v-if="desc['delete'] && activeIdx === index" name="common-yuanxingguanbi" :size="16" ></common-icon> </span> </el-descriptions-item> </el-descriptions> </template> <script setup lang="ts"> import { ref } from 'vue'; const props = defineProps({ // 描述信息头部btn集合 extras: { type: Array<any>, default: () => [] }, // 描述标题 title: { type: String, default: () => '' }, // 描述信息label集合 descriptions: { type: Array<any>, default: () => [] }, editIcon: { type: String, default: () => 'common-bianji' }, saveIcon: { type: String, default: () => 'tool-baocun' }, url: { // 标题图片 type: String, default: () => '' }, descData: { // 描述信息数据对象 type: Object, default: () => {} }, hasIcon: { // 是否有标题编辑icon type: Boolean, default: () => true } }); // 编辑title const newTitle = ref<any>(props.title); const hasEdit = ref<any>(false); const emits = defineEmits(['editTitle']); // 编辑标题 function editTitle() { hasEdit.value = false; emits('editTitle', true); } const activeIdx = ref<any>(-1); // 鼠标移入 function descMouseEnter(idx: any) { activeIdx.value = idx; } // 鼠标移出 function descMouseLeave() { activeIdx.value = -1; } </script> <script lang="ts"> export default { name: 'CommonInfo' }; </script> <style scoped lang="scss"> .__common-description { background: #fff; padding: 10px 16px; .__common-desc-title { display: flex; align-items: center; .__common-desc-img { width: 24px; height: 24px; margin-right: 16px; } .__common-title { margin-right: 10px; color: #2d3e53; font-size: 20px; font-weight: 500; } } .__common-description-label { line-height: 22px; color: #2d3e53; .__common-label { margin-right: 10px; } .__common-icon { display: inline-block; padding-top: 3px; } } } :deep(.el-descriptions__label) { color: #455a74; } </style>