【Elementui】组件库使用Table 表格组件为每一行的按钮添加loading效果

前言

        为了提高页面的观赏性和用户的体验,我们一般会在数据未加载之前添加loading效果来阻塞用户操作;

是什么?

点击其中一行,所有按钮loading效果都会触发
复制代码

为什么?

html部分
<el-table-column label="操作">
    <template>
      <el-button
        type="text"
        size="small"
        :loading="loading"
        @click="handleClick">
        编辑
      </el-button>
    </template>
</el-table-column>
复制代码

因为每一行的:loading属性都绑定了同一个变量loading;

js部分
 data() {
    return {
      tableData: [], // 数据源
      dialogVisible: false, // 编辑模态框
      loading: false, // 按钮加载状态
    }
  },
  methods:{
    // 编辑按钮点击事件
    handleClick() {
      // 按钮加载状态开启
      this.loading = true
      // 模拟请求数据需要2秒,请求成功后展示模态框
      setTimeout(() => {
        // 模态框开启
        this.dialogVisible = true
        // 关闭按钮加载状态
        this.loading = false
      }, 2000);
    }
  },
复制代码

并且每一个编辑按钮都会触发同一个handleClick方法,该方法中把唯一的loading变量置为了true;

怎么做?

第一步

首先确定每一行的:loading属性需要绑定唯一的变量,来控制加载状态的显示与否
复制代码
js部分
created() {
    // 延时模拟获取数据
   setTimeout(() => {
     // getTableList()方法返回[{name: 'zs', age: 12},{name: 'ls', age: 22},...]数据结构
     getTableList().then(res => {
       // 获取数据成功后赋值给数据源
       this.tableData = res
       this.tableData.map(item => {
         this.$set(item, 'loading', false)
         return item
       })
     })
   }, 500);
  }
复制代码

知识点1:map方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成;参考链接

知识点2:Vue.set( target, propertyName/index, value )向响应式对象中添加一个 property,并确保这个新 property 同样是响应式的,且触发视图更新; 参考链接

在获取数据成功之后,遍历数组中的数据,为每一项数据添加key为loading,value默认为false

遍历完成后的数据结构
tableData=[{
        date: '2016-05-03',
        name: '王小虎',
        address: '上海市普陀区金沙江路 1518 弄',
        loading: false
      },....]
复制代码

第二步

经过第一步对数据的处理,每一个数据都有自己唯一的loading为false,通过作用域插槽拿到每一行的数据row,为:loading属性绑定唯一的loading
复制代码
html部分
<el-table-column label="操作">
    <template v-slot="{row}">
      <el-button
        type="text"
        size="small"
        :loading="row.loading"
        @click="handleClick(row)">
        编辑
      </el-button>
    </template>
</el-table-column>
复制代码

如何通过点击事件handleClick()方法控制每一行的loading状态呢?

js部分
 // 编辑按钮点击事件
    handleClick(row) {
      // 按钮加载状态开启
      row.loading = true
      // 模拟请求数据需要2秒,请求成功后展示模态框
      setTimeout(() => {
        this.dialogVisible = true
        // 关闭按钮加载状态
        row.loading = false
      }, 2000);
    }
复制代码

结果呢?

问题在于开始使用一个变量控制所有按钮的加载状态,想要的是每一行的按钮状态是独立的,就应该为每一行的数据添加唯一的标识;

路漫漫其修远兮,吾将上下而求索

