vue中v-for循环数组使用方法中splice删除数组元素(错误:每次都删掉点击的下面的一项)

总结:平常使用v-for的key都是使用index,这里vue官方文档也不推荐,这个时候就出问题了,我们需要key为唯一标识,这里我使用了时间戳(new Date().getTime())处理比较复杂的情况,
本文章参考 链接: https://www.jb51.net/javascript/29041834i.htm
效果图:
在这里插入图片描述

在这里插入图片描述

disabled 上传完一张图片之后,把上传‘+’样式隐藏 Vue+Element UI Upload 组件 上传单张图片去除后面的+号
v-for循环el-upload上传图片方法,详见:vue element-ui v-for循环el-upload上传图片 动态添加、删除

//disabled 上传完一张图片之后,把上传‘+’样式隐藏  详见:[vue element-ui v-for循环el-upload上传图片 动态添加、删除](https://blog.csdn.net/sumimg/article/details/132620328)
<el-form-item label="资源列表:">
   <div class="ziyuan" flex v-for="(item, indexes) in  addList " :key="item.idxxx">
        <div style="margin-top: 9px;">
            <el-upload :action="domins + '/common/upload'"
                :class="{ disabled: item.uploadDisabled }" list-type="picture-card"
                :before-upload="beforeUploadOne" :on-preview="handlePictureCardPreview"
                :on-remove="handleRemove.bind(null, { 'index': indexes, 'data': item })"
                :on-success="handleAvatarSuccess.bind(null, { 'index': indexes, 'data': item })"
                :on-change="handleChange.bind(null, { 'index': indexes, 'data': item })"
                :file-list="item.fileList" accept="image/png, image/jpeg">
                <i class="el-icon-plus"></i>
            </el-upload>
            <el-dialog :visible.sync="dialogVisible">
                <img width="100%" :src="item.dialogImageUrl" alt="">
            </el-dialog>
        </div>
        <div class="yasuo" flex="cross:center">
            <div>
                <div style="height: 68px;">
                    <el-upload ref="uploadzip" :action="domins + '/common/upload'"
                        :on-remove="handleRemoveZip"
                        :on-success="handleAvatarSuccessZip.bind(null, { 'index': indexes, 'data': item })"
                        :on-change="handleChangeZip" :file-list="item.fileListZip"
                        :auto-upload="true" accept=".zip,.rar,.ab" :limit="1">
                        <el-button size="small" type="primary">选择压缩包</el-button>
                    </el-upload>
                </div>
                <div class="banben" v-show="addmu == 1 || jzyFlag == 2">版本号{{
                    item.versions ? item.versions : '1.0.0' }}</div>
            </div>
        </div>
        <div class="airadio">
            <el-radio-group v-model="item.way">
                <el-radio :label="0">Android</el-radio>
                <el-radio :label="1">ios</el-radio>
            </el-radio-group>
        </div>
        <div style="margin-top: 11px;">
            <i class="el-icon-circle-plus-outline" style="color: #264E71;"
                @click="plusOne(indexes)"></i>
            <i class="el-icon-remove-outline" style="color: #264E71;" v-show="addList.length > 1"
                @click="removeOne(indexes, item.id, item)"></i>

        </div>
    </div>


</el-form-item>

压缩文件 imageConversion 详见: vue+elementUI 上传图片时压缩图片

<script>
import * as imageConversion from 'image-conversion';
export default {
    components: {  },
    data() {
        return {
			addList: [{
                id: 0,
                uploadDisabled: false,
                album: '',
                zip: '',
                way: 0,
                idxxx: 0
                // fileList: [],
                // fileListZip: []
            }],
		}
   }
}
</script>

删除某一项 idxxx作为唯一标识,因为需求原因 在没添加时间戳(new Date().getTime())之前是没有唯一标识的

//再后面添加一项,idxxx作为唯一标识,因为需求原因 在没添加时间戳之前是没有唯一标识的
 plusOne() {
    this.addList.push({
        id: 0,
        uploadDisabled: false,
        album: '',
        zip: '',
        way: 0,
        idxxx: new Date().getTime()
        
    })
},
removeOne(index, id, item) {
//使用唯一标识删除
     this.addList = [...this.addList.filter(e => e.idxxx !== item.idxxx)]
},

下面是其他的上传文件的方法

// 识别图
 beforeUpload(file) {
     const isJpgOrPng =
         file.type === "image/jpeg" || file.type === "image/png";
     const isLt1M = file.size / 1024 / 1024 < 1;
     console.log(file.size / 1024 / 1024, 'isLt1M==');
     if (file.size / 1024 / 1024 > 2 || file.size / 1024 / 1024 == 2) {
         this.$message.error("上传图片不能超过2M");
         return false;
     }
     else if (!isJpgOrPng) {
         this.$message.error("上传图片只能是 JPG 或 PNG 格式!");
         return false;
     }
     

     return new Promise((resolve) => {

         // 压缩到400KB,这里的400就是要压缩的大小,可自定义
         imageConversion.compressAccurately(file, 600).then((res) => {
             console.log(res, '-----res====');
             resolve(res);
         });

     });


 },

 handleRemove(obj, file, fileList) {
     let index = obj.index;

     this.addList[index].uploadDisabled = false
     this.$forceUpdate()
 },
 handlePictureCardPreview(file) {
     this.dialogImageUrl = file.url;
     this.dialogVisible = true;
 },
 handleAvatarSuccess(obj, res, file) {
     this.imgchecked(obj, res, file).then((data) => {
         //data返回值即为判断结果。
         if (data) {
             let index = obj.index;

             this.addList[index].uploadDisabled = true
             this.addList[index].album = res.data.fullurl
         } else {
             let index = obj.index;
             this.addList[index].fileList = []
             this.addList[index].uploadDisabled = false
             this.addList[index].album = ''
             return
         }
     })
     this.$forceUpdate()

    
    

 },
// zip
handleRemoveZip(file, fileList) {
    console.log(file, fileList, '移走路径');
},
handleAvatarSuccessZip(obj, res, file) {
    console.log(res, file, 'res, file111');
    console.log(res.data.fullurl, '压缩包路径')
    this.zip_file = res.data.fullurl


    let imgList = this.addList
    let index = obj.index;
    this.addList[index].zip = res.data.fullurl

},
handleChangeZip(file, fileList) {
    
},

css .disabled

.disabled .el-upload--picture-card {
   display: none !important;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值