el-tabs嵌套el-upload使用

news2025/1/24 18:03:18

需求:1 .第一个标签展示固定字样,且不能删除,最少上传三张图片。

           2. 其余标签双击可编辑字样,10字以内,可删除,均可上传图片。

           3. +号按钮可点击添加标签,标签数量控制在10个以内。

          4. 当标签下无内容,上传时该标签自动删除。

效果展示:

 

      <el-form-item label-width="185px" label="店铺展示:"  prop="shopImgList"  style="margin-left: 20px;margin-top: 30px;">
        <div style="display: flex">
        <el-tabs
          v-model="name"
          type="card"
          @tab-remove="removeTab"
          :before-leave="beforeLeave"
          style="width: 95%;"
          @keydown.native.capture.stop.self>
          <el-tab-pane
              :label="item.name"
              v-for="(item,index) in ruleForm.shopImgList" :key="index"
              :name="item.seq.toString()"
              :closable="index!=0 && formStatus!=''"
            >
              <template slot="label">
              <span
                @dblclick="tabsContent(item,index)"
              >{{item.name}}
             </span>
              </template>
              <div @click="getImageTypeIndex(index)">
                <el-upload
                  :class="{audit_pict:hideUpload}"
                  ref="upload"
                  action=""
                  :http-request="Picture"
                  show-file-list
                  list-type="picture-card"
                  :on-remove="handleRemove"
                  :before-upload="beforeAvatarUpload"
                  v-if="refreshUploadOSSComp"
                  accept=".jpg,.png,.jpeg"
                  :file-list="item.fileLists"
                  :on-exceed="handleExceed"
                  :on-preview="handlePictureCardPreview">
                  <i class="el-icon-plus"></i>
                </el-upload>
              </div>
            </el-tab-pane>
          <el-tab-pane  key="add" name="add"   v-if="ruleForm.shopImgList.length!=10 && formStatus!=''">
            <span slot="label" style="padding: 8px;font-size:20px">+</span>
          </el-tab-pane >
        </el-tabs>
       </div>
      </el-form-item>

结构:

          shopImgList:[{//门店展示图片集合
            imgUrlList:[],
            fileLists:[],
            seq:1,
            name:"门店展示",
          }],

限制规则:

      let checkDescImgs = (rule, value, callback) => {
        let _this = this;
        let _validatenull = validatenull;
        if(_validatenull(_this.ruleForm.shopImgList) ){
          return callback(new Error('请上传门店宣传信息'));
        }
        if(_this.ruleForm.shopImgList[0].imgUrlList.length < 3){
          return callback(new Error('门店展示必须上传3张'));
        }
        return callback();
      };



shopImgList:[{required: true,  validator: checkDescImgs, trigger: 'blur'}],

生命周期 --- created中回显处理:

        if (!isNull(_this.ruleForm.shopImgList)){
          _this.ruleForm.shopImgList.forEach(data => {
               data['fileLists']=[]
               data.imgUrlList.forEach((item,index)=>{
                 item['imgSrc']= item.imgUrl;
                 item['seq']=index+1
                 const map5 = {};
                 map5['name'] = '';
                 map5['url'] = item.imgUrl;
                 map5['seq'] = index+1
                 data.fileLists.push(map5);
               })
          })
        }else {
          _this.ruleForm.shopImgList=[{//门店展示图片集合
            imgUrlList:[],
            fileLists:[],
            seq:1,
            name:"门店展示",
          }]
        }

知识扩展

阻止键盘默认事件:@keydown.native.capture.stop.self 

方法:

