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

news2024/10/7 16:26:49

目录

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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1017542.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十四、流式编程(2)

本章概要 中间操作 跟踪和调试流元素排序移除元素应用函数到元素在 map() 中组合流 中间操作 中间操作用于从一个流中获取对象&#xff0c;并将对象作为另一个流从后端输出&#xff0c;以连接到其他操作。 跟踪和调试 peek() 操作的目的是帮助调试。它允许你无修改地查看…

CMU 15-445 Project #3 - Query Execution(Task #1、Task #2)

文章目录 一、题目链接二、准备工作三、SQL 语句执行流程四、BusTub 表结构五、Task #1 - Access Method Executors5.1 顺序扫描执行器5.2 插入执行器5.3 删除执行器5.4 索引扫描执行器 六、Task #2 - Aggregation & Join Executors6.1 聚合执行器6.2 循环连接执行器6.3 索…

设计模式Java实战

文章目录 一、前置1.1 目的1.2 面向对象1.3 接口和抽象类 二、七大设计原则2.1 单一职责2.2 接口隔离原则2.3 依赖倒转原则2.4 里氏替换原则2.5 开闭原则2.6 不要重复原则2.7 迪米特最少知道法则 三、23种设计模式3.1创建型&#xff1a;创建对象3.1.1 单例模式定义最佳实践场景…

【基础篇】ClickHouse 表引擎之集成Kafka

文章目录 0.前言1.集成示例官方教程示例1&#xff1a;示例2&#xff1a;配置Kerberos 支持 虚拟列 参考文档 0.前言 ClickHouse为了方便与Kafka集成&#xff0c;提供了一个名为Kafka引擎的专用表引擎。Kafka引擎允许你在ClickHouse中创建一个表&#xff0c;这个表的数据源来自…

react的状态管理简单钩子方法

1.recoil useProvider文件: import { atom, useRecoilState } from recoil;const initState atom({key: initState,default: {state: [],}, })// 将业务逻辑拆分到一个单独文件中&#xff0c;方便进行状态管理 export interface StateProps {id: number;text: string;isFini…

学习Node js:raw-body模块源码解析

raw-body是什么 raw-body的主要功能是处理HTTP请求体的原始数据。它提供了以下核心功能&#xff1a; 解析请求体&#xff1a;可以从HTTP请求中提取原始数据&#xff0c;包括文本和二进制数据。配置选项&#xff1a;通过配置项&#xff0c;可以设置请求体的大小限制、编码方式…

主题教育活动知识竞赛小程序界面分享

主题教育活动知识竞赛小程序界面分享

Git - Git 工作流程

文章目录 Git WorkFlow图解小结 Git WorkFlow Git Flow是一种基于Git的工作流程&#xff0c;确实利用了Git作为分布式版本控制系统的优势。 本地代码库 (Local Repository): 每个开发者都维护自己的本地代码库&#xff0c;这是Git分布式性质的体现。本地代码库包含了完整的项目…

清华发力了,EUV光刻机技术取得重大突破,外媒:没想到如此快

日前媒体纷纷传言清华研发成功EUV光刻机&#xff0c;这个其实夸大了事实&#xff0c;不过却也确实是EUV光刻机的重大突破&#xff0c;将绕开ASML等西方垄断的EUV光刻技术路线&#xff0c;开辟一条全新的道路。 据了解清华研发成功的并非是EUV光刻机&#xff0c;而是可用于EUV光…

输入M*N阶矩阵A和B,用函数编程计算并输出A与B之和

#include<stdio.h> #define M 2 #define N 3 void scanfjuzhen(int arr[M][N])//向二维数组输入数据 {int i 0;int j 0;for (i 0; i < M; i){for (j 0; j < N; j)scanf("%d", &arr[i][j]);} } void sumjuzhen(int a[M][N], int b[M][N],int c[M]…

性能测试 —— Jmeter 常用三种定时器

