element封装自定义弹框组件Table并自适应宽度

本文介绍如何使用Vue.js封装一个基于Element UI的自定义弹框组件,该组件能够动态渲染数据数组,并提供type属性以实现不同类型的交互,如点击跳转。组件内包含顶部和底部插槽,方便自定义内容和操作按钮。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将需要渲染的数据通过数组的传入 组件内通过循环动态渲染,该组件可以通过添加type类型配合template slot拓展 还放置两个插槽进行拓展一个插槽在表格上面 一个用来插操作按钮

<template>
    <div>
        <!-- RFID详情 -->
        <el-dialog :title="title" :visible.sync="codeDetailShow" width="70%" ref="cardBox" :close-on-click-modal=false
                   :append-to-body=true>
            <div style="margin-bottom: 16px;">
                <slot name="headSlot"></slot>
            </div>
                <el-table :data="tableList.slice((table.page - 1) * table.rows,table.page * table.rows)"
                          v-loading="loadings">
                    <el-table-column type="index" align="center" label="序号">
                    </el-table-column>
                    <el-table-column v-for="(item,index) in sizeNameList" :key="index" align="center" :label="item.name"
                                     :width="flexColumnWidth(item.id,tableList)">
                        <template slot-scope="scope">
                            <div v-if="item.type=='img'">
                                <el-image class="table_img" v-if="scope.row[item.id]"
                                          @click="viewImg(scope.row[item.id])" :src="scope.row[item.id] + imgAbbreviate"
                                          fit="contain"></el-image>
                                <img alt="" class="table_img" src="../../assets/img/imgbg.png" v-else/>
                            </div>
                            <!-- 时间格式年月日时分秒 -->
                            <div v-else-if="item.type == 'date'">
                                {
  
  { scope.row[item.id] | time }}
                            </div>
                                <!-- day时间格式年月日 -->
                                <div v-else-if="item.type == 'day'">
                                    <span>{
  
  { scope.row[item.id] | day }}</span>
                                </div>
             
### 调整 Element UI 表格列宽以适应内容 在使用 `el-table` 时,为了实现列宽自适应内容的效果,可以通过动态计算每一列的内容宽度来设置 `width` 属性。Element UI 的 `el-table-column` 支持通过绑定 `:width` 属性来动态设置列宽,因此可以结合 JavaScript 方法实现这一功能。 #### 动态计算列宽 可以通过编写一个方法 `flexColumnWidth` 来动态计算列宽。该方法接收两个参数:字段名和数据源数组。通过遍历数据源数组计算指定字段的最大字符长度,然后将该长度乘以一个合适的系数(如 10),即可得到适合的列宽值。以下是一个示例实现: ```javascript methods: { flexColumnWidth(field, data) { let maxWidth = 0; data.forEach(item => { const textLength = item[field] ? item[field].toString().length : 0; if (textLength > maxWidth) { maxWidth = textLength; } }); return maxWidth * 10; // 系数可以根据实际需求调整 } } ``` 在模板中,将该方法绑定到 `el-table-column` 的 `:width` 属性上: ```html <el-table :data="tableData"> <el-table-column prop="name" :width="flexColumnWidth('name', tableData)" label="名称" align="center"></el-table-column> <el-table-column prop="pNumber" :width="flexColumnWidth('pNumber', tableData)" label="单号" align="center"></el-table-column> </el-table> ``` 此方法能够根据数据内容的长度动态调整列宽,确保表格内容保持单行显示,且列间距保持一致[^2]。 #### 基于二次封装组件方案 如果希望更方便地实现自适应列宽的功能,可以选择基于 Element UI 进行二次封装组件库,例如 `af-table-column`。这种组件通常已经内置了自动调整列宽的逻辑,开发者只需引入替换默认的 `el-table-column` 即可。以下是引入和使用的示例代码: ```javascript import Vue from 'vue'; import ElementUI from 'element-ui'; import AFTableColumn from 'af-table-column'; Vue.use(ElementUI); Vue.component('el-table-column', AFTableColumn); // 替换默认的 el-table-column ``` 使用这种方式后,无需手动计算列宽,组件会自动根据内容调整列宽,从而减少开发工作量提升用户体验[^4]。 #### 注意事项 - 在动态计算列宽时,需要考虑不同字体、字符的实际显示宽度,避免因字符宽度不一致导致布局错乱。 - 如果表格内容较多,建议启用水平滚动条以防止页面布局溢出。 - 对于复杂场景,可以结合 CSS 样式进一步优化表格的展示效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值