vue,form+table组合新增编辑弹框,table单元格可编辑,table单元格校验

本文详细描述了如何在Vue应用中使用el-table展示子表数据,每个单元格支持编辑,包括弹框添加新数据、表头筛选、数量校验等功能,以及添加和删除按钮的控制。
摘要由CSDN通过智能技术生成

需求

1、新增数据时跳出弹框,弹框主子表显示
2、主表用form表单显示
3、子表用el-table显示,并且每个单元格都可编辑
4、子表applyQty有校验,applyQty>planQty触发验证消息,在修改每一行的数量的时候给出提示

最终实现样子

在这里插入图片描述

拆解需求 + 具体实现

1、form表单部分

这部分比较好实现,不过多赘述

<el-form :inline="true" class="demo-form-inline" label-position="right" label-width="130px" label-suffix=":" :rules="rules" ref="editForm" :model="editlist">
  <el-row>
    <el-col :span="12">
      <el-form-item label="项目名称" prop="bidName">
        <el-input v-model="editlist.bidName" placeholder="项目名称" clearable style="width: 200px"> </el-input>
      </el-form-item>
    </el-col>
    <el-col :span="12">
      <el-form-item label="类型" prop="outTypeReal">
     <-- DictSelect是自己封装的下拉框的组件,不重要 -->
        <DictSelect :dictType="'type_choose'" :value="editlist.outTypeReal" :isMultiple="false" placeholder="类型" style="width: 200px" @change="typeChange" :isClearable="true"> </DictSelect>
      </el-form-item>
    </el-col>
  </el-row>
</el-form>

2、el-table表格部分

2.1表头渲染

<template v-for="item in tableHeadConfig.headers">
	<template v-if="item.hvisible">
	</template>
</template>

这里循环渲染表头,并且可以在接口返回的数据里配置列是否显示

2.2 表头筛选插槽

<template #header v-if="showFilterRow">
  <headerParam :header="item" :ref="item.colid + '_param'" @children-change="paramChange" @children-enter="paramEnter" :showEmptyItem="showEmptyItem"> </headerParam>
</template>

2.3 单元格不同input输入插槽

<template #default="scope">
	<div class="input-box">
		<el-input size="small" v-model="scope.row[item.colid]"></el-input>
	</div>
</template>

2.4 单元格特殊输入

<-- 用v-if控制哪一列需要单独处理 -->
<-- 下面例:选择时间 -->
<el-date-picker v-model="scope.row[item.colid]" type="date" size="mini" v-if="item.colid === 'reqTime'" style="width: 120px"> </el-date-picker>

2.5 el-table部分完整代码

<el-table
  ref="dataTable"
  :data="tableData"
  border
  style="width: 100%; height: 450px"
  size="mini"
  highlight-current-row
  @header-dragend="widthChanged"
  element-loading-background="rgba(0, 0, 0, 0.5)"
  element-loading-text="正在加载中"
  @current-change="rowSelect"
  @sort-change="sortChange"
  :row-class-name="rowClass"
  :key="randomKey"
  @select="rowsCheck"
>
  <!-- 多选框 -->
  <el-table-column type="selection" width="40" :align="align"></el-table-column>
  <!-- 序列 -->
  <el-table-column label="序列" width="40px" align="center" fixed="left">
    <template #default="scope">
      <span>{{ scope.$index + 1 }}</span>
    </template>
  </el-table-column>
  <!-- 表头数据渲染 -->
  <template v-for="item in tableHeadConfig.headers">
    <!-- 如果列显示 -->
    <template v-if="item.hvisible">
      <el-table-column :prop="item.colid" :label="item.hlabel" :key="item.hlabel" :sortable="item.hsort" :width="item.hwidth" :align="item.align" :fixed="item.fixed" :show-overflow-tooltip="item.tip" header-align="center">
        <template #header v-if="showFilterRow">
          <headerParam :header="item" :ref="item.colid + '_param'" @children-change="paramChange" @children-enter="paramEnter" :showEmptyItem="showEmptyItem"> </headerParam>
        </template>
        <template #default="scope">
          <div class="input-box">
            <el-date-picker v-model="scope.row[item.colid]" type="date" size="mini" v-if="item.colid === 'reqTime'" style="width: 120px"> </el-date-picker>
            <div v-else-if="item.colid === 'applyQty'">
              <div v-if="editlist.busiType === '0' && scope.row.applyQty > scope.row.planQty">
                <el-row type="flex" align="middle" gutter="10">
                  <el-col :span="14">
                    <el-input-number v-model="scope.row.applyQty" controls-position="right" :min="0" :step="1" style="width: 120px" @change="applyQtyBlur"> </el-input-number>
                  </el-col>
                </el-row>
                <el-row>
                  <el-col :span="10">
                    <span style="color: red; font-size: smaller">申请数量不能大于计划数量</span>
                  </el-col>
                </el-row>
              </div>
              <div v-else>
                <el-input-number v-model="scope.row.applyQty" controls-position="right" :min="0" :step="1" style="width: 120px" @change="applyQtyBlur"> </el-input-number>
              </div>
            </div>
            <el-input size="small" v-model="scope.row[item.colid]" v-else></el-input>
          </div>
        </template>
      </el-table-column>
    </template>
  </template>
</el-table>
<-- 页签显示 -->
<el-pagination class="mt_8" v-model:current-page="page.pageNum" v-model:page-size="page.pageSize" small :background="background" layout="total, sizes, prev, pager, next, jumper" :total="page.total" @size-change="sizeChange" @current-change="sizeChange" />

3、控制table表格的添加和删除按钮

#vue部分

<el-form> ... <el-form>
<el-button type="primary" @click="insert">添加</el-button>
<el-button type="danger" @click="delData" v-if="outPlanShow">删除</el-button>
<el-table> ... </el-table>

#js部分
const initTableData = {
	
}
export default {
	data() {
		return {
			tableData: [],
			selectRows: [],
		}
	},
	methods: {
		insert() {
		   const tableData = JSON.parse(JSON.stringify(initTableData))
		   this.tableData.push(tableData)
		 },
		 rowSelect(row) {
	        this.selectRows= row
	     },
	     delData() {
	      if (this.selectRows.length === 0) {
	        this.$message.error('请选择数据')
	      } else {
	        const checkedData = this.selectRows.map((item) => item.index)
	        const tableData = this.tableData
	        this.tableData = tableData.filter((item) => checkedData.indexOf(item.index) === -1)
	      }
	    },
	}
}

4、数量校验

el-input-number无法加插槽,所以需要用div控制

<div v-else-if="item.colid === 'applyQty'">
  <div v-if="scope.row.applyQty > scope.row.planQty">
    <el-row type="flex" align="middle" gutter="10">
      <el-col :span="14">
        <el-input-number v-model="scope.row.applyQty" controls-position="right" :min="0" :step="1" style="width: 120px" @change="applyQtyBlur"> </el-input-number>
      </el-col>
    </el-row>
    <el-row>
      <el-col :span="10">
        <span style="color: red; font-size: smaller">申请数量不能大于计划数量</span>
      </el-col>
    </el-row>
  </div>
  <div v-else>
    <el-input-number v-model="scope.row.applyQty" controls-position="right" :min="0" :step="1" style="width: 120px" @change="applyQtyBlur"> </el-input-number>
  </div>
</div>
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值