vue+element的表格实现批量删除功能

4 篇文章 0 订阅

最近写了一个批量删除功能,遇到了不少坑,特此记录一下
这里写图片描述
表格的代码如下

<el-table @row-click="handleCurrentChange" @selection-change="selsChange" ref="table" :data="pageData" stripe :default-sort="{prop: 'createAt', order: 'descending'}" @sort-change="sortChange">

如图所示,表格最前面有一个复选框
代码很简单

 <el-table-column type="selection" width="65"></el-table-column>

删除按钮的代码如下:

<el-button v-show="mode == 'list'" class="small" type="warning" size="small" @click="removeBatch(sels)" :disabled="this.sels.length === 0||this.disabled">批量删除</el-button>

data的代码如下:

  data() {
    return {
      pageSize: 12,
      total: 0,
      pageData: [],
      query: '',
      sort: 'createAt',
      order: 'descending',
      defaultSnap: srcFallback,
      accept: '',
      ws: null,
      sels: [],//选中显示的值
      disabled:true
    };
  }

表格中的视频数据来自于pageData,每个视频都是一个对象,对象的status属性等于waiting或者有progress属性时,此视频正在转码,或者正在准备转码,不允许删除,
批量删除就是把被选中的行添加到sels这个数组中,把数组里的每一个对象的id属性组成一个数组,发送给后端,此外,正在转码的视频不允许删除,此时按钮也是禁用状态
根据官方文档,@selection-change="selsChange"是复选框选择改变时触发的事件
在methods中添加一个方法

selsChange(sels) { 
        //被选中的行组成数组 
        this.sels = sels;
        //遍历被选中行数所组成的数组
        for(let element of this.sels){
        //如果视频正在转码或者等待转码,禁用按钮,结束方法
          if(element.status == 'waiting'||element.progress){
            this.disabled = true;
            return;
          }
             //如果没有视频正在转码或者等待转码,按钮可用
            this.disabled = false;
        }
    }

把请求发送给后端,代码如下:

    removeBatch(rows){
      var ids = [];
      rows.forEach(element =>{
        ids.push(element.id)
      })
      this.$confirm('确定要删除选中的文件吗?','提示').then(() =>{
        $.post('/vod/removeBatch',{
          ids:ids
        }).then(dara =>{
          this.updateData();
        })
      }).catch(()=>{});
    }

前端已经排除正在转码的视频了,后端是否能根据前端传来的数据,直接删除视频呢?
答案是不可以,后端一样要做验证
思路是,拿到前端传来的数据后,遍历数组两次,第一次如果发现有正在转码的视频,抛出异常,不会进入第二次循环,第二次循环才根据id删除视频
代码如下

r.post('/removeBatch',async(req,res) => {
    var ids = req.body.ids;
    var files = utils.vod.get("files");
    //第一次循环,如果有正在转码的文件,就抛出异常,结束循环
    for(let id of ids){
        var transing = trans.agent.transing[id];
        if(transing){
            throw new Error('正在转码的文件无法删除');
            return;
        }
    }
    //如果没有转码的文件,进入第二次循环
    for(let id of ids){
        var files = utils.vod.get("files");
        var row = files.find({id: id}).cloneDeep().value();
        //如果没有要删除的,就结束
        if(!row) {
            res.sendStatus(200);
            return;
        }
        var dir = path.dirname(row.path);
        var name = path.basename(row.path, path.extname(row.path));
        var transDir = path.resolve(dir, name);
        //删除源文件
        if(fs.existsSync(row.path)){
            fs.removeSync(row.path);
        }
        //删除转码文件
        if(fs.existsSync(transDir)){
            fs.removeSync(transDir);
        }
        //删除json文件记录
        files.remove({id: id}).write();
    }
    res.sendStatus(200);
})
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是使用 Vue3 + Element-Plus 实现表格批量删除的代码示例: ``` <template> <div> <el-button type="primary" @click="handleBatchDelete">批量删除</el-button> <el-table :data="tableData" style="width: 100%"> <el-table-column type="selection"></el-table-column> <el-table-column prop="name" label="姓名"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> </div> </template> <script> import { reactive, toRefs } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' export default { setup() { const state = reactive({ tableData: [ { id: 1, name: '张三', age: 18 }, { id: 2, name: '李四', age: 20 }, { id: 3, name: '王五', age: 22 } ] }) // 批量删除 const handleBatchDelete = () => { const selection = state.selection if (selection.length === 0) { ElMessage.warning('请至少选择一项进行删除') return } ElMessageBox.confirm('确定要删除选中的数据吗?', '提示', { type: 'warning' }).then(() => { // 删除选中的数据 state.tableData = state.tableData.filter(item => !selection.includes(item)) ElMessage.success('删除成功') }).catch(() => {}) } return { ...toRefs(state), handleBatchDelete } } } </script> ``` 在这个例子中,我们使用了 Element-Plus 的 `ElTable` 组件和 `ElButton` 组件。`ElTable` 组件中的 `type="selection"` 属性表示开启选择模式,这样就可以在表格左侧显示多选框,方便进行批量删除操作。点击批量删除按钮时,会弹出确认对话框,用户确认后会删除选择的数据。在删除数据时,我们使用了 Vue3 的响应式 API `reactive` 和 `toRefs`,这样可以自动更新视图。同时,我们也使用了 Element-Plus 的消息提示组件 `ElMessage` 和确认对话框组件 `ElMessageBox`,提高了用户体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值