Elment ui 动态表格与表单校验 列表数据 组件

组件做个记录,方便以后会用到。

效果:

代码 :

<template>
  <el-dialog title="商品详情" :visible.sync="dialogVisible" width="80%">
    <el-tabs v-model="activeTab">
      <el-tab-pane label="营销表现" name="marketing">
        <div class="boxForm">
          <p class="fz-18 mb-40">营销表现</p>
          <el-form ref="formData" :model="formData" >

            
            <el-table :data="formData.tableData" style="width: 100%">
              <el-table-column label="日期" width="230">
                <template slot="header" slot-scope="scope">
                  <span style="color: red">*</span>日期
                </template>
                <template slot-scope="scope">
                  <el-form-item v-if="scope.row.active"  :prop="'tableData.' + scope.$index + '.date'" > {{ formatDateRange(scope.row.date) }}</el-form-item>
                  <el-form-item
                    v-else
                    :prop="'tableData.' + scope.$index + '.date'" 
                    :rules="[ { required: true, message: '请选择', trigger: 'change' } ]">
                    <el-date-picker v-model="scope.row.date" type="daterange" format="yyyy年MM月dd日"
                      value-format="yyyy-MM-dd" style="width: 100%" required size="mini"></el-date-picker>
                  </el-form-item>
                </template>
              </el-table-column>
              <el-table-column label="成交额" width="200">
                <template slot="header" slot-scope="scope">
                  <span style="color: red">*</span>成交额
                </template>
                <template slot-scope="scope">
                  <el-form-item v-if="scope.row.active" :prop="'tableData.' + scope.$index + '.amount'" > {{ scope.row.amount }} USD</el-form-item>
                  <el-form-item
                    v-else
                    :prop="'tableData.' + scope.$index + '.amount'" 
                    :rules="[ { required: true, message: '请输入', trigger: 'blur' }]"
                  >
                    <el-input-number
                      v-model="scope.row.amount"
                      placeholder="请输入成交额"
                      style="width:110px"
                      :min="0"
                      :precision="2"
                      size="mini"
                      :controls="false"
                    ></el-input-number>
                    USD
                  </el-form-item>
                </template>
              </el-table-column>

              <el-table-column label="订单数">
                <template slot="header" slot-scope="scope">
                  <span style="color: red">*</span>订单数
                </template>
                <template slot-scope="scope">
                  <el-form-item v-if="scope.row.active" :prop="'tableData.' + scope.$index + '.orders'" > {{ scope.row.orders }}</el-form-item>
                  <el-form-item
                    v-else
                    :prop="'tableData.' + scope.$index + '.orders'" 
                    :rules="[ { required: true, message: '请输入', trigger: 'blur' }]"
                  >
                    <el-input-number
                      v-model="scope.row.orders"
                      placeholder="请输入订单数"
                      style="width:120px"
                      :min="0"
                      size="mini"
                      :controls="false"
                    ></el-input-number>
                  </el-form-item>
                </template>
              </el-table-column>

              <el-table-column label="推广次数">
                <template slot="header" slot-scope="scope">
                  <span style="color: red">*</span>推广次数
                </template>
                <template slot-scope="scope">
                  <el-form-item v-if="scope.row.active" :prop="'tableData.' + scope.$index + '.promotions'" > {{ scope.row.promotions }}</el-form-item>
                  <el-form-item
                    v-else
                    :prop="'tableData.' + scope.$index + '.promotions'" 
                    :rules="[ { required: true, message: '请输入', trigger: 'blur' }]"
                  >
                    <el-input-number
                      v-model="scope.row.promotions"
                      placeholder="请输入推广次数"
                      style="width:120px"
                      :min="0"
                      size="mini"
                      :controls="false"
                    ></el-input-number>
                  </el-form-item>
                </template>
              </el-table-column>

              <el-table-column label="操作人">
                <template slot="header" slot-scope="scope">
                  <span style="color: red">*</span>操作人
                </template>
                <template slot-scope="scope">
                  <el-form-item v-if="scope.row.active" :prop="'tableData.' + scope.$index + '.operator'" > {{ showoperation(scope.row.operator) }}</el-form-item>
                  <el-form-item
                    v-else
                    :prop="'tableData.' + scope.$index + '.operator'" 
                    :rules="[ { required: true, message: '请选择', trigger: 'change' }]"
                  >
                    <el-select v-model="scope.row.operator" placeholder="请选择" size="mini" style="width:120px">
                      <el-option
                        v-for="item in options"
                        :key="item.value"
                        :label="item.label"
                        :value="item.value">
                      </el-option>
                    </el-select>
                  </el-form-item>
                </template>
              </el-table-column>




              <el-table-column label="操作">
                <template slot-scope="scope">
                  <el-button type="text" @click="handleAdd(scope.$index)" v-if="scope.$index == 0">添加</el-button>
                  <el-button type="text" @click="handleEdit(scope.$index)" v-if="scope.row.active">编辑</el-button>
                  <el-button type="text" @click="handleDel(scope.$index)" v-if="scope.$index !== 0" style="color:red;">删除</el-button>
                  
                </template>
              </el-table-column>
            </el-table>
            <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
              :current-page="currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="pageSize"
              layout="total, sizes, prev, pager, next, jumper" :total="formData.tableData.length"></el-pagination>
          </el-form>
        </div>
      </el-tab-pane>
    </el-tabs>
    <span slot="footer" class="dialog-footer">
      <el-button type="primary" @click="saveOrUpdate">保存更新</el-button>
      <el-button @click="dialogVisible = false">取消</el-button>
    </span>
  </el-dialog>
