vue3 elementUi table自由渲染組件

文章目錄

    • 前言
    • CustomTable
    • 如何使用
    • tableColumn 屬性
    • h函數
      • 創建原生元素
      • 創建組件
      • 動態生成

前言

elementui中的table組件,表格中想要自由地渲染內容,是一種比較麻煩的事情,比如你表格中想要某一列插入一個button按鈕,是不是要用插槽,那下一次某一列插入一個圖片,又得新開一種插槽或者類別。

那么,有沒有什么方法,能夠通過配置,直接配置一個組件的方式,讓表格的那一列直接渲染對應的組件。elementui table中并不提供這樣的配置。所以需要開發人員自己封裝。

CustomTable

在element UI 中Table組件的基礎上,封裝一個可以自定義渲染的table

<template><!-- 表格 --><el-table:data="tableData"v-loading="loading":empty-text="'暫無數據'"v-bind="$attrs"><!-- :border="true" --><template v-for="column in tableColumn" :key="column?.label"><el-table-column v-if="column.cols" v-bind="{ ...column }"><!-- 列名合并,存在cols的情況下 --><template v-for="col in column.cols" :key="column?.label + col?.label"><el-table-column v-bind="{ ...col }"><template #default="scope"><!-- 自定義render --><span v-if="col?.render" :class="col?.class" :style="col?.style ? col.style : {}">{{ col?.render(scope.row[col.prop], scope.row) }}</span><!-- 自定義render component 將當前列的數據和這一整行的數據都傳給component函數 --><div v-else-if="col?.component" v-html="renderVNode(col.component(scope.row[col.prop], scope.row))"> </div><spanv-else:style="col?.style ? col.style : {}":class="col?.class":title="scope.row[col.prop]":data-message="scope.row[col.prop]">{{ scope.row[col.prop] }}</span></template></el-table-column></template></el-table-column><el-table-column v-else v-bind="{ ...column }"><template #default="scope"><!-- 自定義render字符串 當前列的數據和這一整行的數據都傳給render函數--><span v-if="column?.render" :style="column?.style ? column.style : {}" :class="column?.class">{{ column?.render(scope.row[column.prop], scope.row) }}</span><!-- 自定義render component 將當前列的數據和這一整行的數據都傳給component函數 --><div v-else-if="column?.component" v-html="renderVNode(column.component(scope.row[column.prop], scope.row))"></div><spanv-else:style="column?.style ? column.style : {}":class="column?.class":title="scope.row[column.prop]":data-message="scope.row[column.prop]">{{ scope.row[column.prop] }}</span></template></el-table-column></template></el-table>
</template><script lang="ts" setup name="customTable">const props = defineProps({tableData: {type: Array,default: () => [],},tableColumn: {type: Array<any>,default: () => [],},loading: {type: Boolean,default: false,},});const generateRandomString = (length) => {const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';const charactersLength = characters.length;let result = '';for (let i = 0; i < length; i++) {const randomIndex = Math.floor(Math.random() * charactersLength);result += characters.charAt(randomIndex);}return result;};
// 通過renderVNode 接收一個vnode節點來渲染component
const renderVNode = (vnode: VNode) => {const tempDiv = document.createElement('div');const parentDiv = document.createElement('div');const id = generateRandomString(10);parentDiv.appendChild(tempDiv);tempDiv.id = id;// 利用createApp和render將vnode掛載成一個新的appconst Comp = createApp({render: () => vnode,});// 將這個新的vue app 掛載到對應的dom上nextTick(() => {// 但要放置到nextTick里面,以防止dom還沒放置到table的對應位置,就先掛在了Comp.mount('#' + id);});// 返回一個html dom ,利用v-html掛載到table中對應的位置return parentDiv.innerHTML;};
</script >

如何使用

<template><custom-table maxHeight="100vh" :tableColumn="tableColumn" :tableData="tableData" />
</template><script lang="ts" setup name="test">
import componentTest from '../componentTest.vue';
import customTable from '../components/customTable.vue';
const tableColumn = ref([{label: '名稱',prop: 'name',align: 'center',minWidth: 130,fixed: true,component: (value, row) => {return h('div', { onClick: () => handleClick(row?.name) }, [h('span', { style: { fontSize: '14px', display: 'inline-block' } }, value),h('p', { class: 'dealer-scale' }, row?.scale),]);},},{label: '訂單',prop: 'order',component: (value, row) => {return h(componentTest, {title: value})},style: { color: '#C00017' },},{ label: '本年', prop: 'open', style: { color: '#C00017' } },{ label: '費效比', prop: 'efficiency', style: { color: '#038810' },render: (value,rows) => {console.log(value, rows)return value + '%'}},{ label: '處罰', prop: 'punish', style: { color: '#0000aa' } },]);const tableData = ref([// name order open efficiency punish scale{name: 'xxxx有限公司',order: '23455 萬',open: '234 萬瓶',efficiency: '1.3 %',punish: '3 次',scale: '10億以上',},{name: '軟件有限公司',order: '23456 萬',open: '234 萬瓶',efficiency: '1.3 %',punish: '3 次',scale: '5千萬~1億',},]);
</script>

tableColumn 屬性

屬性名類型解釋
stylestring能夠單獨配置某一列的樣式
classstring能夠單獨配置某一列的class名稱
renderfunction接受兩個參數 (value, row) value是當前行當前列的數據,row是當前行的數據 返回的值會渲染在table對應的列中
componentfunction接受兩個參數 (value, row) value是當前行當前列的數據,row是當前行的數據,返回一個vnode,通過vue3自帶的h函數實現
fixedboolean是否讓當且列固定
剩下的屬性查看element ui 中table 的Column配置 https://element.eleme.io/#/zh-CN/component/table#table-column-attributes

h函數

function h(type: string | Component, // 元素/組件類型props?: object | null,    // 屬性/Propschildren?: VNodeChildren  // 子節點(字符串、數組、插槽等)
): VNode

創建原生元素

import { h } from 'vue'// 等價于 <div class="box" id="app">Hello</div>
h('div', { class: 'box', id: 'app' }, 'Hello')// 帶事件
h('button', { onClick: () => console.log('Clicked!') }, 'Click me')

創建組件

import MyComponent from './MyComponent.vue'// 傳遞 props 和插槽
h(MyComponent, { title: 'Demo',onClick: () => {} // 監聽自定義事件
}, {default: () => h('span', '默認插槽'),footer: () => h('div', 'Footer 內容')
})

動態生成

const items = ['A', 'B', 'C']
h('ul', items.map(item => h('li', item))
)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73710.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73710.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73710.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mermaid 子圖 + 拖拽縮放:讓流程圖支持無限細節展示

在技術文檔、項目管理和可視化分析中&#xff0c;流程圖是傳遞復雜邏輯的核心工具。傳統流程圖往往靜態且難以適應細節展示&#xff0c;而 Mermaid 與 svg-pan-zoom 的結合&#xff0c;則為這一痛點提供了完美解決方案。本文將深入解析如何通過 Mermaid 的子圖&#xff08;subg…

前端權限系統

前端權限系統是為了確保用戶只能訪問他們有權限查看的資源而設計的。在現代前端開發中&#xff0c;權限控制不僅僅是簡單的顯示或隱藏元素&#xff0c;還涉及到對路由、組件、數據和操作權限的細致控制。下面是前端權限系統的常見設計方案和實現步驟。 前端權限系統的組成部分 …

Nature | TabPFN:表格基礎模型用于小規模數據分析

表格數據是按行和列組織的電子表格形式&#xff0c;在從生物醫學、粒子物理到經濟學和氣候科學等各個科學領域中無處不在 。基于表格其余列來填充標簽列缺失值的基本預測任務&#xff0c;對于生物醫學風險模型、藥物研發和材料科學等各種應用至關重要。盡管深度學習徹底改變了從…

c++學習系列----003.寫文件

c 寫文件 文章目錄 c 寫文件1?? 使用 ofstream 寫入文本文件2?? 追加模式寫入3?? 寫入二進制文件4?? 使用 fstream 進行讀寫5?? 使用 fprintf()&#xff08;C 方式&#xff09;6?? 使用 write() 低級 I/O 方式推薦方式 C 寫文件的幾種方式主要有以下幾種&#xff1…

C語言及內核開發中的回調機制與設計模式分析

在C語言以及操作系統內核開發中,回調機制是一種至關重要的編程模式。它通過注冊框架和定義回調函數,實現了模塊間的解耦和靈活交互,為系統的擴展性和可維護性提供了有力支持。本文將深入探討這種機制的工作原理、應用場景以及與設計模式的關聯。 一、回調機制的核心概念 (…

淺談StarRocks SQL性能檢查與調優

StarRocks性能受數據建模、查詢設計及資源配置核心影響。分桶鍵選擇直接決定數據分布與Shuffle效率&#xff0c;物化視圖可預計算復雜邏輯。執行計劃需關注分區裁剪、謂詞下推及Join策略&#xff0c;避免全表掃描或數據傾斜。資源層面&#xff0c;需平衡并行度、內存限制與網絡…

stable Diffusion 中的 VAE是什么

在Stable Diffusion中&#xff0c;VAE&#xff08;Variational Autoencoder&#xff0c;變分自編碼器&#xff09;是一個關鍵組件&#xff0c;用于生成高質量的圖像。它通過將輸入圖像編碼到潛在空間&#xff08;latent space&#xff09;&#xff0c;并在該空間中進行操作&…

從零開始 | C語言基礎刷題DAY3

?個人主頁&#xff1a;折枝寄北的博客 目錄 1.打印3的倍數的數2.從大到小輸出3. 打印素數4.打印閏年5.最大公約數 1.打印3的倍數的數 題目&#xff1a; 寫一個代碼打印1-100之間所有3的倍數的數字 代碼&#xff1a; int main(){int i 0;for (i 1; i < 100; i){if (i % …

告別死鎖!Hyperlane:Rust 異步 Web 框架的終極解決方案

告別死鎖&#xff01;Hyperlane&#xff1a;Rust異步Web框架的終極解決方案 &#x1f525; 為什么選擇Hyperlane&#xff1f; Hyperlane是專為Rust開發者打造的高性能異步Web框架&#xff0c;通過革命性的并發控制設計&#xff0c;讓您徹底擺脫多線程編程中的死鎖噩夢。框架內…

CLR中的類型轉換

CLR中的類型轉換 字符串類型轉換容器類型轉換自定義類型相互轉換項目設置CLR(Common Language Runtime,公共語言運行時)是微軟.NET框架的核心組件,是微軟對 CLI 標準的具體實現,負責管理和執行托管代碼,提供跨語言互操作性、內存管理、安全性等關鍵服務CLR的類型轉換機制…

QT5.15.2加載pdf為QGraphicsScene的背景

5.15.2使用pdf 必須要安裝QT源碼&#xff0c;可以看到編譯器lib目錄已經有pdf相關的lib文件&#xff0c;d是debug 1.找到源碼目錄&#xff1a;D:\soft\QT\5.15.2\Src\qtwebengine\include 復制這兩個文件夾到編譯器的包含目錄中:D:\soft\QT\5.15.2\msvc2019_64\include 2.找…

MCP 開放協議

本文翻譯整理自&#xff1a; https://modelcontextprotocol.io/introduction 文章目錄 簡介一、關于 MCP二、為什么選擇MCP&#xff1f;通用架構 三、開始使用1、快速入門2、示例 四、教程五、探索 MCP六、貢獻和支持反饋貢獻支持和反饋 服務器開發者一、構建服務器1、我們將要…

主流區塊鏈

文章目錄 主流鏈1. Solana特點&#xff1a;適用場景&#xff1a;工具鏈&#xff1a; 2. Binance Smart Chain (BSC)特點&#xff1a;適用場景&#xff1a;工具鏈&#xff1a; 3. Avalanche特點&#xff1a;適用場景&#xff1a;工具鏈&#xff1a; 4. Polkadot特點&#xff1a;…

GaussDB備份數據常用命令

1、常用備份命令gs_dump 說明&#xff1a;是一個服務器端工具&#xff0c;可以在線導出數據庫的數據&#xff0c;這些數據包含整個數據庫或數據庫中指定的對象&#xff08;如&#xff1a;模式&#xff0c;表&#xff0c;視圖等&#xff09;&#xff0c;并且支持導出完整一致的數…

ctfshow-萌新賽刷題筆記

1. 給她 啟動靶機&#xff0c;發現是sql注入&#xff0c;嘗試后發現被轉義\&#xff0c;思路到這里就斷了&#xff0c;再看題目給她&#xff0c;想到git.有可能是.git文件泄露&#xff0c;dirsearch掃描一下果然是&#xff0c;用GitHack看一下git備份文件&#xff0c;得到hint…

Transformer:GPT背后的造腦工程全解析(含手搓過程)

Transformer&#xff1a;GPT背后的"造腦工程"全解析&#xff08;含手搓過程&#xff09; Transformer 是人工智能領域的革命性架構&#xff0c;通過自注意力機制讓模型像人類一樣"全局理解"上下文關系。它摒棄傳統循環結構&#xff0c;采用并行計算實現高…

算法備案全景洞察趨勢解碼:技術迭代、行業裂變與生態重構

自 2023 年《互聯網信息服務深度合成管理規定》實施以來&#xff0c;算法備案已成為中國 AI 產業發展的晴雨表。截至 2025 年第十批備案公布&#xff0c;累計通過審核的深度合成算法已突破 5000 項&#xff0c;勾勒出一條 “技術攻堅 - 場景落地 - 生態構建” 的清晰軌跡。本文…

Java vs Go:SaaS 系統架構選型解析與最佳實踐

在構建 SaaS&#xff08;Software as a Service&#xff09;系統時&#xff0c;選用合適的技術棧至關重要。Java 和 Go 是當今最受歡迎的后端開發語言之一&#xff0c;各自有其優勢和適用場景。那么&#xff0c;SaaS 系統開發應該選擇 Java 還是 Go&#xff1f;本文將從多個維度…

MySQL高頻八股——事務過程中Undo log、Redo log、Binlog的寫入順序(涉及兩階段提交)

大家好&#xff0c;我是鋼板獸&#xff01; 在上一篇文章中&#xff0c;我分別介紹了 Undo Log、Redo Log 和 Binlog 在事務執行過程中的作用與寫入機制。然而&#xff0c;實際應用中&#xff0c;這三種日志的寫入是有先后順序的。因此&#xff0c;本篇文章將深入探討它們的寫…

AI自動文獻綜述——python先把知網的文獻轉excel

第一步 Refworks轉excel 下載以后是個txt文件, 幫我把這個txt文件轉excel,用函數形式來寫便于我后期整理成軟件 提取 其中的 標題,作者,單位,關鍵詞,摘要。 分別存入excel列。 import re import pandas as pddef extract_and_convert(txt_file_path, output_excel_path…