Element-ui踩坑

2023-10-27

Element-ui踩坑

验证图片上传

其实 加上 prop就行了,再图上传成功的时候再做个图片验证取消就可以,看着麻烦其实挺简单的

<el-form
          ref="ruleForm"
          label-position="top"
          :model="formData"
          :rules="rules"
        >
          <el-row :gutter="20">
            <el-col :span="24">
              <el-form-item label="营业执照" prop="businessLicense">
                <el-upload
                  action=""
                  :auto-upload="false"
                  :before-upload="beforeAvatarUpload"
                  class="upload-demo"
                  drag
                  :limit="1"
                  :on-change="beforeUploadHandle"
                  :on-exceed="handleExceed"
                >
                  <vab-icon icon="upload-line" style="margin: 40px 0 20px" />
                  <div class="el-upload__text">
                    将文件拖到此处,或
                    <em>点击上传</em>
                  </div>
                </el-upload>
              </el-form-item>
            </el-col>
          </el-row>
        </el-form>

js文件

beforeUploadHandle(file) {
    if (file.type == 'change') return
    const formData = new FormData()
    formData.append('file', file.raw)
    uploadBatch(formData).then(
        (res) => {
            viewsData.formData.businessLicense = res.data[0].url
            ruleForm.value.validateField('businessLicense')
        },
        (err) => {
            console.log(err)
        }
    )
},

vue+element-ui el-table组件内表单验证问题

动态绑定 prop :rechargeCommodityDTOS.’ + $index + ‘.cashAmount’

<el-table :data="popFormData.rechargeCommodityDTOS">
    <el-table-column label="充值金额">
        <template #default="{ row, $index }">
<el-form-item
              :prop="'rechargeCommodityDTOS.' + $index + '.cashAmount'"
              :rules="{
                      required: true,
                      message: '请输入充值金额',
                      trigger: ['blur', 'change'],
                      }"
              >
    <el-input
              v-model="row.cashAmount"
              class="filter"
              placeholder="请输入充值金额"
              type="number"
              />
            </el-form-item>
        </template>
    </el-table-column>
</el-table>

el-table 图片上传

文件变动的时候,用箭头函数接收下file ,再传到文件上传的函数里即可,这样就可以同时将file和row一起放进去了

<el-upload action="" class="upload-demo" :on-change="(file) => { beforeUploadHandle(file, row)}
">

element–table 表格内容不垂直居中

el-table 的 el-table_2_column(相当于原生HTML的TD标签),默认人垂直剧中的,大多数情况下是没有问题的

在这里插入图片描述
但是,单元格内容很长的时候,表格被撑开就自动垂直居中了,不是很美观

解决

cell-class-name=“自定义class名称” ,直接写vertical-align: top; 是没有用的、
vue3 写法
:deep(自定义的clas名称) {
vertical-align: top;
}

刷新就可以了

el-tbale header插入内容

在这里插入图片描述
实现
在这里插入图片描述
代码

<el-table-column label="推广产品" prop="appName">
    <template #header>
      推广产品
      <el-tooltip
        class="box-item"
        content="应用没找到?点击添加新应用"
        effect="dark"
        placement="right"
      >
        <vab-icon
          class="svgIcon"
          icon="add-circle-line"
          @click="addNextAppHandle"
        />
      </el-tooltip>
    </template>
    <template #default="{ row }">
 </template>
</el-table-column>

效果
在这里插入图片描述

el-upload 上传文件没有标识上传成功

对比

异常情况:
在这里插入图片描述
正常情况:
在这里插入图片描述

解决

//页面需要使用到uploadFiles的数据 :prop="uploadFiles"  
<el-upload
                ref="screenshotFile"
                action=""
            :auto-upload="false"
                :limit="9"
                list-type="picture-card"
                :on-change="screenshotOnPreviewHandle"
                :on-exceed="screenshotHandleExceed"
                :on-preview="handlePictureCardPreview"
                :on-remove="screenshotHandleRemove"
               :prop="uploadFiles" 
              >
    </el-upload>
:on-change="screenshotOnPreviewHandle"