1. 删除标签

        //删除门店展示名称
     removeTab(targetName) {
       let _this=this
       let isNull=validatenull
       if(_this.name==targetName){
         _this.name='1'
       }else if(Number(_this.name)>Number(targetName)){
         _this.name= (Number(_this.name)-1).toString()
       }
       _this.ruleForm.shopImgList.forEach((item, index) => {
         if (item.seq === Number(targetName)) {
           _this.ruleForm.shopImgList.splice(index, 1)
         }
       });
       _this.refreshUploadOSSComp=false
       if (!isNull(_this.ruleForm.shopImgList)){
         _this.ruleForm.shopImgList.forEach((data,idx) => {
           data.fileLists=[]
           data.imgUrlList.forEach((item,i)=>{
             item['seq']=i+1
             const map5 = {};
             map5['name'] = '';
             map5['url'] = item.imgSrc;
             map5['seq'] =i+1;
             data.fileLists.push(map5);
           })
         })
         _this.ruleForm.shopImgList.forEach((data,idx) => {
           data.seq=idx+1
         })
         _this.$nextTick(() => {
           _this.refreshUploadOSSComp = true;
         });
       }
      },

2. 切换事件 与 添加标签

      beforeLeave(currentName, oldName) {
        //重点,如果name是add,则什么都不触发
        if(currentName == "add") {
          this.addTitle()
          return false
        }
        this.arrIndex=Number(currentName)-1
      },
       // 添加门店展示名称
      addTitle() {
        if(this.ruleForm.shopImgList.length < 10){
          this.tagName='新增名称'
          this.formStatus1='create'
          this.dialogFormsVisible=true
          this.form.name=undefined
        }
      },

3. 双击打开标签,编辑内容

        // 编辑名称
      tabsContent(val,index){
        if(index!=0){
          this.tagName='编辑名称'
          this.formStatus1='update'
          this.arrIndex=index
          this.form.name=val.name
          this.dialogFormsVisible=true
        }
      },

4. 点击上传图片时,记录坐标

      getImageTypeIndex(index){
          this.arrIndex=index
       },

上传图片内容过多,忽略

5. 双击编辑标签 --- 弹出弹窗

    <!--    店铺展示添加编辑名称-->
    <el-dialog :title="tagName" :visible.sync="dialogFormsVisible" :modal-append-to-body="false" :close-on-click-modal="false"  append-to-body width="25%">
        <el-form :model="form" :rules="rulesForm" ref="form"  class="demo-ruleForm">
          <el-form-item label="名称" prop="name" label-width="70px">
            <el-input v-model.trim="form.name" maxlength="10" placeholder="限制10个字"  ></el-input>
          </el-form-item>
          <el-form-item style="display: flex;flex-direction: row;justify-content: center;align-items: center">
            <el-button type="primary" @click="submitFormButton('form')">确定</el-button>
            <el-button @click="getClose()">取消</el-button>
          </el-form-item>
       </el-form>
    </el-dialog>
tagName:undefined, //名字
dialogFormsVisible:false,//默认关闭弹窗
form:{
      name:undefined,
     }, //表单
 弹窗 校验规则绑定
 rulesForm:{
     name:[{ required: true,message:'请输入名称', trigger: 'blur'},{
        required: true,
        trigger: "blur",
        validator: (rule, value, callback) => {
        if (!value.split("").some(item => item !== " "))
           return callback(new Error("名称不能为纯空格"));
           return callback();
         }
      }],
   },

6. 弹窗 ---  确定按钮

      // 店铺展示添加编辑名称提交
      submitFormButton(form){
        let _this=this
        _this.$refs[form].validate((valid) => {
          if (valid){
            if(_this.formStatus1=='create'){
              _this.ruleForm.shopImgList.push({//门店展示图片集合
                imgUrlList:[],
                fileLists:[],
                seq:_this.ruleForm.shopImgList.length+1,
                name:_this.form.name,
              })
            }else{
              _this.ruleForm.shopImgList[_this.arrIndex].name=_this.form.name
            }
            _this.dialogFormsVisible=false
          }else{
            _this.showToal('提示', '请先维护必填信息', 'warning');
            return false;
          }
        })
      },

7. 弹窗 --- 取消按钮

      getClose(){
         this.dialogFormsVisible=false
      },

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文学会VSCode代码同步至GitHub

一、上手GitHub 1. 了解GitHub 上手GItHub之前首先要了解一下GItHub的关键词&#xff0c;如下&#xff1a; (1) 仓库 (Repository) 仓库是用来存放项目代码&#xff0c;每一项目对应一个仓库。(2) 收藏 (Star) 收藏别人的仓库&#xff0c;方便自己查找。(3) 复制/克隆项目 (…

