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

Vue3 通过JSON渲染el-table-column生成完整el-table

功能实现背景

通过Vue3实现后台管理项目一定含有表格功能,基于简单的字段渲染有时候想通过JSON配置来提高开发效率

注意:
1.项目依赖element-plus

使用规则

  1. ColumnRenderPropkey用于:v-for需要的唯一标识
  2. ColumnRenderPropprops用于:继承 el-table-column 所有属性 & 自定义属性
  3. ColumnRenderProptype用于:常在项目中出现且需要转换的字段如时间、钱等等,可自行追加
  4. ColumnRenderPropComponent用于:自定义组件
  5. ColumnRenderProprender用于:自定义渲染函数
  6. columns中优先级排序 component < render < type < props

项目代码

  1. 创建type/index.ts文件
export interface ColumnRenderProp {key?: string // 遍历使用keyprops?: Record<string, any> // 继承 el-table-column 所有属性 & 自定义属性type?: 'date'	// 常用格式的 el-table-columncomponent?: Component // 自定义组件render?: Function // 渲染函数
}
  1. 创建ColumnRender.vue文件
<template><!-- key渲染优先级: column.key > column.props.prop > index--><template v-for="(column, index) in columns" :key="column.key || column.props?.prop || index"><!-- 优先:component --><component v-if="column.component" :is="column.component" v-bind="column.props" /><!-- 其次:render --><el-table-column v-else-if="column.render" v-bind="column.props"><template v-slot="props"><component :is="column.render(props)" /></template></el-table-column><!-- 日期 --><el-table-column v-else-if="column.type === 'date'" v-bind="column.props"><template v-slot="{ row }: { row: any }"><div>{{ parseTime(row[column.props?.prop]) || EMPTYDESC }}</div></template></el-table-column><el-table-column v-else v-bind="column.props" /></template>
</template><script setup lang="ts">
import type { ColumnRenderProp } from '@/types/index.ts'defineOptions({name: 'IPSColumnRender'
})defineProps<{columns: ColumnRenderProp[]
}>()// 时间格式化 => 需自己实现
function parseTime(val: number) {return val
}
</script>
  1. 创建ColumnState.vue文件 => 自定义组件
<template><el-table-column v-bind="$attrs"><template v-slot="{ row }"><div class="el-primary">{{ row.state }}</div></template></el-table-column>
</template>
  1. 创建ColumnHandle.vue文件 => 自定义组件
<template><el-button type="primary" @click="handleDetail">{{ deleteVal }}</el-button>
</template>
<script setup lang="ts">
const props = defineProps<{deleteVal: string,row: any
}>()
const emit = defineEmits<{(e: 'detail', value: any): void
}>()function handleDetail() {console.log('handleDetail', props.row)emit('detail', 123)
}
</script>
  1. 实现代码