screenshotOnPreviewHandle(file, fileList) {
    if (!viewsData.fileTypeList.includes(file.raw.type)) {
        ElMessage.error('请上传JPG或PNG格式的图片')
        fileList.splice(fileList.indexOf(file), 1)
        return false
    } else if (file.size / 1024 / 1024 > 2) {
        ElMessage.error('请上传小于2M的文件')
        fileList.splice(fileList.indexOf(file), 1)
        return false
    }

    const formData = new FormData()
    formData.append('file', file.raw)
    uploadBatch(formData).then(
        (res) => {
            console.log(33333, res, res.data, fileList)
            if (res.data) {
                file.attachUrl = res.data[0].url
                
                //在请求成功后 手动将status状态更新为 success
                file.status = 'success'

                viewsOperate.imgUrlSplicing(fileList, 'balanceTransferUrl') //需求处理请求参数的可以忽略
                
                //显示文件列表
                viewsData.uploadFiles = fileList.map(
                    ({ attachUrl: url, name }) => {
                        return { url, name }
                    }
                )
                
            } else {
                fileList.splice(fileList.indexOf(file), 1)
            }
        },
        (err) => {
            console.log(err)
        }
    )
},

解决检索关键词:el-uploade status,el-upload中的文件列表的生命周期

完美解决el-upload 上传文件失败删除失败解决方案

fileList.splice(fileList.indexOf(file), 1)

el-table 行内编辑上传图片单独校验

validateField(form, index) {
    let result = true
    for (const item of this.$refs[form].fields) {
        if (item.prop.split('.')[1] === index.toString()) {
            this.$refs[form].validateField(item.prop, (error) => {
                if (error !== '') {
                    result = false
                }
            })
        }
        if (!result) break
    }
    return result
},
rowSave(row,index) {
    var i = this.validateField('form', index)
    if(i){
        console.log("校验通过")
    }else{
        return
    }
},

this.$refs.tableDataFrom.validateField(`tableData.${index}.resultImg`)

el-table 根据字段内容自动合并行

在这里插入图片描述

            {
                type: '呼吸器官防护用品',
                name: '随弃式防尘口罩',
                code: '2A',
                isSCaigou: '是',
                text: '用于空气中含氧19.5%以上的粉尘作业环境,防止吸入一般性粉尘,防御颗粒物等危害呼吸系统,对 0.075μ m以上的粉尘过滤效率≥95%'
            },
            {
                type: '呼吸器官防护用品',
                name: '可更换式防尘口罩',
                code: '2B',
                isSCaigou: '否',
                text: '用于空气中含氧19.5%以上的粉尘作业环境,防止吸入一般性粉尘,防御颗粒物等危害呼吸系统(配备可更换防尘过滤元件),对0.075μ m以上的粉尘过滤效率≥95%'
            },
            {
                type: '呼吸器官防护用品',
                name: '防尘过滤元件',
                code: '2C',
                isSCaigou: '是',
                text: '可以滤除空气中颗粒物的过滤元件,对0.075μ m以上的粉尘过滤效率≥95%'
            },
            {
                type: '呼吸器官防护用品',
                name: '医用口罩',
                code: '2D',
                isSCaigou: '否',
                text: '用于医疗机构,对微小带病毒气溶胶或有害微尘的过滤'
            },
        ],
        mergeObj: {},// 用来记录需要合并行的下标
        mergeArr: ['type'], //需要合并的字段[列的字段]

    };
},
mounted() {
    this.getSpanArr(this.tableList);
},
methods:{
    getSpanArr(data) {
      this.mergeArr.forEach((key, index1) => {
        let count = 0; // 用来记录需要合并行的起始位置
        this.mergeObj[key] = []; // 记录每一列的合并信息
        data.forEach((item, index) => {
          // index == 0表示数据为第一行,直接 push 一个 1
          if (index === 0) {
            this.mergeObj[key].push(1);
          } else {
            // 判断当前行是否与上一行其值相等 如果相等 在 count 记录的位置其值 +1 表示当前行需要合并 并push 一个 0 作为占位
            if (item[key] === data[index - 1][key]) {
              this.mergeObj[key][count] += 1;
              this.mergeObj[key].push(0);
            } else {
              // 如果当前行和上一行其值不相等
              count = index; // 记录当前位置
              this.mergeObj[key].push(1); // 重新push 一个 1
            }
          }
        })
      })
    },
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      // 判断列的属性
      if (this.mergeArr.indexOf(column.property) !== -1) {
        // 判断其值是不是为0
        if (this.mergeObj[column.property][rowIndex]) {
          return [this.mergeObj[column.property][rowIndex], 1]
        } else {
          // 如果为0则为需要合并的行
          return [0, 0];
        }
      }
    },
}

解决vue3+element-plus 使用table 展开行时,删除或更新展开行中的数据,展开行自动合闭的问题

问题描述

在使用element-plus 中的table 展开行时,会有这种需求:修改完数据之后,可以直接在展开行中显示出最新的数据。

在这里插入图片描述

解决方法:

可以通过给table 元素添加row-key 属性来优化表格的渲染。

