当前位置: 首页 > news >正文

打造你的专属Vue组件:超实用“Descriptions展示组件开发”实战

组件效果

在这里插入图片描述

实现功能

  • 栅格布局组件。根据屏幕尺寸(xs, md, lg),列宽会自动调整。
  • 根据配置的字段显示不显示
  • 动态设置label的宽度,可从当前项item.labelWidth或组件的labelWidth属性获取
  • 利用getData(item)方法用于处理并返回每个配置项对应的数据,支持格式化、过滤等功能

代码片段

<template><el-row :gutter="14" style="width: 100%;" class="desc_contents"><el-colv-for="item in adjustedConfigs":key="item.prop":xs="item.col?.xs || 24":md="item.col?.md || 12":lg="item.col?.lg || 8"v-show="item.show !== false"class="desc_contents-item"><div class="label" :style="{ width: item.labelWidth || labelWidth || '110px' }"><slot :name="`${item.slotName}_label`">{{ item.label }}</slot></div><div class="data"><template #content><slot :name="`${item.slotName}_cont`">{{ getData(item) }}</slot></template><slot :name="`${item.slotName}_cont`">{{ getData(item) }}</slot></div></el-col></el-row>
</template><script setup>
import { computed } from 'vue'
defineOptions({name: 'HDescriptions'
})const props = defineProps({// 数据详情infoData: {type: Object,default: () => {}},// 配置项configs: {type: Array,default: () => []},// label宽度labelWidth: {type: String,default: '110px'}
})// 处理数据并返回
const getData = (item) => {const value = getPropByPath(props.infoData, item.prop).vif(value === null || value === undefined || value === '') return '/'if (item.formatter) return `${item.formatter(props.infoData)} ${item.unit || ''}` || '/'if (item.filters) {return constantEscape(value, item.filters.list || [], item.filters.key || 'value', item.filters.label || 'label_zh')}if (value || value === 0) return `${value} ${item.unit || ''}`return '/'
}
// 处理过滤的数据
const constantEscape = (value, list, key, label) => {if(!list?.length) return valueconst res = list.find((item: any) => {return item[key].toString() === value.toString()})if (res === undefined) return '/'return res && res[label]
}// 使用computed计算adjustedConfigs的生成
const adjustedConfigs = computed(() => {return props.configs.map((config) => {if (typeof config.show === 'function') {return { ...config, show: config.show(props.infoData) };}return config;});
});
</script><style lang="scss" scoped>
.desc_contents {&-item {margin-bottom: 6px;}:deep(.el-col){// padding: 5px 0;display: flex;font-size: 14px;.label {color: #909399;line-height: 140%;width: 86px;margin-right: 14px;flex-shrink: 0;}.data {line-height: 140%;color: #303133;flex: 1;width: 0;white-space: pre-wrap;.file {background: #f7faff;border: 1px solid rgba(28, 108, 249, 0.1);padding: 4px;display: flex;align-items: center;border-radius: 4px;& + .file {margin-top: 12px;}&-name {font-size: 14px;color: #333333;line-height: 20px;margin-bottom: 4px;}&-size {font-size: 12px;color: #999999;line-height: 20px;}&-icon {border: 1px solid #e1ecfe;border-radius: 4px;padding: 11px;margin-right: 10px;}}}}
}
</style>

总结

总之,这个组件提供了高度灵活的数据展示能力,允许用户通过配置来自定义展示哪些数据、如何格式化数据以及在不同屏幕尺寸下的布局,非常适合构建动态数据详情页面。

相关文章:

  • Python知识点20---池
  • C++ 宏定义中的##
  • 【JavaEE】Servlet
  • MFC:初步理解序列化与反序列化(含代码实现)
  • 【机器学习】之 K-最近邻(KNN)算法原理及实现
  • 【JAVA WEB实用与优化技巧】如何使用本地.bat/.sh脚本快速将服务发布到测试环境?
  • NVIDIA发布重磅AI创新,黄仁勋在COMPUTEX大会预示计算未来
  • 面向对象程序设计之从C到C++的初步了解
  • 奶茶店、女装店、餐饮店是高危创业方向,原因如下:
  • 一个知识问答系统,用户的选择决定接下来出现的问题,且下一个问题的呈现取决于前面几个问题的回答
  • 工业4.0利器:MES系统
  • 在一个定义好的数据对象(class)中,后续更新时只更新其中部分数据,其余部分会恢复初始设置吗
  • Amazon云计算AWS(四)
  • typescript --object对象类型
  • 开发和渗透偷懒利器utools
  • centos安装java运行环境jdk+tomcat
  • ES6语法详解(一)
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • IDEA常用插件整理
  • Joomla 2.x, 3.x useful code cheatsheet
  • mongo索引构建
  • php面试题 汇集2
  • Spring Boot快速入门(一):Hello Spring Boot
  • 阿里研究院入选中国企业智库系统影响力榜
  • 猴子数据域名防封接口降低小说被封的风险
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ​学习一下,什么是预包装食品?​
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #宝哥教你#查看jquery绑定的事件函数
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (06)金属布线——为半导体注入生命的连接
  • (152)时序收敛--->(02)时序收敛二
  • (31)对象的克隆
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (亲测有效)推荐2024最新的免费漫画软件app,无广告,聚合全网资源!
  • (三)Honghu Cloud云架构一定时调度平台
  • (译) 函数式 JS #1:简介
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转载)hibernate缓存
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .net core 依赖注入的基本用发
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .net对接阿里云CSB服务
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @selector(..)警告提示