vue+element-ui el-descriptions 详情渲染组件二次封装(Vue项目)

2023-11-17

目录

1、需求

2.想要的效果就是由图一变成图二

​编辑

3.组件集成了以下功能

4.参数配置

示例代码

参数说明 

5,组件 

6.页面使用


1、需求

一般后台管理系统,通常页面都有增删改查;而不外乎就是渲染新增/修改的数据(由输入框变成输入框禁用),因为输入框禁用后颜色透明度会降低,显的颜色偏暗;为解决这个需求于是封装了详情组件

2.想要的效果就是由图一变成图二

3.组件集成了以下功能

操作按钮自定义
字典类型(即后台返回的是数字类型)过滤转成中文
自定义模版 数组类型 对象类型 
渲染图片

4.参数配置

示例代码

    <orderDetail :descList="detailModule" :data="renderData"></orderDetail>

参数说明 

 * [
     * {
     * title:String 分类标题
     * column:Number 每行几个(默认2)
     * size:String 大小 medium / small / mini(默认 medium)
     * border:Boolean边框(默认true)
     * keyArr:[
     * {
     * icon:String,(描述标题的图标)
     * label:String,描述标题
     * keyName:String(对应的翻译值)
     * innerKey:String 数组时对应的翻译值
     * detailType:"image"渲染图片
     * formatter:Function :自定义渲染
     * getTranslation:Function:为对象时处理翻译的值
     * }
     * ]
     * extra:{ '操作按钮'
     * text:String(按钮文案)
     * methods:function(方法回调)
     * }
     * }
     * ]

5,组件 

<template>
  <div class="detail-box demo-image__error cell-44">
    <el-descriptions v-for="(item, index) in descList" :border="item.border || true" :key="'descList' + index"
      class="mb20" :title="item.title || ''" :column="item.column || 2" labelClassName="custom-label"
      contentClassName="custom-content" :size="item.size || 'medium'">
      <template slot="extra" v-if="item.extra">
        <el-button type="primary" size="small" @click="item.extra.methods(item, index)">{{ item.extra.text }}</el-button>
      </template>
      <!-- 描述title -->
      <el-descriptions-item v-for="(descKey, innerIndex) in item.keyArr" :key="innerIndex + 'desc'">
        <template slot="label" v-if="descKey.label">
          <i class="el-icon-user" v-if="item.icon"></i>
          {{ descKey.label }}
        </template>
        <!-- 图片类型数据 -->
        <div class="cell" v-if="descKey.detailType == 'image'">
          <el-image style="width: 44px; height: 44px" :src="data[descKey.keyName]">
            <div slot="error" class="image-slot">
              <i class="el-icon-picture-outline"></i>
            </div>
          </el-image>
        </div>
        <!-- 自定义模版 -->
        <div v-else-if="descKey.formatter" v-html="descKey.formatter(data)"></div>
        <!-- 数组对象、或数组 -->
        <template v-else-if="Array.isArray(data[descKey.keyName])">
          <el-tag v-for="(innerItem, innerI) in data[descKey.keyName]" :key="'tag' + innerI" size="small"
            class="mr10 mb10">
            {{ (descKey.innerKey ? innerItem[descKey.innerKey] : innerItem) || "--" }}
          </el-tag>
        </template>
        <!-- 默认键值对 -->
        <span v-else-if="(data[descKey.keyName] || data[descKey.keyName] === 0) &&
          typeof data[descKey.keyName] !== 'object'
          ">
          {{
            data[descKey.keyName] || data[descKey.keyName] == 0
            ? data[descKey.keyName]
            : "--"
          }}
        </span>
        <!-- 对象类型数据 -->
        <span v-else-if="typeof data[descKey.keyName] === 'object'">
          <el-descriptions :data="data[descKey.keyName]" :border="false">
            <el-descriptions-item v-for="(value, key) in data[descKey.keyName]" :key="key">
              <template slot="label">{{ descKey.getTranslation(key, index) }}</template>
              <span>{{ value }}</span>
            </el-descriptions-item>
          </el-descriptions>
        </span>
        <!-- 没有匹配项目 -->
        <span v-else>--</span>

      </el-descriptions-item>
    </el-descriptions>
  </div>
</template>

<script>
export default {
  props: {
    /**
     * [
     * {
     * title:String 分类标题
     * column:Number 每行几个(默认2)
     * size:String 大小 medium / small / mini(默认 medium)
     * border:Boolean边框(默认true)
     * keyArr:[
     * {
     * icon:String,(描述标题的图标)
     * label:String,描述标题
     * keyName:String(对应的翻译值)
     * innerKey:String 数组时对应的翻译值
     * detailType:"image"渲染图片
     * formatter:Function :自定义渲染
     * getTranslation:Function:为对象时处理翻译的值
     * }
     * ]
     * extra:{ '操作按钮'
     * text:String(文案)
     * methods:function(方法回调)
     * }
     * }
     * ]
     */
    descList: {
      type: Array,
      default: () => {
        return [];
      },
    },
    data: {
      type: Object,
      default: () => {
        return {};
      },
    },
  },
};
</script>