<template><el-table :data="tableData" style="width: 100%"><ColumnRender :columns="columns" /></el-table>
</template><script setup lang="ts">
import ColumnRender from './ColumnRender.vue'
import ColumnState from './ColumnState.vue'
import ColumnHandle from './ColumnHandle.vue'import { computed, h } from 'vue'const tableData = [{name: '张三',state: '已完成',date: '2019-05-03',address: 'No. 189, Grove St, Los Angeles',},{name: '王五',state: '已下单',date: '2019-05-03',address: 'No. 189, Grove St, Los Angeles',}
]// 如果里面数据不会发生改变,可以移除 computed
const columns = computed(() => [{// 普通渲染模式props: {label: '姓名',prop: 'name',width: '180'}},{// 组件渲染模式key: 'state',props: {label: '状态',width: '180'// 此处可以接收组件自定义事件,也可以给组件传递props},component: ColumnState},{// 自定义渲染模式 => 可接收内部事件key: 'handle',props: {label: '操作',width: '180'},render({ row }: { row: any }) {return h(ColumnHandle, {row: row,deleteVal: '详情1',onDetail(val: any) {console.log(val, row.name, '22==')}})}}
])
</script>

文章转载自:

http://vRaeNobB.ntLxg.cn
http://KGTMJ4oA.ntLxg.cn
http://vFGUPnW3.ntLxg.cn
http://HxmNpBK1.ntLxg.cn
http://t2TbV1sg.ntLxg.cn
http://x6bYxoTt.ntLxg.cn
http://rh3dH2bP.ntLxg.cn
http://w3SAabxF.ntLxg.cn
http://dR5PHKc5.ntLxg.cn
http://LFCR76FQ.ntLxg.cn
http://u8v5myel.ntLxg.cn
http://DI5E1Egg.ntLxg.cn
http://GI6NSkvW.ntLxg.cn
http://4ZeNaATp.ntLxg.cn
http://wVI9KqLd.ntLxg.cn
http://h2X0aWtF.ntLxg.cn
http://GVyFrIdO.ntLxg.cn
http://JVZayeEa.ntLxg.cn
http://eGT1GApY.ntLxg.cn
http://xO3fZnkm.ntLxg.cn
http://YRWZkkZJ.ntLxg.cn
http://dQFqOGJ1.ntLxg.cn
http://zgCOfKUM.ntLxg.cn
http://dsJrdn1R.ntLxg.cn
http://lMyUmpPT.ntLxg.cn
http://67Px2sVM.ntLxg.cn
http://HLwZGZAx.ntLxg.cn
http://OR6Cbzv2.ntLxg.cn
http://qtXG90eg.ntLxg.cn
http://vvv9eJrS.ntLxg.cn
http://www.dtcms.com/a/386109.html

相关文章:

  • 传输层协议——TCP协议
  • ChromaDB探索
  • 无人设备遥控器之帧同步技术篇
  • redis如何搭建哨兵集群(docker,不同机器部署的redis和哨兵)
  • C#之开放泛型和闭合泛型
  • typescript+vue+node项目打包部署
  • Python/JS/Go/Java同步学习(第十五篇)四语言“字符串去重“对照表: 财务“小南“纸式去重术处理凭证内容崩溃(附源码/截图/参数表/避坑指南)
  • 数据库基础知识入门:从概念到架构的全面解析
  • 负载均衡器和CDN层面保护敏感文件:防止直接访问.git等敏感目录
  • 微算法科技(NASDAQ: MLGO)研究隐私计算区块链框架,赋能敏感数据流通
  • 分析并预测糖尿病患者 R
  • 【Cesium 开发实战教程】第四篇:动态数据可视化:实时 GPS 轨迹与时间轴控制
  • 大数据毕业设计选题推荐-基于大数据的快手平台用户活跃度分析系统-Spark-Hadoop-Bigdata
  • HTML打包EXE工具中的WebView2内核更新指南
  • 固定资产管理软件是什么?哪家好?对比分析10款产品
  • gdb-dashboard使用
  • 【脑电分析系列】第13篇:脑电源定位:从头皮到大脑深处,EEG源定位的原理、算法与可视化
  • 【51单片机】【protues仿真】基于51单片机SHT11温湿度系统
  • 【Vue3 ✨】Vue3 入门之旅 · 第二篇:安装与配置开发环境
  • 【30】C# WinForm入门到精通 ——字体控件FontDialog 【属性、方法、事件、实例、源码】
  • 使用Nginx+uWSGI部署Django项目
  • 芯伯乐低噪声轨到轨运放芯片XAD8605/8606/8608系列,11MHz带宽高精度信号调理
  • FPGA硬件设计6 ZYNQ外围-HDMI、PCIE、SFP、SATA、FMC
  • FPGA硬件设计5 ZYNQ外围-USB、SD、EMMC、FLASH、JTAG
  • 知识图谱中:基于神经网络的知识推理解析~
  • 深度学习面试题:请介绍梯度优化的各种算法
  • python资源释放问题
  • ATR网格---ATR计算原理研究运用
  • 用Postman实现自动化接口测试
  • Hyper Rust HTTP 库入门教程