<template>
  <el-table :data="tableData" row-key="id" style="width: 100%">
    <el-table-column type="expand">
      <template #default="props">
        <p>State: {{ props.row.state }}</p>
      </template>
    </el-table-column>
    <el-table-column label="Date" prop="date" />
    <el-table-column label="Name" prop="name" />
  </el-table>
</template>

<script lang="ts">
export default {
  data() {
    return {
      tableData: [
        {
          id: 1,
          date: '2016-05-03',
          name: 'Tom',
          state: 'California'
        },
        {
          id: 2,
          date: '2017-07-01',
          name: 'Bob',
          state: 'California'
        }
      ]
    }
  }
}
</script>

el-table 批量获取选择的行数据

核心:el-table获取已选择的列表 takeBagTableRef.value.store.states.selection.value

takeBagTableRef.value.toggleRowSelection(item) 控制el-table 选择还是为选择

我写的也是参考,根据 获取已选择和选择取消选择的api实现即可,可以支持翻页搜索记忆已经勾选的数据,上面的这两个api是核心业务逻辑

在这里插入图片描述

表格代码

<el-table
          ref="takeBagTableRef"
          border
          :data="dataList"
          row-key="id" //row-key也要加上
          style="width: 100%"
          @select-all="selectAllHandle"
          @selection-change="SelectDataChange"
          >
    <el-table-column
                     fixed="left"
                     :reserve-selection="true"  //  数据刷新后是否保留选项要开启
                     :selectable="tableSelectHandle"
                     type="selection"
                     width="55"
                     />
</el-table>

js方法

tableSelectHandle(row) {
    // 根据结算单状态决定是否可以勾选
    if (viewsData.uniqueId.includes(row.id)) {
        return false
    } else {
        return true
    }
},

// 批量选择表格回调函数
SelectDataChange(ids) {
    console.log('选择的表格', ids)
    if (viewsData.selectedList.length == 0) {
        // 选择的所有数据,用于编辑
        viewsData.selectedList = ids
        viewsData.uniqueId = ids.map((item) => item.id) //提取选择的id
    } else if (ids.length && viewsData.uniqueId.length) {
        ids.forEach((item) => {
            if (!viewsData.uniqueId.includes(item.id)) { //不存在就加
                viewsData.uniqueId.push(item.id)
                viewsData.selectedList.push(item)
                // takeBagTableRef
            }
        })
    }
    console.log('选择后ids', viewsData.uniqueId)
}



// 当用户手动勾选全选 Checkbox 时触发的事件
selectAllHandle(data) {
  viewsData.dataList.forEach((row) => {
      const idIndex = viewsData.uniqueId.indexOf(row.id)
      if (viewsData.uniqueId.includes(row.id)) {
          // takeBagTableRef.value.store.states.selection.value 获取element-plus el-table 的已选择列表
          takeBagTableRef.value.store.states.selection.value.forEach( 
              (item) => {
                  if (item.id == row.id) {
                      takeBagTableRef.value.toggleRowSelection(item) //
                  }
              }
          )

          viewsData.uniqueId.splice(idIndex, 1)

          viewsData.selectedList.splice(idIndex, 1)
      }
  })
},

点击右边已经选择,取消el-table里已经勾选的数据

//可以使用其他循环
takeBagTableRef.value.store.states.selection.value.forEach((item) => {
    if (item.id == row.id) {
    	takeBagTableRef.value.toggleRowSelection(item)
    }
})

取消全选