1、同步定时器 位置&#xff1a;HTTP请求->定时器->Synchronizing Timer 当需要进行大量用户的并发测试时&#xff0c;为了让用户能真正的同时执行&#xff0c;添加同步定时器&#xff0c;用户阻塞线程&#xff0c;知道线程数达到预先配置的数值&#xff0c;才开始执行…

Rust踩雷笔记(7)——一个链表题例子初识裸指针

题目在这https://leetcode.cn/problems/palindrome-linked-list/&#xff0c;leetcode 234的回文链表&#xff0c;思路很简单&#xff0c;就是fast和slow两个指针&#xff0c;fast一次移动两个、slow一次一个&#xff0c;最后slow指向的链表反转后和head比较就行了。 很简单一…

趣解设计模式之《新娘到底叫啥名啊?》

〇、小故事 前一段时间&#xff0c;在网上流传了这么一段视频&#xff0c;视频是一对新人的婚礼现场&#xff0c;主持人让新郎当着众多亲戚朋友的面&#xff0c;大声对新娘表达自己的爱意&#xff0c;小伙子自信满满大声的对众人说&#xff1a;“我爱你&#xff0c;周秀楠&…

ddns有什么作用?无公网IP怎么将内网IP端口映射外网访问

DDNS是什么&#xff1f; DDNS英文全称Dynamic Domain Name Server&#xff0c;中文含义是指动态域名服务。很多普通路由器或者智能路由器设置中&#xff0c;都可以找到DDNS&#xff08;动态DNS&#xff09;功能。 上面的解释可能过于专业&#xff0c;其实DDNS通俗点说&#xf…

Alpaca构建方式探秘:低成本构造指令数据增强LLM

原博客地址&#xff1a;Alpaca: A Strong, Replicable Instruction-Following Model github地址&#xff1a;https://github.com/tatsu-lab/stanford_alpaca Alpaca简介 Alpaca是斯坦福大学在Meta开源的大模型LLaMA 7B基础上使用自构建的52K指令数据重新训练得到的增强模型&am…

Android Studioc打印+查看日志

目录 Logcat 写入日志 查看应用日志 Logcat 写入日志 错误&#xff1a;Log.e(String, String)警告&#xff1a;Log.w(String, String)信息&#xff1a;Log.i(String, String)调试&#xff1a;Log.d(String, String)详细程度&#xff1a;Log.v(String, String) 查看应用日志 …

IT老齐的Redis 6实战课

NoSQL与Redis6新特性 什么是Redis REDIS一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库&#xff0c;并提供多种语言的 APIRedis的读写性能非常好,官方压测数据为 Redis能读的速度是110000次/s,写的…

【MySQL系列】MySQL的用户管理

「前言」文章内容大致是MySQL的用户管理。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、用户管理1.1 用户信息1.2 创建新用户1.3 删除用户1.4 修改用户密码 二、数据库的权限2.1 给用户授权2.2 回收用户权限 一、用户管理 MySQL与Linux类似&#x…

图形学线性代数

最近学图形学&#xff01;学的是GAMES101-现代计算机图形学入门-闫令琪↓会做点笔记 Lecture 03 Transformation_哔哩哔哩_bilibili 点乘 1&#xff09;主要作用是找到两个方向/向量的夹角 2&#xff09;找一个向量投影到另一个向量 作用 叉乘 此处x,y,z都是坐标轴 作用 1&a…

HTML+CSS画一个卡通中秋月饼

HTMLCSS画一个卡通中秋月饼&#x1f96e;&#x1f96e;&#x1f96e; 中秋活动水个文章 整个divcss实现个月饼&#xff0c;给前端初学者一个练手的demo 效果图 思路 HTMl 先来个轮廓画脸上的东西&#xff1a;眼睛、眉毛、腮红、嘴巴眼睛丰富下瞳孔画20个花瓣 CSS 轮廓是要外…