忆暖行动|“以前的住宿也没有这么好的环境,住的都是土房子,一下雨就哗哗掉墙皮”

常忆旧时苦 方思今日甜 新年将至&#xff0c;彩灯与烟火闪烁。值此佳节&#xff0c;我们去看望了一位65岁的退休教师&#xff0c;并与她进行了交谈&#xff0c;从奶奶的讲述中&#xff0c;我们了解到过去生活的不易&#xff0c;珍惜当下的美好生活。 迎接新年 为迎接新年&am…

base64、File、Blob、ArrayBuffer几种文件格式介绍以及互转

文章目录 关系介绍BlobFileFileReader二进制数组ArrayBuffer对象URL.createObjectURLbase64 转化file转base64blob转base64base64转blobbaes64转fileblob转fileblob转ArrayBufferfile转ArrayBuffer 关系 介绍 Blob 介绍 是一个不可变、原始数据的类文件对象本质上是js的对象 s…

后悔了怎么办 - undo日志

一、undo日志 概念&#xff1a; 把回滚时所需的东西都给记下来 二、事务id 给事务分配id的时机 &#xff08;1&#xff09;对于只读事务来说&#xff0c;只有在它第一次对某个用户创建的临时表执行增、删、改操作时才会为这个事务分配一 个 事务id &#xff0c;否则的话是不…

4.3 转换与处理时间数据

4.3 转换与处理时间数据 4.3.1 转换字符串时间为标准时间1、Timestamp2、DatetimeIndex或者PeriodIndexDatetimeIndex与PeriodIndex函数及其参数说明 4.3.2 提取时间序列数据信息Timestamp类常用属性及说明 4.3.3 加减时间数据Timedelta类周期名称、对应单位及其说明 4.3.4 任务…

Java知识总结

https://www.bilibili.com/video/BV1ys4y1S7Lc 1、Java中线程的实现方式 为什么说本质上只有一种实现线程的方式&#xff1f;实现 Runnable 接口究竟比继承 Thread 类实现线程好在哪里&#xff1f; 实现 Runnable 接口 public class RunnableThread implements Runnable { O…

ai智能改写文案-ai同义转换

文案创作是现代广告营销中不可或缺的一环&#xff0c;一个好的文案不仅可以提升产品的购买率&#xff0c;还可以实现品牌等方面的推广。但是&#xff0c;文案的创作需要耗费大量的时间和精力&#xff0c;如果能够利用智能化技术进行改写&#xff0c;不仅可以大大缩短文案创作时…

JAVA内存不足导致频繁回收和swap引起的性能问题 故障重现(内存篇2)

背景起因&#xff1a; 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行&#xff08;没经历过大并发考验&#xff09;&#xff0c;然而在一次活动后&#xff0c;人数并发一上来后&#xff0c;系统开始卡。 我按经验开始调优&#xff0c;在每个关键步骤…

本地安装directus

简介 Directus 是用于管理 SQL 数据库内容的实时 API 和 App 控制面板。 API会根据数据库模式/内容的实时更改动态更新&#xff08;无需重新启动服务器&#xff09;。 Directus安装在任何新的或现有的 SQL 数据库之上&#xff0c;提供 API 层&#xff08;REST、GraphQL、JS-SD…

获取商品SKU信息API调用代码展示、请求参数和返回值说明

SKU是什么意思 最小存货单位&#xff08;SKU&#xff09;&#xff0c;全称为stock keeping unit&#xff0c;即库存进出计量的基本单元&#xff0c;可以是以件、盒、托盘等为单位。SKU这是对于大型连锁超市DC&#xff08;配送中心&#xff09;物流管理的一个必要的方法。现在已…

MySQL数据库从入门到精通学习第2天(创建数据库)