viewsData.dataList.forEach((row) => {
    const idIndex = viewsData.uniqueId.indexOf(row.id)
    if (viewsData.uniqueId.includes(row.id)) {
        takeBagTableRef.value.store.states.selection.value.forEach(
            (item) => {
                if (item.id == row.id) {
                    takeBagTableRef.value.toggleRowSelection(item)
                }
            }
        )

        viewsData.uniqueId.splice(idIndex, 1)

        viewsData.selectedList.splice(idIndex, 1)
    }
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Element-ui踩坑 的相关文章

随机推荐

  • linux中用crontab命令定时执行scrapy项目

    进入文件所在目录 为了保证此方法可行 我先在所在的目录创建一个测试小demo的脚本 想知道如何执行scrapy项目可以直接跳到后面 vi test sh 编写一个每分钟往当前文件中的test txt中写入111的脚本 编写crontab命令
  • Flutter实现圆形头像的几种方法

    Flutter的ClipRect的使用场景 ClipRect可以用来裁剪容器内部的子元素 以避免超出容器的范围而溢出 常见的应用场景有 将一个图像裁剪成不同形状 如圆形 方形 椭圆等 将一个复杂的控件裁剪成更容易理解的形状 裁剪过大的图片或
  • 基于Transformers的自然语言处理入门【十】-机器翻译

    基于Transformers的自然语言处理入门 十 机器翻译 1 机器翻译背景 2 机器翻译模型训练 1 机器翻译背景 机器翻译 是指使用计算机将一种自然语言转换为另一种自然语言的过程 这里 自然语言是指日常使用的人类语言 如中文 英语 区
  • Java反射的底层原理,以及Java反射的性能分析及优化

    java的反射技术 号称是编程界的九阳神功 也可以说是框架的灵魂 也正是这种反射机制使静态语言的java具备了动态语言的某些特质 就是有了反射 才让java动态 编程的时候更加灵活 能够动态获取信息以及动态调用对象方法 其实 Java基础技
  • 27. 生成CSV文件

    CSV Comma Separated Values 文件中文件字符分隔值 CSV文件以纯文本形式存储表格数据 数字和文本 可以被常见制表工具 excel等 直接读取 目录 1 生成CSV 2 结合django使用csv 2 1 方案1 2
  • vue预渲染prerender-spa-plugin-next 和 vue-meta-info

    prerender spa plugin next实现方法 const defineConfig require vue cli service const PrerenderSPAPlugin require prerender spa
  • 人脸人体同时检测

    from os path import join 6 sets train test trainval val head person glasses hat face mask face 7 classes head person gla
  • SpringMVC常用注解笔记

    SpringMVC常用注解 1 请求映射注解 1 1 Controller注解 6 2 RequestMapping注解 1 3 GetMapping和 PostMapping注解 2 参数绑定注解 2 1 RequestParam注解 2
  • storybook添加全局样式与sass全局变量设置

    storybook组件需要全局样式 只需在 storybook preview js 增加全局样式即可 import src style index scss export const parameters actions argTypes
  • 微型计算机控制理论基础答案,微型计算机控制技术试卷c

    微型计算机控制技术试卷a 潘新民 微型计算机控制技术实用教程 微型计算机控制技术试卷C 一 选择题 本题共10小题 每小题 1 5分 共15分 1 DAC0832的VREF接 5V IOUT1接运算放大器异名端 输入为1000000B 输出
  • 一文教会你:如何使用 HttpRunner v4.0 开展性能测试

    在 HttpRunner v4 0 全新发布 中我们有介绍过 HttpRunner v4 0 期望成为一款专业级的一体化 API 测试工具 特别是针对性能测试能力进行了重大升级 相比于之前的版本 HttpRunner v4 0 在性能测试部
  • C语言中数组名和指针的区别

    关键字 c 注明 转载于新浪 作者名字丢失 魔幻数组名 请看程序 本文程序在WIN32平台下编译 1 include lt iostream gt 2 int main 3 4 char str 10 5 char pStr str 6 c
  • 数据结构——双向循环链表(二)双向动态链表

    双向动态链表才是关键 直接看例子和图示既就可以 主要是自己会画图 然后根据图来写代码 dlist h 头文件 include
  • 自动控制原理知识点梳理——5.线性系统的频域分析法

    前面第二章数学模型有提到频域的频率特性 频率特性也是系统数学模型的一种表达形式 频域分析法是应用频率特性研究线性系统 的一种图解方法 目录 1 知识梳理 逻辑图 2 频率特性的几何表示 2 1 典型环节频率特性曲线的绘制 2 2 幅相频率特
  • 判断实体类对象的属性值是否全部为空(代码+踩坑)

    判断实体类对象的属性值是否全部为空 话不多说 先上代码 public boolean checkObjAllFieldsIsNull Object object 如果对象为null直接返回true if null object return
  • 2019.11.27

    2019 11 27 滑动平均 均值滤波 sliding window 5 impulse fft tmp impulse fft 6k for i 1 sliding window 1 n sliding window impulse f
  • 合宙Air724UG LuatOS-Air LVGL API--对象

    对象 概念 在 LVGL 中 用户界面的基本构建块是对象 例如 按钮 标签 图像 列表 图表或文本区域 属性 基本属性 所有对象类型都共享一些基本属性 Position 位置 Size 尺寸 Parent 父母 Click enable 单
  • Jenkins添加allure测试报告

    构建任务 1 新建item 2 输入任务名称 gt 点击Freestyle project gt 点击确定 3 在任务配置页面对任务进行配置 gt 添加描述 gt 选择高级 4 勾选使用自定义的工作空间 gt 目录输入执行文件的存放路径 5
  • [Pytorch系列-55]:循环神经网络 - 使用LSTM网络对股票走势进行预测

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121665139 目录 第1章 LST
  • Element-ui踩坑

    Element ui踩坑 验证图片上传 其实 加上 prop就行了 再图上传成功的时候再做个图片验证取消就可以 看着麻烦其实挺简单的