<style lang="scss">
.custom-label,
.custom-content {
  width: 25% !important;
}

.demo-image__error .image-slot,
.demo-image__placeholder .image-slot {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100%;
  background: #f5f7fa;
  color: #909399;
  font-size: 14px;
}

.cell-44 {
  .cell {
    height: 44px;
    line-height: 44px;
  }
}
</style>

6.页面使用

<template>
  <div class="table-page">
    <FormDetail :descList="detailModule" :data="renderData"></FormDetail>
  </div>
</template>
<script>
import FormDetail from "@/components/FormDetail/details.vue";
export default {
  components: {
    FormDetail,
  },
  data() {
    return {
      detailModule: [
        {
          translations: { age: "年龄", name: '姓名' },
          title: "信息",
          keyArr: [
            { label: "账户名称", keyName: "AccountName" },
            { label: "账户id", keyName: "AccountId" },
            { detailType: 'image', label: '头像', keyName: 'image' },
            {
              formatter: (data) => {
                console.log(data, '------');
                return `<span style="white-space: nowrap;color: dodgerblue;">${data.status}</span>`;
              },
              label: '自定义',
            },
            { label: '数组', keyName: 'list', innerKey: 'asList' },
            {
              label: "测试", keyName: "obj",
              getTranslation: (key, index) => {
                return this.detailModule[index].translations[key] || key; // 如果找不到翻译,返回键本身
              }
            }
          ],
          extra: {
            text: 'text',
            methods: (item, index) => {
              console.log(item, index);
            }
          },


        },
      ],
      renderData: {
        AccountId: "1",
        AccountName: "张三",
        image: 'https://cube.elemecdn.com/e/fd/0fc7d20532fdaf769a25683617711png.png',
        status: '开启',
        list: [
          { asList: "5" },
          { status: "5" },
          { asList: "5" },
        ],
        obj: {
          age: 8,
          name: 'zs',
          sex: 'nan',
        }
      },
    }
  },
};
</script>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue+element-ui el-descriptions 详情渲染组件二次封装(Vue项目) 的相关文章

  • 生产中的 Webpack:为什么 React Native 会出现错误?

    我有一个测试应用程序 安装了以下内容 dependencies express 4 14 0 react 15 3 2 react dom 15 3 2 devDependencies babel 6 5 2 babel core 6 18
  • 如何通过 JavaScript for 循环创建 json?

    I have array选择标签
  • 获取单词中重复次数最多的字母的数量

    我正在尝试计算单词中重复次数最多的字母的数量 function GreatestCount str var count for var i 0 i
  • 等待 JavaScript 中 Json 调用完成

    我正在使用下面的json调用在我的 javascript 方法中 function go123 var cityName var temp getJSON https abc in api city callback args functi
  • 将数组中的所有值作为参数传递给函数

    我有一个值数组 a b c d 我需要将它们作为参数传递给函数 window myFunction a b c d 如果我可以将数组 对象传递到函数中 那么这会更容易 但这些函数是由其他人编写的或已经存在 我无法更改它们 它们需要作为单独的
  • Jquery 动画与 CSS 浮动

    我的代码有问题 宽度似乎可以工作 但浮动没有 这里是 这是一个例子 http jsfiddle net v82ck http jsfiddle net v82ck 问题 悬停时菜单上的浮动属性不会改变 我希望每个菜单元素下方的线在悬停该菜单
  • Chart.js 没有显示在我的视图中

    我有一个使用 angular js 运行的应用程序 我的视图之一应该加载图表 我正在使用 Chart js 但由于某种原因它不起作用 并且我的控制台上没有显示错误 这是我创建图表的函数 scope writeBatteryChart fun
  • KineticJS - 将舞台缩放到视口

    我正在努力将默认分辨率设置为 1366x756 我会根据视口来放大和缩小它 类似于此处显示的示例 http blogs msdn com b davrous archive 2012 04 06 modernizing your html5
  • 如何获取调用函数的“this”值?

    如果我有一个这样的函数 function foo this console log this function bar bar prototype func function foo this var test new bar test f
  • HTML5 拖放 - 没有透明度?

    当我将一个元素拖放到页面上时 该元素会变成 幻影 基本上它获得了一些透明度值 有什么办法可以做到吗opacity 1 看来是做不到了 拖动的元素被放入具有自己的不透明度 低于 1 的容器中 这意味着虽然您可以降低拖动元素的不透明度 但您无法
  • 在 NPM 上捆绑并发布客户端 Web 代码

    我制作了一个 JavaScript 文件 假设它的内容是这样的 let myCoolAlert str gt alert str in a different js file SO doesn t allow you to cross fi
  • 日期时间的自定义 JavaScriptConverter?

    我有一个对象 它有一个 DateTime 属性 我想通过 AJAX JSON 将该对象从 ashx 处理程序传递回网页 我不想使用第 3 方控件 当我这样做时 new JavaScriptSerializer Serialize DateT
  • Firefox OS 后台服务

    我想构建一个应用程序 用户可以通过它输入一些设置 并且应用程序将启动后台服务来根据这些设置执行一些任务 我只想在模拟器中运行应用程序和后台服务 我知道它需要 认证 模式才能运行后台服务 但我现在不考虑在 Firefox Marketplac
  • 替换 Javascript 中的引号?

    对于我正在制作的网络应用程序 我将收到文本字符串 其中偶尔包含引号 因为我接下来要 document writing 字符串 所以需要将它们更改为撇号或转义 我该怎么做 因为当我尝试时它似乎不起作用 特别是我认为因为字符串的引号阻止了脚本的
  • Rails - 使链接与 ajax 一起工作

    我有一个链接 应该使用 ajax 加载它旁边的部分内容 而无需重新加载页面 链接在这里 这是链接应该转到的控制器 class ProfilesController lt ApplicationController def profile f
  • JavaScript - 这个这个

    String prototype foo String prototype foo bar function How can you reference the grandparent string console log this par
  • 为什么严格模式下不允许使用八进制数字文字(解决方法是什么?)

    为什么八进制数字文字不允许JavaScript 严格模式 https developer mozilla org en docs Web JavaScript Reference Strict mode 有什么害处呢 use strict
  • 可选链接在 create-react-app 中不起作用

    In a create react app项目 我正在使用 babel plugin proposal optional chaining在我的 babelrc中 但是 我有这个错误 Module parse failed Unexpect
  • 垃圾收集器不适用于 NodeJS / Chrome 中的类型化数组

    我最初将其记录为原项目中的一个问题 https github com nodejs help issues 3590 它立即转移到帮助主题 没有很好的解释 所以现在我想在这里提问 如果我们在 NodeJS v14 v16 v17 中运行以下
  • 将元素添加到 D3 圆包节点

    我正在尝试制作一个可缩放的圆形包装图 我希望每个子圆圈包含一个较小的图表 该图表始终具有相同的结构 即 4 列 只有条形的高度会改变 我尝试添加一个简单的rect到目前为止我的图表 但矩形没有添加到圆圈中并且是静态的 JS var marg

