element-plus表格渲染数据(多选框+分页)(一)

本文介绍了如何使用Element-Plus库中的el-table组件实现表格渲染,包括添加多选框、设置列宽和对齐,以及如何绑定静态数据和使用自定义列模板。作者还展示了如何处理单元格内的计算和添加确认删除操作的气泡提示。

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

hi,大家好,今天分享做需求经常用到的组合,element-plus表格渲染数据(多选框+分页),记录一下,直入主题:

首先:搭建表格页面,参考element-plus官网:

我把许多代码的作用都写在注释上了,大家自行看吧。

<script setup>

</script>

<template>
    <div class="constainer">
        <div class="content">
    <el-table 
      >
      <!-- 实现多选非常简单: 手动添加一个 el-table-column,设 type 属性为 selection 即可 -->
        <el-table-column type="selection" width="70" align="center"/>
        <!-- width和align我这里直接写标签上了,一个是宽度,一个是居中显示 -->
        <el-table-column prop="" label="商品" width="270" align="center">
        </el-table-column>
        <el-table-column prop="s_goods.price" label="单价" width="120" align="center">
        </el-table-column>
        <el-table-column prop="num" label="数量" align="center" width="140">
        </el-table-column>
        <el-table-column label="小计" width="120" align="center">
        </el-table-column>
        <el-table-column prop="" label="操作" width="180" align="center">     
        </el-table-column>
      </el-table>
  </div>
    </div>
  
</template>

<style lang='scss' scoped>
.constainer{
    width: 100vw;//宽等于屏幕的宽
    height: 100vh;//高等于屏幕的高
    background-color: #ccc;
    padding-top: 50px;
}
.content{
    width: 900px;
    height: 600px;
    margin: 0 auto;
    background-color: #fff;
    border-radius: 10px;
    overflow: hidden;
}
</style>

效果(样式大家自由发挥):

往下:我们定义表格的数据,有后端接口的就用自己后端的数据,我这里暂时没有合适的接口,就先用静态数据代替

<script setup>


//我这里没有合适的接口,暂用tableData来代替,有后端接口返回的数据,拿返回的数据替换掉这个tableData
//在el-table用:data="tableData"就能将数据绑定在表格上,通过prop="属性名"来绑定每一列数据
const tableData = [
  {
    goodsDetail: {
        goodsImg:'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
        goodsName:'商品名称',
        goodsDesc:'商品详情',
    },
    goodsPrice: 188,
    goodsNum: 3,
  },
  {
    goodsDetail: {
        goodsImg:'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
        goodsName:'商品名称',
        goodsDesc:'商品详情',
    },
    goodsPrice: 188,
    goodsNum: 3,
  },
  {
    goodsDetail: {
        goodsImg:'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
        goodsName:'商品名称',
        goodsDesc:'商品详情',
    },
    goodsPrice: 188,
    goodsNum: 3,
  },
  {
    goodsDetail: {
        goodsImg:'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
        goodsName:'商品名称',
        goodsDesc:'商品详情',
    },
    goodsPrice: 188,
    goodsNum: 3,
  },
  {
    goodsDetail: {
        goodsImg:'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
        goodsName:'商品名称',
        goodsDesc:'商品详情',
    },
    goodsPrice: 188,
    goodsNum: 3,
  },
]
</script>

<template>
    <div class="constainer">
        <div class="content">
            <!-- :row-style="{ height: '110px' }设置每行的高度 -->
            <!-- :data="tableData" -->
    <el-table
    :row-style="{ height: '110px' }" 
    :data="tableData"
      >
        <el-table-column type="selection" width="70" align="center"/>
        <el-table-column label="商品" width="270" align="center">
        </el-table-column>
        <!-- prop="属性名"来绑定每一列数据 -->
        <el-table-column prop="goodsPrice" label="单价" width="120" align="center">
        </el-table-column>
        <el-table-column prop="goodsNum" label="数量" align="center" width="140">
        </el-table-column>
        <el-table-column label="小计" width="120" align="center">
        </el-table-column>
        <el-table-column prop="" label="操作" width="180" align="center">     
        </el-table-column>
      </el-table>
  </div>
    </div>
  
</template>

<style lang='scss' scoped>
.constainer{
    width: 100vw;//宽等于屏幕的宽
    height: 100vh;//高等于屏幕的高
    background-color: #ccc;
    padding-top: 50px;
}
.content{
    width: 900px;
    height: 600px;
    margin: 0 auto;
    background-color: #fff;
    border-radius: 10px;
    overflow: hidden;
}
</style>

效果:

往下:我们使用自定义列模板来定义不能直接用特殊的列值,样式仅供参考

<script setup>
//我这里没有合适的接口,暂用tableData来代替,有后端接口返回的数据,拿返回的数据替换掉这个tableData
//在el-table用:data="tableData"就能将数据绑定在表格上,通过prop="属性名"来绑定每一列数据
const tableData = [
  {
    goodsDetail: {
      goodsImg: 'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
      goodsName: '商品名称',
      goodsDesc: '商品详情'
    },
    goodsPrice: 188,
    goodsNum: 3
  },
  {
    goodsDetail: {
      goodsImg: 'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
      goodsName: '商品名称',
      goodsDesc: '商品详情'
    },
    goodsPrice: 188,
    goodsNum: 3
  },
  {
    goodsDetail: {
      goodsImg: 'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
      goodsName: '商品名称',
      goodsDesc: '商品详情'
    },
    goodsPrice: 188,
    goodsNum: 3
  },
  {
    goodsDetail: {
      goodsImg: 'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
      goodsName: '商品名称',
      goodsDesc: '商品详情'
    },
    goodsPrice: 188,
    goodsNum: 3
  },
  {
    goodsDetail: {
      goodsImg: 'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png',
      goodsName: '商品名称',
      goodsDesc: '商品详情'
    },
    goodsPrice: 188,
    goodsNum: 3
  }
]
</script>