<think>好的,用户想了解如何在Element UI的表格中实现新增一行可编辑的功能。我需要先回忆一下Element UI的组件,特别是el-table和表单验证的部分。记得Element UI的表格组件本身不支持直接编辑,但可以通过结合el-form和el-input等表单组件来实现可编辑表格。 首先,用户提到的是新增一行,所以需要考虑如何动态地向表格数据中添加新条目。通常,这可以通过在数据数组中push一个空对象来实现。但需要确保这个新对象的每个属性都初始化好了,否则可能会导致渲染错误。 接下来是编辑功能。每个单元格可能需要切换显示模式和编辑模式。通常的做法是使用v-if或v-show来控制显示内容还是输入框。当用户点击编辑时,切换到输入框,输入完成后保存修改。这里需要注意的是,对于新增的行,可能需要直接进入编辑模式,或者有一个明确的“新增”按钮,点击后添加一行并自动进入编辑状态。 然后要考虑表单验证。Element UI的el-form组件提供了验证功能,但要在表格使用,可能需要将每一行作为一个单独的el-form,或者使用动态的rules属性。不过,表格结构可能让表单验证变得复杂,可能需要自定义验证逻辑,或者在保存时检查每个字段的有效性。 另外,数据绑定方面,必须确保每个输入框正确绑定到对应行和字段的数据。使用v-model来双向绑定数据,注意在遍历表格数据时,正确的索引和属性名是关键,避免数据错乱。 样式方面,可能需要调整输入框的宽度和边框,使其在表格单元格内看起来合适。Element UI的el-input默认可能有外边距或填充,需要调整CSS来适应表格布局。 还有一个问题是,新增的行可能需要一个“保存”按钮,用来确认输入并提交数据到后端,或者只是更新本地数据。在保存时,需要验证所有必填字段是否已填写,格式是否正确,比如数字字段是否为有效数字,邮箱是否符合格式等。 用户可能还希望有取消编辑的功能,比如在新增一行后,如果用户不想保存,可以取消,从而移除该行。这需要在数据中标记新增的行,并在取消时过滤掉这些未保存的数据。 另外,考虑到性能,如果表格数据量很大,动态添加可编辑行可能会影响渲染性能。但通常新增操作不会一次性添加太多行,所以问题不大。 最后,可能需要提供一个示例代码结构,展示如何结合el-tableel-form来实现这些功能,包括数据绑定、方法处理以及必要的验证逻辑。同时提醒用户注意版本兼容性,确保使用Element UI版本支持相关功能。</think>在Element UI中实现表格新增可编辑行的功能,可通过以下步骤实现: --- ### 一、功能需求分析 1. 点击**新增按钮**添加空数据行 2. 表格行内展示输入框进行编辑 3. 支持数据保存和验证 4. 可取消新增操作 --- ### 二、核心实现代码 ```html <template> <div> <el-button @click="handleAdd">新增</el-button> <el-table :data="tableData"> <el-table-column prop="name" label="姓名"> <template slot-scope="scope"> <el-input v-if="scope.row.isNew" v-model="scope.row.name"></el-input> <span v-else>{{ scope.row.name }}</span> </template> </el-table-column> <!-- 其他列类似 --> <el-table-column label="操作"> <template slot-scope="scope"> <el-button v-if="scope.row.isNew" @click="handleSave(scope.row)" type="success" size="mini" >保存</el-button> <el-button v-if="scope.row.isNew" @click="handleCancel(scope.$index)" type="danger" size="mini" >取消</el-button> </template> </el-table-column> </el-table> </div> </template> <script> export default { data() { return { tableData: [] // 原始数据 } }, methods: { handleAdd() { this.tableData.push({ name: '', age: '', isNew: true // 标记新增行 }); }, handleSave(row) { // 1. 执行数据验证 if (!row.name || !row.age) { this.$message.error('请填写完整信息'); return; } // 2. 提交到后端或更新本地数据 row.isNew = false; }, handleCancel(index) { this.tableData.splice(index, 1); } } } </script> ``` --- ### 三、关键实现细节 1. **状态标记**:通过`isNew`属性区分新增行和普通行 2. **条件渲染**:使用`v-if`控制输入框与文本的切换显示 3. **数据验证**:在保存时检查必填字段 4. **取消操作**:直接移除临时数据行 --- ### 四、增强功能建议 1. **表单验证集成**:结合`el-form`实现更复杂的验证规则 ```javascript rules: { name: [{ required: true, message: '姓名必填', trigger: 'blur' }], age: [{ pattern: /^\d+$/, message: '必须为数字' }] } ``` 2. **自动聚焦**:新增行时自动聚焦第一个输入框 3. **防重复提交**:添加`loading`状态防止多次点击 --- ### 五、注意事项 1. 确保Element UI版本在**2.13.0+**(验证低版本兼容性) 2. 深拷贝问题:编辑时避免直接修改原始数据 3. 多级表头场景需要特殊处理作用域插槽 完整实现示例可参考Element UI官方文档中[Table](https://element.eleme.cn/#/zh-CN/component/table)和[Form](https://element.eleme.cn/#/zh-CN/component/form)组件的结合使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值