随机推荐

  • pandas报错:columns overlap but no suffix specified

    使用pandas的join连接两张表 例如表1是left 表2是right 这两张表都有共同的字段user name 我就以user name这个字段连接这两张表 left join right how left on user name
  • 2018.09.29 学习笔记 // 前端Javascript // 日期、Math、数组与对象API

    题目 答案见后面 获取2018 09 29格式的日期 获取随机数 要求是长度一直的字符串格式 写一个能遍历对象的数组的通用forEach函数 日期和Math var a Date now 获取当前时间毫秒数 从1970年到现在走了多少毫秒
  • 使用Matlab实现基于计算机视觉的DIP芯片缺陷检测系统附带GUI界面

    使用Matlab实现基于计算机视觉的DIP芯片缺陷检测系统附带GUI界面 计算机视觉在工业生产中的应用越来越广泛 其中一项重要的应用是对芯片制造过程中的缺陷进行检测 本文将介绍如何使用Matlab实现一个基于计算机视觉的DIP芯片缺陷检测系
  • pythonnone赋值-【零基础学Python】def语句,参数和None值

    像之前的print input 和len 功能 Python提供了一些类似的内置函数 另外也可以自己编写自定义函数 示例 def hello print Howdy print Howdy print Hello there hello 第
  • 刷脸支付商户流水不断服务商收益不断

    刷脸支付的管道红利 刷脸支付是获利的其实刷脸支付的商业模式本质上也是一种管道收入 通过一家商户的流水得到佣金 十家商户 N家商户 开通刷脸支付的商户越多 佣金就越多 可以赚取的收益也就越多 就正如管道一样 只要商家在营业 那么你的收入就源源
  • 初识数据库-mysql

    初识数据库 不同的数据库 sql语句不一样 总体大致差不多 数据存储的简短回顾 在内存中临时存储数据所需 变量 数组 长度不可变 类型太单一 对象 对象数组 近乎解决了数组类型太单一的问题 集合 解决了数组长度不可变 持久存储数据 I O
  • 应用层协议 --- DNS协议

    DNS Domain Name Service 域名服务 DNS协议基于UDP 使用端口号53 由数字组成的 IP 地址很难记忆 所以我们上网使用网站 IP 地址的别名 域名 实际使用中 域名与 IP 地址是对应的 这种对应关系保存在DNS
  • 【前端面经】JS-如何使用 JavaScript 来判断用户设备类型?

    在 Web 开发中 有时需要针对不同的设备类型进行不同的处理 例如 对于移动设备 我们可能需要采用不同的布局或者交互方式 以提供更好的用户体验 因此 如何判断用户设备类型成为了一个重要的问题 1 使用 navigator userAgent
  • python优雅地爬虫

    申明 仅用作学习用途 不提供任何的商业价值 背景 我需要获得新闻 然后tts 在每天上班的路上可以听一下 具体的方案后期我也会做一次分享 先看我喜欢的万能的老路 获得html内容 gt python的工具库解析 获得元素中的内容 完成 好家
  • 『Newsletter丨第一期』PieCloudDB 新增自动启停、预聚集、试用规则优化、费用中心等多项功能模块...

    第一部分 PieCloudDB 最新动态 PieCloudDB 完成多个产品兼容性认证 PieCloudDB 与多家基础架构软件厂商完成产品兼容性认证 类别包括操作系统 服务器 CPU 云平台 新增 8 家生态伙伴 包括龙蜥 麒麟 中科可控
  • c语言求fibonacci数列前20,求fibonacci数列的前20个数之和

    使用数组求Fibonacci数列的前20项 要求4项一行输出 斐波那契数列通项公式 斐波那契数列指的是这样一个数列 1 1 2 3 5 8 13 21 这个数列从第三项开始 每一项都等于前两项之和 includeintmain inta 2
  • 容斥原理——经典例题(组合数学)

    一 容斥原理 就是人们为了不重复计算重叠部分 想出的一种不重复计算的方法 先来认识一下这两个符号 与 如图 蓝色的圈就是c1c2 红色的圈围起来的就是c1c2 二 例题 组合数学 1 题目 1 1 题目描述 八是个很有趣的数字啊 八 发 八
  • Centos nginx配置文档

    1 安装nginx yum install nginx 2 Nginx常用命令 查看版本 nginx v 启动 nginx c etc nginx nginx conf 重新加载配置 nginx s reload 停止 nginx s st
  • Bat批处理使用ren批量重命名文件,比如批量去掉文件名称的前4位

    从手机下导入一批照片到电脑 照片开头都是以IMG 开头 甚是烦 使用ren可以批量去掉IMG 开头的几个字符 参考如下 去掉文件名称的最前面4位 去掉文件名称的最后5位 去掉的5位包括 jpg这四个后缀 echo off Deep Lee
  • OCR文字检测主要算法

    转载 https www mayi888 com archives 60604 文字检测是文字识别过程中的一个非常重要的环节 文字检测的主要目标是将图片中的文字区域位置检测出来 以便于进行后面的文字识别 只有找到了文本所在区域 才能对其内容
  • 西门子 PLC S7单边通信

    PLC通信 1 组态 编程 1 打开博途软件 创建新项目 命名为 通信 2 添加新设备 命名为A 这里选择的是CPU1211C 版本V4 2 3 CPU属性设置 启用系统存储器字节和时钟存储器字节 4 以太网地址设置 IP地址设为 192
  • 一文说明白SMC继电器的三种模式:迟滞模式,窗口模式,报警模式

    阅读时间5分钟 有不少同学表示 不理解迟滞模式 窗口模式 报警模式 这里花点儿时间说明一下 这三种模式按照难易程度 1 报警模式 这种方式顾名思义 到压力报警 回到正常范围 报警消除 简单易懂 不过 如果我们需要的压力是0 7MPa 那么我
  • Java坑人面试题系列: 变量声明(中级难度)

    作用域规则与变量覆盖面试题 Java Magazine上面有一个专门坑人的面试题系列 https blogs oracle com javamagazine quiz 2 这些问题的设计宗旨 主要是测试面试者对Java语言的了解程度 而不是
  • 华为OD -单词接龙(Python)

    单词接龙 题目描述 单词接龙的规则是 可用于接龙的单词 首字母必须要与前一个单词的尾字母相同 当存在多个首字母相同的单词时 取长度最长的单词 如果长度也相等 则取字典序最小的单词 已经参与接龙的单词不能重复使用 现给定一组全部由小写字母组成
  • vue+element-ui el-descriptions 详情渲染组件二次封装(Vue项目)

    目录 1 需求 2 想要的效果就是由图一变成图二 编辑 3 组件集成了以下功能 4 参数配置 示例代码 参数说明 5 组件 6 页面使用 1 需求 一般后台管理系统 通常页面都有增删改查 而查不外乎就是渲染新增 修改的数据 由输入框变成输入