Element Plus 的 <el-table-column> 中 #default=“scope”和#default=“{ row }” 的区别

在 Element Plus 的 <el-table-column> 中,#default="{ row }" 和 #default="scope" 本质上是相同的概念,区别在于 变量解构的写法 和 可访问属性的范围。以下是具体区别:


1. 写法区别

写法特点
#default="scope"接收完整的插槽作用域对象
#default="{ row }"直接解构出 row 属性(ES6 对象解构语法)

2. 可访问属性

假设数据对象结构为:

{
  row: {},     // 当前行数据
  $index: 0,   // 行索引
  column: {},  // 当前列配置
  // ...其他属性
}
通过 scope 访问:
<el-table-column>
<template #default="scope">
  {{ scope.row }}      <!-- 当前行数据 -->
  {{ scope.$index }}   <!-- 行索引 -->
  {{ scope.column }}   <!-- 列配置 -->
  {{ scope.cellIndex}} <!-- 单元格索引 -->
</template>
</el-table-column>

查看scope对象的详细信息:

通过解构 { row } 访问:
<template #default="{ row }">
  {{ row }}  <!-- 直接访问行数据 -->
  <!-- 无法访问 $index 或 column -->
</template>

3. 何时选择哪种写法?

场景推荐写法示例
只需要行数据时{ row }(更简洁)显示行内容、状态标签
需要行索引或其他属性时scope(更完整)需要显示行号(scope.$index + 1
需要操作列配置时scope动态修改列样式、根据列属性判断逻辑

4. 代码对比

使用 scope
<el-table-column label="状态">
  <template #default="scope">
    <el-tag :type="scope.row.status ? 'success' : 'danger'">
      {{ scope.row.status ? '启用' : '禁用' }}
      (行号: {{ scope.$index + 1 }})
    </el-tag>
  </template>
</el-table-column>
使用 { row }
<el-table-column label="状态">
  <template #default="{ row }">
    <el-tag :type="row.status ? 'success' : 'danger'">
      {{ row.status ? '启用' : '禁用' }}
    </el-tag>
  </template>
</el-table-column>

5. 本质原理

两者访问的是同一个作用域对象,只是通过解构语法提取了需要的属性。以下两种写法完全等价:

// 写法 1:完整对象
const scope = { row: {}, $index: 0, column: {} };
console.log(scope.row);

// 写法 2:解构赋值
const { row } = { row: {}, $index: 0, column: {} };
console.log(row);

总结

特性#default="scope"#default="{ row }"
可访问属性所有属性(row/$index等)仅解构出的属性(如row)
代码简洁性需要 scope.row 访问直接使用 row
适用场景需要多属性操作时只需行数据时
本质区别无(同一对象的不同写法)

根据实际需求选择即可,如果需要行号或其他属性,用 scope;如果只需行数据,解构 { row } 更简洁。

<el-table v-loading="loading" :data="MlbLbuStageNameList" @selection-change="handleSelectionChange" border> <el-table-column label="产品类型" align="center" prop="productType" /> <el-table-column label="LBU阶段名称" align="center" prop="lbuStageName" min-width="120px"/> <el-table-column label="阶段简称/显示" align="center" prop="stageDisplay" /> <el-table-column label="LBU阶段分类" align="center" prop="lbuStageType" min-width="130px"/> <el-table-column label="计算行名称" align="center" prop="countLineName" /> <el-table-column label="顺序" align="center" prop="orders" /> <el-table-column label="是否计算产能" align="center" prop="isCount" /> <el-table-column label="显示颜色" align="center" min-width="100px"> <template #default="{ row }"> <div style="display: flex; align-items: center;"> <div :style="{ backgroundColor: row.color, width: '100px', height: '20px' }"></div> </div> </template> </el-table-column> <el-table-column label="修改人" align="center" prop="updateBy" min-width="100px"> <template #default="scope"> <span>{{ scope.row.updateBy != null ? scope.row.updateBy : scope.row.createBy }}</span> </template> </el-table-column> <el-table-column label="上传时间" align="center" prop="updateTime" min-width="200px" > <template #default="scope"> <span>{{ parseTime(scope.row.updateTime != null ? scope.row.updateTime : scope.row.createTime) }}</span> </template> </el-table-column> <el-table-column label="备注" align="center" prop="remark" min-width="180px"/> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" :min-width="150" fixed="right"> <template #default="scope"> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['mlbbiz:MlbLbuStageName:edit']">修改</el-button> <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['mlbbiz:MlbLbuStageName:remove']">删除</el-button> </template> </el-table-column> </el-table>解释这段代码
最新发布
06-03
<template> <div> <div> <!--搜索栏--> <el-input v-model="name" placeholder="请输入菜单名称" style="width: 200px" prefix-icon="el-icon-user"></el-input> <el-button class="el-icon-search" style="margin-left: 10px" type="primary" @click="load">查询</el-button> <el-button class="el-icon-refresh" style="margin-left: 10px" type="warning" @click="reset">重置</el-button> </div> <div style="margin-top: 20px;margin-bottom:35px;"> <!-- 新增、批量删除 --> <el-button class="el-icon-plus" style="margin-right: 10px" type="success" @click="save(null)">新增</el-button> <el-button class="el-icon-close" style="margin-left: 10px" type="danger" @click="deleteByids" >批量删除</el-button> </div> <el-table :data="tableData" border stripe :header-cell-style="getRowClass" @selection-change="handleSelectionChange" row-key="id" border default-expand-all> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="id" label="id"></el-table-column> <el-table-column prop="name" label="菜单名称"></el-table-column> <el-table-column prop="path" label="菜单路径"></el-table-column> <el-table-column prop="icon" label="菜单图标"> <template v-slot:default="scope"> <i :class="scope.row.icon"></i> </template> </el-table-column> <el-table-column prop="pagePath" label="页面路径"></el-table-column> <el-table-column prop="description" label="菜单描述"></el-table-column> <el-table-column prop="sortNum" label="排序"></el-table-column> <el-table-column label="操作" width="300"> <template v-slot="scope"> <div class="action-buttons"> <!-- 添加容器方便布局 --> <el-button type="success" size="mini" class="compact-btn" @click="save(scope.row.id)" v-if="!scope.row.pid && !scope.row.path">新增子菜单</el-button> <el-button type="prima
03-29
<template> <div> <el-form :inline="true" class="form"> <el-form-item label="学号"> <el-input v-model="studentId" placeholder="请输入学号" /> </el-form-item> <el-form-item label="姓名"> <el-input v-model="name" placeholder="请输入姓名" /> </el-form-item> <el-form-item label="年龄"> <el-input v-model.number="age" type="number" placeholder="请输入年龄" /> </el-form-item> <el-form-item label="邮箱"> <el-input v-model="email" placeholder="请输入邮箱" /> </el-form-item> <el-form-item> <el-button type="primary" @click="addRoommate">添加</el-button> <el-button type="danger" @click="store.clearAll">清空</el-button> </el-form-item> </el-form> <el-table :data="list" style="width: 100%"> <el-table-column prop="studentId" label="学号" width="120" /> <el-table-column prop="name" label="姓名" width="150"> <template #default="scope"> <a @click="goToUserDetail(scope.row.studentId)">{{ scope.row.name }}</a> </template> </el-table-column> <el-table-column prop="age" label="年龄" width="100"></el-table-column> <el-table-column prop="email" label="邮箱"></el-table-column> <el-table-column label="操作" width="120"> <template #default="{ row }"> <el-button size="small" type="danger" @click="store.removeRoommate(row.studentId)">删除</el-button> </template> </el-table-column> </el-table> </div> </template> <script setup> import { ref } from 'vue'; import { useRouter } from 'vue-router'; import { useRoommateStore } from '../store/roommates.js' import { storeToRefs } from 'pinia'; const router = useRouter(); const store = useRoommateStore() const {list} = storeToRefs(store); const studentId = ref(0) const name = ref('') const age = ref(18) const email = ref('') function goToUserDetail(userId) { router.push({ name: 'UserDetail', params: { studentId: userId } }); } const addRoommate = () => { store.addRoommate({ studentId: studentId.value, name: name.value, age: age.value, email: email.value }) } </script> <style scoped> /* Add custom styles here if needed */ </style>
05-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值