创建数据库 通过CREATE DATABASE语句来创建数据库通过CREATE SCHEMA语句来创建数据库通过IF NOT EXISTS进行判断创建 通过CREATE DATABASE语句来创建数据库 创建数据库的语法格式如下&#xff1a; CREATE DATABASE 【数据库名】; 创建数据库的库名跟标识符一样也是有要求的&…

实际项目集成分布式一致性协议 Raft

实际项目集成分布式一致性协议 Raft 文章目录 实际项目集成分布式一致性协议 Raft前言1.raft 是什么&#xff1f;2.SOFAJRaft2.1 功能特性 3.Nacos 分布式一致性设计3.1 nacos 分布式协议架构设计3.1 nacos 用 jraft 做什么3.2 Distro 协议 4.实际项目-Spring 工程4.1 旧版项目…

SA168 3BSE003389R1

SA168 3BSE003389R1 远程终端控制系统&#xff08;RTU&#xff09;可连接到其他设备。RTU可将设备上的电气信号转换为数字的值&#xff0c;例如一个开关或阀开/关的状态&#xff0c;或是仪器量测到的压力、流量、电压或电流。也可以借由信号转换及传送信号来控制设备&#xff0…

硬盘分区怎么分?新手该如何操作?

相信很多电脑用户都遇到过硬盘分区的情况。刚拿到手的新电脑&#xff0c;基本上都是一个或两个磁盘分区&#xff0c;这不满足我们的使用习惯&#xff0c;比如我们在不同的分区存放不同的东西&#xff0c;只有一个分区就很难做到&#xff0c;所以这时候需要进行磁盘分区。那么硬…

解读“SAP集成架构咨询方法论”

如果你是SAP ERP相关工作的&#xff0c;建议大家点开原文地址去看&#xff0c;会学习到其他很多与这个行业更多的资料。 原文地址&#xff1a;解读“SAP集成架构咨询方法论” | SAP Blogs 原文地址&#xff1a;解读“SAP集成架构咨询方法论” | SAP Blogs ——————————…

经验分享:如何有效应对Facebook广告数据波动问题?

Facebook广告作为一种重要的数字营销工具&#xff0c;可以帮助企业和品牌快速获得目标受众的关注和转化。然而&#xff0c;由于广告投放过程的不稳定性&#xff0c;Facebook广告数据波动问题也经常出现。 对于广告主而言&#xff0c;如何应对Facebook广告数据波动问题&#xf…

【JVM】JMM

一、JMM JVM 内存模型是用来屏蔽掉各种硬件和操作系统的内存访问差异&#xff0c;以实现让 Java 程序在各个平台下都能达到一致的内存访问效果。JVM 内存模型规定了所有的共享变量都是存储在主内存&#xff0c;每个线程还有自己的工作内存&#xff0c;线程的工作内存保存了该线…

【教学类-34-01】拼图(运动项目)3*4格子(中班主题《个别化拼图》健康偏艺术-美术)

背景需求&#xff1a; 一个月的Python纸类学具研究中&#xff0c;我发现个别男孩喜欢把作业中的数字、图案、单元格剪成小块&#xff08;小卡片&#xff09;进几周&#xff0c;剪条、剪块的孩子人数也慢慢递增。 幼儿需求&#xff1a;锻炼手指精细动作的需求、或者获得更多物…

Idea+maven+spring-cloud项目搭建系列--13 整合MyBatis-Plus多数据源dynamic-datasource

前言&#xff1a;对于同一个系统&#xff0c;不同的租户需要自己独立分隔的数据库&#xff08;每个数据库的表结构可以是相同的&#xff09;&#xff0c;同时也要支持跨数据源的查询&#xff1b;并且支持分布式事务&#xff0c;如果这里不使用分库分表插件&#xff0c;需要怎样…

python-day4(字符串、列表、生成式和生成器、使用元组、集合、字典)

字符串和常用数据结构 简单用法 所谓字符串&#xff0c;就是由零个或多个字符组成的有限序列&#xff0c;一半记为sa1a2a3…an(0<n<∞)。在python中&#xff0c;如果我们把单个或多个字符用单引号或者双引号包围起来&#xff0c;就可以表示一个字符串。 s1 hello, wo…