</template>

<script>

export default {
  data() {
    return {
      dialogVisible: true,
      activeTab: 'marketing',
      options: [],
      formData: {
        tableData: [
          { date: '', amount: '', orders: '', promotions: '', operator: '', active: false, key: Date.now() },
        ],
      },
      operators: [
        { label: 'Operator 1', value: '1' },
        { label: 'Operator 2', value: '2' },
        { label: 'Operator 3', value: '3' }
      ],
      currentPage: 1,
      pageSize: 10,
      rules: {
        date: [{ required: true, message: '请输入日期', trigger: 'blur' }],
        amount: [{ required: true, message: '请输入成交额', trigger: 'blur' }],
        orders: [{ required: true, message: '请输入订单数', trigger: 'blur' }],
        promotions: [{ required: true, message: '请输入推广次数', trigger: 'blur' }],
        operator: [{ required: true, message: '请选择操作人', trigger: 'change' }]
      }
    };
  },
  created () {
    this.getOperationUser()
  },
  methods: {


    // 认领人
    async getOperationUser () {
      let res = await this.$api.operationUser()
      if (res.code === 10000) {
        this.options = res.data.length
        ? res.data.map((i) => {
            return { ...i, label: i.username, value: i.id }
          })
        : []
      } else {
        this.$message({ type: 'error', message: res.message })
      }
    },


    handleAdd(index) {
      this.formData.tableData.splice(index + 1, 0, { date: '', amount: '', orders: '', promotions: '', operator: '', active: false, key: Date.now() })
    },

    handleDel(index) {
      this.formData.tableData.splice(index, 1)
    },



    // 编辑
    handleEdit(index) {
      this.formData.tableData[index].active = false
    },
    handleSizeChange(size) {
      this.pageSize = size;
      this.currentPage = 1; 
    },
    handleCurrentChange(page) {
      this.currentPage = page;
    },
    saveOrUpdate() {
      this.$refs['formData'].validate((valid) => {
          if (valid) {
            console.log('校验通过')
            this.formData.tableData.map(item => {
              item.active = true
              return item
            })
          }
      })
    },

    showoperation(id) {
      let result = this.options.find(item => item.value === id);
      return result ? result.label : null;
    },
    // 日期转换
    formatDateRange (dateRange) {
      const startDate = new Date(dateRange[0]);
      const endDate = new Date(dateRange[1]);
      const newStartDate = new Date(startDate.getTime() + 39 * 24 * 60 * 60 * 1000); // 加上39天
      const newEndDate = new Date(endDate.getTime() + 39 * 24 * 60 * 60 * 1000); // 加上39天
      const formattedStartDate = `${newStartDate.getFullYear()}.${(newStartDate.getMonth() + 1).toString().padStart(2, '0')}.${newStartDate.getDate().toString().padStart(2, '0')}`;
      const formattedEndDate = `${newEndDate.getFullYear()}.${(newEndDate.getMonth() + 1).toString().padStart(2, '0')}.${newEndDate.getDate().toString().padStart(2, '0')}`;
      return `${formattedStartDate}-${formattedEndDate}`;
    },

  }
};
</script>
<style lang='scss' scoped>
.boxForm {
  box-shadow: rgb(59 59 59 / 10%) 0px 2px 6px 0px;
  border-radius: 8px;
  margin: 4px;
  padding: 20px;
  margin-top: 10px;
}
::v-deep .el-table .cell{
  height: 54px;
} 
::v-deep .el-table th .cell {
  height: 22px !important;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十二章:预处理命令

文章目录 第十二章&#xff1a;预处理命令宏定义无参宏定义带参数的宏定义 文件包含处理 第十二章&#xff1a;预处理命令 作用&#xff1a;由编译预处理程序对程序中的特殊命令作出解释&#xff0c;以产生新的源程序对其进行正式编译 C语言与其他语言的重要区别就是可以使用预…

环境温度对测量平板有什么影响

环境温度可以对测量平板有影响。温度变化可以导致平板的尺寸发生变化。根据热膨胀原理&#xff0c;当环境温度升高时&#xff0c;平板的尺寸会扩大&#xff1b;当环境温度降低时&#xff0c;平板的尺寸会缩小。这种尺寸变化可能会导致测量结果的误差。因此&#xff0c;在测量平…

OSCP靶场--RubyDome

OSCP靶场–RubyDome 考点(CVE-2022-25765 suid ruby提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV 192.168.249.22 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-29 00:28 EDT Nmap scan report for 192.168.249.22 Hos…

mysql 常见运算符

学习了mysql数据类型&#xff0c;接下来学习mysql常见运算符。 2&#xff0c;常见运算符介绍 运算符连接表达式中各个操作数&#xff0c;其作用是用来指明对操作数所进行的运算。运用运算符 可以更加灵活地使用表中的数据&#xff0c;常见的运算符类型有&#xff1a;算…

阿里云魔搭发起“ModelScope-Sora开源计划”,将为中国类Sora模型开发提供一站式工具链

在2024年3月23日的全球开发者先锋大会上&#xff0c;阿里云的魔搭社区宣布了一个新计划&#xff1a;“ModelScope-Sora开源计划”。这个计划旨在通过开源方式&#xff0c;帮助中国在Sora模型类型上做出更多创新。这个计划提供了一整套工具&#xff0c;包括处理数据的工具、多模…

【御控物联】 IOT异构数据JSON转化(场景案例一)

文章目录 前言技术资料 前言 随着物联网、大数据、智能制造技术的不断发展&#xff0c;越来越多的企业正在进行工厂的智能化转型升级。转型升级第一步往往是设备的智能化改造&#xff0c;助力设备数据快速上云&#xff0c;实现设备数据共享和场景互联。然而&#xff0c;在生产…

车道线检测_Canny算子边缘检测_1

Canny算子边缘检测&#xff08;原理&#xff09; Canny算子边缘检测是一种经典的图像处理算法&#xff0c;由John F. Canny于1986年提出&#xff0c;用于精确、可靠地检测数字图像中的边缘特征。该算法设计时考虑了三个关键目标&#xff1a;低错误率&#xff08;即尽可能多地检…

衰老抑制剂原知因起源金NMN热销,“海弗里克极限”将被打破?

美国著名生物学家列奥纳多 海弗里克 , 在 1961 年研究人类胎儿的细胞群体分裂次数时提出了著名的 " 海弗里克极限 " 理论。该理论认为 , 正常细胞分裂的周期是 2-3 年 , 分裂次数大概是 50 次 , 得出人类的极限寿命高达 150 岁。半个世纪后 , 世界上最长寿的人 , 打…

ssm 科研奖励申报管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 科研奖励申报管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用…

拆分巨石:将MVPS和MVAS应用于遗留应用程序——可持续架构(六)

前言 MVP 和 MVA 的概念不仅适用于新应用程序&#xff1b;它们提供了一种新颖的方式来审视对遗留系统的范围变更&#xff0c;以防止过快地承担过多的变化 - 参见图1。MVA 可以帮助组织评估和更新其技术标准&#xff0c;通过展示新技术如何真正对支持 MVP 至关重要。创建 MVA 可…

Flutter 使用 AndroidStudio 给(Android 安卓)进行签名方法

一、使用 AndroidStudio 创建签名 使用 AndroidStudio 打开 Flutter项目中的 android 文件夹首次打开 AndroidStudio 会加载一会。菜单栏 &#xff1a; Build -> Generate Signed Bundle APK... 选中 APK -> Next点击Create new....下面按照需求填写即可- 文件夹选择 项…

绿联 安装Uptime Kuma - 一款开源的服务器监控和状态检测工具

Uptime Kuma 功能简介 Uptime Kuma 是一款开源的服务器监控和状态检测工具&#xff0c;它帮助您跟踪服务器的可用性、性能和健康状态。 主要功能&#xff1a; 服务器监控 Uptime Kuma 可以监控多个服务器&#xff0c;包括 Web 服务器、数据库服务器、应用程序服务器等。 它会定…

element-ui-plus el-tree 树形结构如何自定义内容

element-ui-plus el-tree 树形结构如何自定义内容 本文提及的 elementUI 版本 为 elementUI Plus 版本 一、需求 项目中遇到一个需要设置权限的地方&#xff0c;但目录和权限是放在一起的&#xff0c;这样就很不好区分类别&#xff0c;为了区分类别&#xff0c;就需要自定义树…

前端bugs

问题&#xff1a; Failed to load plugin typescript-eslint declared in package.json eslint-config-react-app#overrides[0]: Cannot find module eslint/package.json 解决&#xff1a; google了一晚上还得是chatgpt管用 运行以下命令【同时还要注意项目本身使用的Node版…

【spring】@Primary注解学习

Primary介绍 Primary 是 Spring 框架中的一个注解&#xff0c;用于在多个相同类型的 bean 中指定一个默认的 bean。当 Spring 容器在自动装配时遇到类型冲突&#xff0c;即存在多个相同类型的 bean 时&#xff0c;如果没有使用 Qualifier 或其他方式指定具体的 bean&#xff0…

AI计算平台设计方案:901-基于3U VPX的图像数据AI计算平台

一、产品概述 设备基于3U VPX的导冷结构&#xff0c;集成FPGA接口预处理卡&#xff0c;GPU板卡、飞腾ARM处理卡&#xff0c;实现光纤、差分电口或者Camera link的图像接入&#xff0c;FPGA信号预处理&#xff0c;GPU AI计算&#xff0c;飞腾ARM的采集管理存储。 二、系统…

Linux基础命令篇:操作系统服务管理(systemctl service)

Linux基础命令篇&#xff1a;操作系统服务管理&#xff08;systemctl & service&#xff09; service和systemctl是两个用于管理Linux系统服务的命令。它们分别属于SysV init和systemd系统&#xff0c;这两个系统是Linux中用于初始化和管理服务的不同框架。在许多现代Linux…

visual studio报:引发的异常:“System.DllNotFoundException”(位于 ConsoleCAN1.exe 中)

最近在重构CAN通信的代码&#xff0c;把论文中的java转为C#实现&#xff0c;由于某种原因&#xff0c;java不能复现&#xff0c;所以转为c#。 然而c#的重构过程遇到许多问题&#xff0c;因为两种语言的编程方式、线程等等实现上有所差异。 其中一个错误&#xff1a; 引发的异…

绿联 安装PDF工具

这是一个强大的本地托管的基于 Web 的 PDF 操作工具&#xff0c;使用 docker&#xff0c;允许您对 PDF 文件执行各种操作&#xff0c;例如拆分、合并、转换、重组、添加图像、旋转、压缩等。这个本地托管的 Web 应用程序最初是 100% ChatGPT 制作的应用程序&#xff0c;现已发展…

什么是搜索引擎(SEO)爬虫它们是如何工作的?

什么是搜索引擎&#xff08;SEO&#xff09;爬虫&它们是如何工作的&#xff1f; 你的网站上有蜘蛛&#x1f577;️。别抓狂&#xff01;我说的不是真正的八条腿的蜘蛛&#x1f577;️。 我指的是搜索引擎优化爬虫。他们是实现SEO的机器人。每个主要的搜索引擎都使用爬虫来…