v-for循环<el-form-item>时应用popover

在Element-UI的表单组件中,当使用v-for循环渲染多个包含popover的el-form-item时,可能出现popover失效的情况。通过绑定每个popover的引用(ref)和索引(index),可以确保每个popover正确响应。文章提供了一个代码示例,展示了如何在循环中动态绑定popover并使其正常工作。

element-ui使用v-for循环el-form-item,如果循环的每栏都有popover,v-for 渲染多个 popover,
那么使用指令v-popover指向 Popover 的索引ref的方式触发,popover会失效
解决:

    <el-form ref="form" :model="form" label-width="80px">
      <el-row>
        <el-col
          :span="24"
        >
          固定列
        </el-col>
      </el-row>
      <el-form-item label="config0" >
        <el-input v-model="form.config0"></el-input>
      </el-form-item>
      
      <el-row>
        <el-col
          :span="24"
        >
          循环列
        </el-col>
        <div v-for="(item, index) in form.list" :key="index">
          <el-form-item v-if="item.ishow" :label="item.label">
            <el-input v-model="item.content">
              <i slot="prefix" class="el-input__icon el-icon-s-tools"></i>
              <el-popover
                placement="top-start"
                trigger="hover"
                slot="suffix"
              >
                <div>
                  <div>Edit</div>
                  <div>Add</div>
                  <div>Delete</div>
                </div>
                <i slot="reference" class="el-input__icon el-icon-more"></i>
              </el-popover>
            </el-input>
          </el-form-item>
        </div>
      </el-row>
    </el-form>

	  // 数据
      form: {
        config0: 'test',
        list: [
          {
            label: 'config1',
            content: 'despeic',
            ishow: true
          },
          {
            label: 'config2',
            content: 'scapje',
            ishow: true
          },
          {
            label: 'config3',
            content: 'interstiewn', 
            ishow: true
          }
        ],
      },

效果:
popover可以正常使用
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