<template>
  <div class="constainer">
    <div class="content">
      <el-table :row-style="{ height: '110px' }" :data="tableData">
        <el-table-column type="selection" width="70" align="center" />
        <el-table-column label="商品" width="270" align="center">
          <!-- 通过 slot 可以获取到 row, column, $index 和 store(table 内部的状态管理)的数据 -->
          <!-- scope.row获取每一行列表的全部数据,可以自己打印出来看看 -->
         <!-- 自定义列表就是在列表项下面加一个template,绑定scope可以帮助我们获取一整行的数据 -->
          <template v-slot="scope">
            <!-- {{ scope.row }} -->
            <div class="goods-info">
              <img :src="scope.row.goodsDetail.goodsImg" alt="" class="cart-img" />
              <div>
                <p>{{ scope.row.goodsDetail.goodsName }}</p>
                <p class="desc">
                  {{ scope.row.goodsDetail.goodsDesc }}
                </p>
              </div>
            </div>
          </template>
        </el-table-column>
        <!-- prop="属性名"来绑定每一列数据 -->
        <el-table-column prop="goodsPrice" label="单价" width="120" align="center">
        </el-table-column>
        <el-table-column prop="goodsNum" label="数量" align="center" width="140"> </el-table-column>
        <el-table-column label="小计" width="120" align="center">
          <template v-slot="scope"> ¥{{ scope.row.goodsPrice * scope.row.goodsNum }} </template>
        </el-table-column>
        <el-table-column prop="" label="操作" width="180" align="center">
          <template #default="scope">
            <!-- 气泡弹出框来确认用户是否要删除商品 @confirm写确认后的事件,逻辑很简单,我就省略了 -->
            <el-popconfirm title="你确定要删除吗?">
              <template #reference>
                <el-button type="info">移除商品</el-button>
              </template>
            </el-popconfirm>
          </template>
        </el-table-column>
      </el-table>
    </div>
  </div>
</template>

<style lang="scss" scoped>
.constainer {
  width: 100vw; //宽等于屏幕的宽
  height: 100vh; //高等于屏幕的高
  background-color: #ccc;
  padding-top: 50px;
}
.content {
  width: 900px;
  height: 600px;
  margin: 0 auto;
  background-color: #fff;
  border-radius: 10px;
  overflow: hidden;
  .goods-info {
    display: flex;
    align-items: center;
    .cart-img {
      margin: 0 1.5em 0 1em;
      width: 80px;
      height: 80px;
    }
    p {
      text-align: left;
    }
    .desc {
      margin-top: 1em;
    }
  }
}
</style>

太多了,下一篇继续分享~

### Vue3 Element Plus 复选框分页回显解决方案 在处理 `Vue3` 和 `Element Plus` 的表格组件时,为了实现在分页切换后保持已选择项的状态,可以采用以下方案: #### 数据结构设计 确保数据模型能够保存每页的选择状态。通常做法是在页面级的数据对象中维护个映射表来记录哪些行被选中。 ```javascript const selectedRowsMap = ref(new Map()); ``` 此变量用于存储每行唯标识符到其是否已被勾选的布尔值之间的对应关系[^1]。 #### 表格配置 当初始化表格或加载新页码的数据时,应遍历当前显示的数据集并设置默认选中的行。这可以通过监听分页事件并在每次更新视图之前同步选择状态完成。 ```html <template> <el-table :data="tableData" @selection-change="handleSelectionChange"> <!-- 列定义 --> <el-table-column type="selection" width="55"></el-table-column> ... </el-table> <div class="pagination-container"> <el-pagination layout="prev, pager, next" :total="total" @current-change="handlePageChange"/> </div> </template> ``` 每当发生分页变化时触发 `handlePageChange` 方法,在该方法内部重新计算哪几条记录应该处于选中状态,并通过编程方式调用 `toggleRowSelection()` 来恢复这些选项。 ```typescript import { ElTable } from "element-plus"; // 假设 tableRef 是指向 el-table 组件实例的个 Ref const handlePageChange = (currentPage) => { // 获取新的数据列表... const currentSelectedKeys = Array.from(selectedRowsMap.value.keys()).filter(key => newDataList.some(item => item.id === key)); nextTick(() => { currentSelectedKeys.forEach((key) => { const row = newDataList.find(item => item.id === key); if(row){ tableRef.value.toggleRowSelection(row, true); } }); }); }; ``` 上述逻辑确保即使用户翻阅不同页面再返回原位置也能看到之前的多选结果得以保留[^2]。 对于渲染函数的具体实现细节以及如何自定义单元格内容可参见提供的 E-expand.js 文件说明;而对于属性配置方面,则需要注意像 `<el-tree-select>` 这样的控件需要正确指定 `props` 属性才能正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值