el-upload源码跳坑2

产品又加了一个需求,要求删除图片时候弹一个提示框,如果确定就直接发请求从服务器删除图片

​ 一开始想的比较简单,直接在on-remove的钩子函数上做弹框提示,如果取消就撤销,代码如下:

<el-upload :on-remove='remove'></el-upload>
remove:function(){
    this.$confirm('此操作将永久删除图片, 是否继续?', '提示', {
        // ...若干处理代码
    }
}

​ 并不行,在我点下删除按钮的一瞬间,图片就消失了,接着才弹框。

​ 跑去看源码,才发现里面的逻辑是这样的:

<!-- upload-list.vue -->
<span v-if="!disabled" class="el-upload-list__item-delete" @click="$emit('remove', file)"></span>

<!-- index.vue -->
<UploadList ... on-remove={this.handleRemove}</UploadList>
handleRemove(file, raw) {
  if (raw) {
    file = this.getFile(raw);
  }
  this.abort(file);
  let fileList = this.uploadFiles;
  // 先从fileList删除图片
  fileList.splice(fileList.indexOf(file), 1);
  // 再触发remove事件
  this.onRemove(file, fileList);
}

​ 这样子就明白了,想在图片删除(消失)前出框只能撸源码了。

​ 由于element-ui有自带的弹框组件,所以如果能在源码直接嵌入组件那就最好了,于是我在handleRemove中打印了一下this,显示为VueComponent,与我写的vue文件的this一样,所以方法可以直接用,那就太方便了。

​ 修改后,源码如下:

// index.vue
// 首先添加一个变量来控制这个功能
jimmyRemoveTip: {
  type: Boolean,
  default: false
}

// 根据变量控制流程
handleRemove(file, raw) {
  // 添加的确认环节
  if (this.jimmyRemoveTip) {
    this.$confirm('此操作将永久删除图片, 是否继续?', '提示', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning'
    }).then(() => {
      // ...删除图片
    }).catch(() => {
      this.$message({
        type: 'info',
        message: '已取消删除'
      });          
    });
  }else {
    // 正常流程
  }  
}

​ (语法检查真是严格,else前后,大括号前必须有空格)

​ 这样,只要在组件传一个:jimmyRemoveTip='true',点击删除按钮就会弹一个提示框,确定才会走删除流程,否则框消失。

​ 成功!

posted @ 2017-11-02 18:05  书生小龙  阅读(971)  评论(0编辑  收藏  举报