<div v-for="(process, index) in formData.processes" :key="index" class="process-row" > <el-row :gutter="20"> <!-- 工序名称 --> <el-col :span="3"> <el-form-item :prop="`processes.${index}.processName`" :rules="rules.processName" label="名称" > <el-input v-model="process.processName" placeholder="工序名称" /> </el-form-item> </el-col> <!-- 英语名称 --> <el-col :span="3"> <el-form-item :prop="`processes.${index}.englishName`" :rules="rules.englishName" label="英文名" > <el-input v-model="process.englishName" placeholder="English Name" /> </el-form-item> </el-col> <!-- 流程卡内容 --> <el-col :span="4"> <el-form-item label="流程卡内容"> <el-input v-model="process.cardContent" type="textarea" :autosize="{ minRows: 1, maxRows: 3}" /> </el-form-item> </el-col> <!-- 间参数组 --> <el-col :span="8"> <el-row :gutter="10"> <el-col :span="6"> <el-form-item label="等待(h)" prop="processWatitime"> <el-input v-model="process.processWatitime" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="运行(H)" prop="machineRuntime"> <el-input v-model="process.machineRuntime" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="set_up"> <el-input v-model="process.setuptime" placeholder="min/pcs" /> </el-form-item> </el-col> <el-col :span="6"> <el-form-item label="人工"> <el-input v-model="process.labortime" placeholder="min/pcs" /> </el-form-item> </el-col> </el-row> </el-col> <!-- 单位/数量 --> <el-col :span="3"> <el-row :gutter="10"> <el-col :span="12"> <el-form-item label="单位"> <el-input v-model="process.routerUnit" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="数量"> <el-input v-model="process.quantity" /> </el-form-item> </el-col> </el-row> </el-col> <!-- 状态/代码 --> <el-col :span="3"> <el-row :gutter="10"> <el-col :span="12"> <el-form-item label="状况"> <el-select v-model="process.routerStatus" placeholder="状态"> <el-option v-for="dict in dict.type.router_status" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="代码"> <el-input v-model="process.processCode" /> </el-form-item> </el-col> </el-row> </el-col> <!-- 操作按钮 --> <el-col :span="1"> <el-button type="danger" icon="el-icon-delete" circle @click="removeProcess(index)" /> </el-col> </el-row> </div>修改布局,描述字段在上方,对应数据在下,而且能显示
最新发布
09-28
<el-upload class="custom-uploader" style="display: inline;float:right; margin-top: 10px" action="#" ref="fileupload" :multiple="true" :on-change="change" :limit="10" :auto-upload="false" accept="application/pdf" :show-file-list="false"> <el-button class="upload-btn" size="medium" type="text" plain>附件更新 <i class="el-icon-upload el-icon--right"></i> </el-button> </el-upload> <b class="levelonetitle">附件</b> <div id="visitexcel"> <div> <!-- 表格 --> <el-table id="el-table" :data="localVisitexcelData" v-loading="loading" element-loading-text="加载中,请稍候..." border max-height="540" :header-cell-class-name="headerRow" :row-style="{height:'40px'}" :cell-style="{padding:'7px 0'}"> <!-- <el-table-column prop="附件文件名" label="附件文件名" width="720" align="center"> </el-table-column> --> <el-table-column v-for="(value, key) in localVisitexcelData[0]" :key="key" prop="fileName" label="文件名" align="center" ></el-table-column> <el-table-column label="操作" align="center"> <template slot-scope="scope"> <el-button size="mini" icon="el-icon-view" @click="handleView(scope.$index, scope.row)"> 查阅 </el-button> <!-- 删除按钮漂浮框 --> <el-popover width="160" :ref="`popover-${scope.$index}`" placement="left"> <p>文件删除后无法恢复,请确认 <span style="color:red">删除?</span> </p> <div style="text-align: right; margin: 0"> <el-button type="text" size="mini" @click="scope._self.$refs[`popover-${scope.$index}`].doClose()"> 取消 </el-button> <el-button type="danger" size="mini" @click="handleDelete(scope)">确定</el-button> </div> <el-button type="danger" size="mini" icon="el-icon-delete" style="margin-left:10px" slot="reference">删除</el-button> </el-popover> </template> </el-table-column> </el-table> </div> change (file, fileList) { //验证文件格式 let fileinfo = fileList.pop(); let name = fileinfo.name; let type = name.substring(name.lastIndexOf('.'), name.length); let size = fileinfo.size / 1024; if (type.toLowerCase() === '.pdf' && size < 20000) { this.loading = true; let param = new FormData(); //form 表单 param.append("file", fileinfo.raw); param.append("fileType", "附件"); param.append("id", this.requirementinfo.id); param.append("requirement", this.requirementinfo.requirement); param.append("department", this.requirementinfo.department); param.append("requirementtime", this.requirementinfo.requirementtime); let config = { //multipart/form-data headers: { 'Content-Type': 'multipart/form-data' }, url: "/requirement/requirementinfo/uploadrequirementfile", method: "post", data: param } request(config).then( res => { this.loading = false; let type = res.data.success ? "success" : "error"; this.$message({ showClose: true, message: res.data.msg, type: type, duration: 12000 }); this.getfilenames(); } ).catch(err => { this.loading = false; this.$message({ showClose: true, message: "发生未知错误,请稍候重试", type: "error", duration: 12000 }); }) } else { this.$message({ showClose: true, message: "请选择PDF文件上传,文件大小20M以内", type: "error" }); } getfilenames () { this.localVisitexcelData = [];//表格内容置空,然后在插入 let param = { id: this.requirementinfo.id, requirement: this.requirementinfo.requirement, filetype: "附件" } // console.log('getfilenames 返回的教师信息1:', this.requirementinfo); let config = { url: "/requirement/requirementinfo/getRequirementFileTableData", method: "get", params: param } request(config).then( res => { let data = res.data; let fileNameList = data.list; for (let i = 0; i < fileNameList.length; i++) { let tempname = { fileName: fileNameList[i] }; this.localVisitexcelData.push(tempname); } console.log('localVisitexcelData信息:', localVisitexcelData); }) }, 以上代码本来是想实现将新上传的PDF文件名加到表格中,但是最终呈现出来的效果是el-table重复加载了好几遍文件名,比如原来el-table中有AAA.PDF,现在上传BBB.PDF和CCC.PDF,结果el-table中显示为AAA.PDF、BBB.PDF、CCC.PDF、AAA.PDF、BBB.PDF、CCC.PDF、AAA.PDF、BBB.PDF、CCC.PDF,明明代码中每change一次localVisitexcelData 都被清空了,为什么会出现这个问题
09-02
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值