vue2 el-table新增行内删除行内(两种写法)里面第一个是树组件,第二个是数字组件,第一个数组件只能勾选最后一个节点

第一种

<template><div class="time_table"><div style="margin-bottom: 10px"><el-button @click="addRowFn">新增</el-button></div><el-form ref="costForm" :model="formData"><el-table :data="formData.tableData" style="width: 100%" :value="tableData"><el-table-column prop="productId" label="所属产品(集成选非产线)" type="productId"><template #header><span style="color: red; margin-right: 4px">*</span><span>所属产品(集成选非产线)</span></template><template slot-scope="scope"><div v-if="!selectSure"><div style="display: flex; justify-content: space-between"><div> {{ scope.row.productId }} </div><div v-if="scope.$index != cellIndexInput" @click="gropeFn(scope, scope.row)"><el-icon class="el-icon-search"></el-icon></div></div></div><div v-if="scope.row.productId == '' || scope.row.productId == null"><div class="titelno-style">{{ `请填写所属产品` }}</div></div><div v-if="scope.$index == cellIndexInput && tableId == scope.row.id" style="display: flex; justify-content: space-between"><div class="about"><el-selectv-model="selectValue"placeholder="请选择":popper-append-to-body="false"@remove-tag="removetag"@clear="clearall"clearablefilterablecollapse-tagsref="select"@change="changelabel"><el-input style="width: 260px; margin: 10px" placeholder="输入关键字进行过滤" v-model="filterText"> </el-input><el-option :value="selectTree" class="setstyle" disabled><el-tree:filter-node-method="filterNode":data="list"@node-click="handleNodeClick":props="defaultProps"ref="tree"node-key="id"default-expand-allhighlight-current></el-tree></el-option></el-select></div></div><div v-if="scope.$index !== cellIndexInput && selectSure"><div style="display: flex; justify-content: space-between"><div> {{ scope.row.productId }} </div><div v-if="scope.$index != cellIndexInput" @click="gropeFn(scope, scope.row)"> <el-icon class="el-icon-search"></el-icon> </div></div></div></template></el-table-column><el-table-column prop="productMoney" label="产品金额" type="productMoney"><template #header><span style="color: red; margin-right: 4px">*</span><span>产品金额</span></template><template slot-scope="scope"><div v-if="!numberSure"><div style="display: flex; justify-content: space-between"><div> {{ scope.row.productMoney | currencyFormat }} </div><div v-if="scope.$index != cellIndexnumber" @click="gropesFn(scope, scope.row, scope.row.productMoney)"><el-icon class="el-icon-search"></el-icon></div></div></div><div v-if="scope.row.productMoney == '' || scope.row.productMoney == null"><div class="titelno-style">{{ `请填写所属金额` }}</div></div><div v-if="scope.$index == cellIndexnumber && tablelistId == scope.row.id" style="display: flex; justify-content: space-between"><inputNumberA:values="values":newDates="newDates":rowinputNumber="rowinputNumber"@close="closeinputNumberFn"@change="changeinputNumberFn"></inputNumberA><!-- <el-form-item :prop="`tableData.${scope.$index}.productMoney`" :rules="[{ required: true, message: '请输入' }]"><el-input v-model.trim="scope.row.productMoney" @keyup.native="handleNumberType" style="width: 250px" placeholder="请输入"></el-input></el-form-item> --></div><div style="display: flex; justify-content: space-between" v-if="scope.$index !== cellIndexnumber && numberSure"><div>$ {{ scope.row.productMoney | currencyFormat }} </div><div @click="gropesFn(scope, scope.row)"><el-icon class="el-icon-search"></el-icon></div></div></template></el-table-column><el-table-column prop="answer" label="操作"><template slot-scope="scope"><el-button @click="delOptionFn(scope.$index, tableData)">删除</el-button></template></el-table-column></el-table></el-form></div>
</template><script>
import inputNumberA from './inputNumber.vue'function filterTreeData(treeData) {return treeData.filter((item) => {if (isNotEmpty(item.children)) {item.disabled = trueitem.children = filterTreeData(item.children)}return item})
}
function isNotEmpty(arr) {return arr && Array.isArray(arr) && arr.length > 0
}
function addToTreeFn(treeData, type1) {treeData.forEach((node) => {if (node.children && node.children.length > 0) {addToTreeFn(node.children, type1)} else {node.sos = type1}})
}export default {name: 'timeTable',props: {value: {type: Array,default: () => [{}],},},components: {inputNumberA,},data() {return {dialogVisible: true,selectValue: '',selectTree: [],expandedList: [],filterText: '', //input搜索rowinputNumber: {},list: [],defaultProps: {children: 'children',label: 'label',},nameValue: '',defaultValue: [], //tree唯一的idvalues: '',newDates: {},formData: {// tableData: [...this.value],tableData: [],},tableId: '',cellIndexInput: null,cellIndexnumber: null,prodectmark: null,options: [], //节点下拉框数据selectSure: false,numberSure: false,tablelistId: '',//验证规则rules: {// productId: [//   {//     required: true,//     message: '请输入姓名',//     trigger: ['blur', 'change'],//   },// ],sex: [{required: true,message: '请选择性别',trigger: ['blur', 'change'],},],},tableData: [],}},watch: {tableData: {handler(newval) {this.$emit('input', newval)},deep: true,},selectValue(newValue) {this.changelabel(newValue)},// 搜索filterText(val) {this.$refs.tree.filter(val)},value: {handler(newval) {this.handleFn(newval)console.log(newval, 'newval_____')},deep: true,},},created() {console.log(this.value, 'yyiyyyyyyyyyyyyy')// this.fetchEntryTimeDic()// this.listFn()this.treeFn()},methods: {handleFn(val) {// this.formData.tableData = val// const v = val// const vo = v.map((item) => {//   return { productId: item.productName, productMoney: item.productMoney, productName: item.productId }// })this.formData.tableData = val},changelabel(val) {console.log('changelabel----', val)},// 下拉框移除removetag() {this.$refs.tree.setCheckedKeys([])},// 可清空的单选模式下用户点击清空按钮时触发clearall() {this.selectTree = []this.$nextTick(() => {this.$refs.tree.setCheckedNodes([])})},handleNodeClick(data, node) {let arr = []if (data.sos === '1') {arr.push(data)this.selectTree = arr[0]this.selectValue = this.selectTree.labelthis.$nextTick(() => {if (this.selectValue !== '') {this.$emit('treechagelist', this.selectTree, this.row1)this.cellIndexInput = null}})}},// 模糊查询(搜索过滤),实质为筛选出树形控件中符合输入条件的选项,过滤掉其他选项filterNode(value, data) {console.log(value, 'kkkkkkkkkkkkkkkk')if (!value) return truelet filterRes = data.label.indexOf(value) !== -1return filterRes},treeFn() {// 接口treeAPI().then((res) => {this.list = resthis.selectValue = ''addToTreeFn(this.list, '1')filterTreeData(this.list)})},gropeFn(v, row) {console.log(row, v, 'gropeFn-----------', row.productId)this.selectValue = row.productIdconsole.log(this.selectValue, ' this.selectValue ')this.selectSure = truethis.tableId = row.idthis.cellIndexInput = v.$indexthis.rows = rowthis.row1 = vconsole.log(row.id, ' row.id')},gropesFn(v, row, i) {console.log(v, row, 'gropesFn', i)this.numberSure = truethis.tablelistId = row.idthis.cellIndexnumber = v.$indexthis.values = ithis.newDates = v},//表格的单元格单机  --->  将每行的isEdit改成truerowClickFn(row, column, event) {this.$set(row, 'isEdit', true)},// 新增addRowFn() {this.formData.tableData.unshift({productMoney: '',productId: '',productName: '',})this.selectValue = ''},// 下面的数据保存addFn(id, tableData) {tableData.orderNum = Number(tableData.orderNum)// 存起来数据localStorage.setItem('tableData', JSON.stringify(tableData)),// 取出来localStorage.getItem('tableData')this.tableData = JSON.parse(localStorage.getItem('tableData'))this.tableData.forEach((item) => {item.orderNum = Number(item.orderNum)})if (!tableData[id].productMoney) {return this.$message.error('请您填写描述信息哦~')}},delOptionFn(index) {this.formData.tableData.splice(index, 1)},async upOption(row) {console.log(row)},closeinputNumberFn() {this.handleChange()},handleChange() {this.inputNumberSure = falsethis.cellIndexNumber = null},changeinputNumberFn(val, v, row) {this.$emit('inputnumberchagelist', Number(val), row)this.cellIndexnumber = null},handleClose() {this.dialogVisible = false},},
}
</script><style lang="scss" scoped>
/* ::v-deep.el-table--fit {border-right: 0;border-bottom: 0;margin-left: -55px;
} */
.titelno-style {color: red;font-size: 8px;
}
.setstyle {min-height: 200px;padding: 0 !important;margin: 0;overflow: auto;cursor: default !important;
}
</style>

inputNumber.vue文件

<template><div class="cell-input-number"><input type="number" class="cell-input-inner" ref="inputEl" size="mini" v-model.trim="newValue" @blur="handleBlur" :min="mins" :max="maxs" /></div>
</template><script>
export default {props: {values: {type: [String, Number],required: false,default: '',},rowinputNumber: {type: Object,default: () => {},},newDates: {type: Object,default: () => {},},},data() {return {newValue: '',currentHeight: this.height,mins: 0,maxs: 0,}},created() {console.log(this.rowinputNumber, 'rowinputNumberrowinputNumber')},mounted() {this.newValue = this.values// 用户双击后,让其处于获取焦点的状态this.$refs.inputEl.focus()},methods: {formatInput(val) {console.log(val, 'hhhhhhhhhhhhhhhhhhhh')},parseInput() {},checknum() {},numberChangeFn(event) {console.log(event, 'yyyyyyy')},handleInput(event) {console.log(event, 'event')const { values, selectionStart, selectionEnd } = event.target// 只保留数字和小数点let pureValue = values.replace(/[^\d.]/g, '')// 如果小数点超过一个,只保留第一个const idx = pureValue.indexOf('.')if (idx !== -1 && pureValue.indexOf('.', idx + 1) !== -1) {pureValue = pureValue.slice(0, idx + 1) + pureValue.slice(idx + 1).replace(/\./g, '')}// 如果小数点在开头,前面加 0const isBeginningWithDot = pureValue[0] === '.'let newValue = isBeginningWithDot ? `0${pureValue}` : pureValue// 根据光标位置修改输入值const num = Number(newValue)if (num > 0 && selectionStart !== selectionEnd) {const start = Math.max(selectionStart, newValue.indexOf(num))const end = Math.min(selectionEnd, newValue.indexOf(num) + String(num).length)newValue = newValue.slice(0, start) + num + newValue.slice(end, newValue.length)}// 更新输入框中的值和组件中的值event.target.values = newValuethis.newValue = newValue},handleBlur() {if (this.newValue !== this.values) {if (this.newValue === '') {this.newValue = 0}this.$emit('change', this.newValue, this.rowinputNumber, this.newDates)}this.$emit('close')},},
}
</script><style lang="scss">
.cell-input-number {width: 100%;height: 100%;background-color: #fff;font-size: inherit;box-shadow: 0 0 24px #0000002e;.cell-input-inner {margin: 0;padding: 2px 8px;font-size: inherit;border: none;outline: none;width: 100%;height: 100%;background-color: transparent;line-height: 23px;resize: none;overflow: hidden;white-space: pre-wrap;word-break: break-all;font-family: inherit;box-sizing: border-box;}
}
</style>

父页面

拿到数据传递给子去,然后进项本地储存 ,监听

    inputnumberchagelistFn(i, row) {this.$set(this.value[row.$index], 'productMoney', i)localStorage.setItem('mutate-1', JSON.stringify(this.value))},treechagelistFn(i, row) {this.$set(this.value[row.$index], 'productId', i.label)localStorage.setItem('mutate-1', JSON.stringify(this.value))this.$set(this.value[row.$index], 'id', i.id)},

第二种写法

<template><div class="time_table"><el-card style="margin-bottom: 20px"><div slot="header" class="clearfix"><el-button type="text" @click="newlyAddedFn">新增</el-button></div><el-table border :data="tableData" style="width: 100%" :value="tableData"><el-table-column label="序号" width="100px" align="center"><template slot-scope="scope">{{ scope.$index + 1 }}</template></el-table-column><el-table-column prop="productId" label="xxxxx"><template slot-scope="scope"><el-select:filter-method="filterMethod"filterable:ref="'productId' + scope.$index"v-model="tableData[scope.$index]['productId']"placeholder="请选择文档类别"clearable><el-option :value="tableData[scope.$index]['productId']" style="height: auto"><el-tree:filter-node-method="filterNode":ref="'categoryNameTree' + scope.$index":data="data"node-key="id":props="defaultProps"@node-click="getTypeList(scope.$index, scope)":expand-on-click-node="false"default-expand-all><span slot-scope="{ node }">{{ node.label }}</span></el-tree></el-option></el-select><div style="color: red; font-size: 12px" v-if="JSON.stringify(scope.row) == '{}' || scope.row.productId == ''"> 请选择所属产品(集成选非产线) </div></template></el-table-column><el-table-column prop="productMoney" label="产品金额" :sortable="true"><template slot-scope="scope"><el-input type="number" v-model="scope.row.productMoney" placeholder="请输入数字"> </el-input><divstyle="color: red; font-size: 12px"v-if="JSON.stringify(scope.row) == '{}' || scope.row.productMoney == null || scope.row.productMoney == 0 || scope.row.productMoney == ''">请输入产品金额</div></template></el-table-column><el-table-column prop="answer" label="操作" width="100px"><template slot-scope="{ row }"><el-button type="text" @click="delOption(row, tableData)"><span style="color: red">删除</span></el-button></template></el-table-column></el-table><div class="money-style"><div class="amount-to-style">合计:</div><div class="total-quotation-style">{{ preSignMoney | currencyFormat }}</div></div></el-card></div>
</template><script>export default {name: 'induction',props: {value: {type: Array,default: () => [],},},data() {return {preSignMoney: '',categoryId: null,tableData: [{}],options: [],data: [],dialogVisible: false,defaultProps: {children: 'children',label: 'label',},}},created() {this.getListFn()this.tableData = this.value},watch: {tableData: {handler(newval) {this.$emit('input', newval)this.countFn(newval)},deep: true,},value(val) {this.tableData = val},},methods: {countFn(data) {const total = data.reduce((accumulator, currentItem) => {return Number(accumulator) + Number(currentItem.productMoney)}, 0)this.preSignMoney = total},// 新增newlyAddedFn() {this.tableData.unshift({ productMoney: '', productId: '', productName: '' })},// 删除delOption(index, data) {data.splice(index, 1)},getListFn() {treeAPI().then((res) => {this.data = res})},filterNode(value, data) {if (!value) return truereturn data.label.indexOf(value) !== -1},filterMethod(value) {this.$refs.tree.filter(value)},clearValue() {this.$refs.tree.setCurrentKey(null)},getTypeList(index, row) {console.log(index, 'ccvcv', row)// .getCurrentKey()获取到当前要选择节点的key值// 使用此方法必须设置 node-key 属性,若没有节点被选中则返回 nullconst nodeId = this.$refs['categoryNameTree' + index].getCurrentKey()// .getNode(nodeId) 根据 data 或者 key 拿到 Tree 组件中的 nodeconst node = this.$refs['categoryNameTree' + index].getNode(nodeId)if (node.childNodes.length === 0) {// 根据index给当前元素的categoryName参数赋值this.$set(this.tableData[index], 'productId', node.label)this.$set(this.tableData[index], 'label', node.data.id)// 此时页面上已经可以动态选择// 这一步是通过判断当前元素的v-model是否有值来控制el-option是否隐藏if (this.tableData[index].productId) {// .blur()用来隐藏当前展开的下拉选择框this.$refs['productId' + index].blur()}} else {this.$message({message: '请勾选子级',type: 'warring',})}},},
}
</script>
<style lang="scss" scoped>
.money-style {height: 46px;font-size: 16px;// margin-top: 20px;border-right: 1px solid #d9dbe0;border-left: 1px solid #d9dbe0;border-bottom: 1px solid #d9dbe0;line-height: 23px;display: -webkit-box;.amount-to-style {width: 50%;text-align: center;line-height: 44px;border-right: 1px solid #d9dbe0;}.total-quotation-style {text-align: center;line-height: 44px;width: 50%;}
}
</style>

父页面

   inputChange(val) {this.tablesProps = val},

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArcGIS Pro字段编号相关代码

字段属于SHP文件的重要组成部分&#xff0c;在某些时候需要对字段进行编号&#xff0c;这里为大家介绍一下字段编号相关的代码&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数据&#xff0c;除了POI数据&#xff0c;常见的GIS数据都可…

WPF布局面板

StackPanel StackPanel 是一种常用的布局控件,可以支持水平或垂直排列,但不会换行。当子元素添加到 StackPanel 中时,它们将按照添加的顺序依次排列。默认情况下,StackPanel 的排列方向是垂直的,即子元素将从上到下依次排列。可以使用 Orientation 属性更改排列方向。可以…

后端登录校验

文章目录 登录校验CookieSessionJWT生成JWT校验JWT基于JWT进行身份验证CSRF Cookie、Session、Token的区别&#xff1f;过滤器(Filter)配置过滤器过滤器链 登录校验 由于HTTP协议是无状态的&#xff0c;我们在进行登录后等一系列接口请求是无法直接区分是哪一个用户的发给服务…

SpringBoot 使用定时任务(SpringTask)

Spring3.0以后自带的task&#xff0c;可以将它看成一个轻量级的Quartz&#xff0c;而且使用起来比Quartz简单许多。 使用步骤&#xff1a; 1.导入坐标 在spring-boot-starter-web坐标中&#xff0c;就包含了SpringTask&#xff0c;所以一般的Web项目都包含了。 <depende…

UE4 C++ 静态加载类和资源

静态加载类和资源&#xff1a;指在编译时加载&#xff0c;并且只能在构造函数中编写代码 .h //增加所需组件的头文件 #include "Components/SceneComponent.h" //场景组件 #include "Components/StaticMeshComponent.h" //静态网格体组件 #include &qu…

ES6-对象的解构赋值

一、区别一下数组的解构赋值 - 对象的解构与数组有一个重要的不同。数组的元素是按次序排列的&#xff0c;变量的取值由它的位置决定&#xff1b;而对象的属性没有次序&#xff0c;变量必须与属性同名&#xff0c;才能取到正确的值二、说明 - 对象的解构赋值的内部机制&#…

共享网盘系统PHP源码

新V5.0版本&#xff0c;支持上传视频、支持视频播放、支持共享&#xff0c;也可以自己用。 可以自动生成视频外链&#xff0c;下载地址&#xff0c;播放器代码&#xff0c;html代码&#xff0c;ubb代码等等。 使用方法&#xff1a; 源码上传到服务器&#xff0c;打开网站根据…

两种方式实现文本超出指定行数显示展开收起...

需要实现这样一个功能 默认高度下文本超出隐藏&#xff0c;点击展开可查看所有内容&#xff0c;点击收起可折叠 方法一&#xff1a;通过html和css实现 代码部分 html:<div className"expand-fold"><input id"check-box" type"checkbox&qu…

云计算关键技术

目录 一、云计算关键技术概述 1.1 概述 二、关键技术内容 2.1 虚拟化技术 2.2 分布式数据存储技术 2.3 资源管理技术 2.4 云计算平台管理技术 2.5 多租户隔离技术 2.5.1 多租户技术下SaaS 特征 2.5.2 多租户技术面临的技术难题 2.5.2.1 数据隔离 2.5.2.2 客户化配置…

Mybatis基础教程及使用细节

本篇主要对Mybatis基础使用进行总结&#xff0c;包括Mybatis的基础操作&#xff0c;使用注解进行增删改查的练习&#xff1b;详细介绍xml映射文件配置过程并且使用xml映射文件进行动态sql语句进行条件查询&#xff1b;为了简化java开发提高效率&#xff0c;介绍一下依赖&#x…

前端登陆加密解决方案

项目背景 环食药烟草的数据下载模块中&#xff0c;需要判断用户在进行数据下载时是进行了登录操作&#xff0c;如果没有登录要跳转登陆页面&#xff0c;输入账号和密码进行登录。 使用场景 项目中需要前端书写登录页面&#xff0c;用户输入账号密码&#xff0c;前端获取到用…

嵌入式学习第十六天!(Linux文件查看、查找命令、标准IO)

Linux软件编程 1. Linux&#xff1a; 操作系统的内核&#xff1a; 1. 管理CPU 2. 管理内存 3. 管理硬件设备 4. 管理文件系统 5. 任务调度 2. Shell&#xff1a; 1. 保护Linux内核&#xff08;用户和Linux内核不直接操作&#xff0c;通过操作Shell&#xff0c;Shell和内核交互…

return语句

一、return语句 使用在方法时&#xff0c;表示跳出所在方法使用在main方法时&#xff0c;表示退出程序 二、break、continue、return三者的比较 break语句&#xff1a;跳出循环continue语&#xff1a;结束当次循环&#xff0c;继续下一次循环return语句&#xff1a;使用在方法时…

impala与kudu进行集成

文章目录 概要Kudu与Impala整合配置Impala内部表Impala外部表Impala sql操作kuduImpala jdbc操作表如果使用了Hadoop 使用了Kerberos认证&#xff0c;可使用如下方式进行连接。 概要 Impala是一个开源的高效率的SQL查询引擎&#xff0c;用于查询存储在Hadoop分布式文件系统&am…

Android学习之路(28) 进程保活组件的封装

前言 远古时代&#xff0c;出现过很多黑科技&#xff0c;比如MarsDaemon&#xff0c;使用双进程守护的方式进行保活&#xff0c;在当时可谓风光无限&#xff0c;可惜在8.0时代到来就被废弃了。 又比如后面出现的1像素Activity的保活方式&#xff0c;说他流氓一点不过分&#…

自动运维ansible实训(网络管理与维护综合实训)

来自即将退役学长的分享&#xff0c;祝学弟学妹以后发大财&#xff01; 一 实训目的及意义 1.1 实训目的 1、熟悉自动化运维工具&#xff1a;实训旨在让学员熟悉 Ansible 这一自动化运维工具。通过实际操作&#xff0c;学员可以了解 Ansible 的基本概念、工作原理和使用方法…

【数据结构】排序---C语言版

七大排序算法 一、对于排序的分类&#xff1a;二、插入排序1、直接插入排序&#xff08;1&#xff09;基本思想&#xff1a;&#xff08;2&#xff09;直接插入排序&#xff1a;&#xff08;3&#xff09;代码实现&#xff1a;&#xff08;4&#xff09;总结&#xff1a; 2、希…

BAPI创建会计凭证和冲销凭证

目录 BAPI创建会计凭证和冲销凭证组件 利润中心冲销不可能原因由于一个变量为空导致不可以冲销 代码附上创建会计凭证代码冲销会计凭证代码 BAPI创建会计凭证和冲销凭证 在使用冲销会计凭证的BAPI&#xff0c;即BAPI_ACC_DOCUMENT_REV_POST时&#xff0c;遇到下面的问题&#…

Vue(二十):ElementUI 扩展实现表格组件的拖拽行

效果 源码 注意&#xff1a; 表格组件必须添加 row-key 属性&#xff0c;用来优化表格的渲染 <template><el-row :gutter"10"><el-col :span"12"><el-card class"card"><el-scrollbar><span>注意: 表格组件…

【数据库】关系型和非关系型数据库的区别?

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 关系型数据库的优点 非关系型数据库&#xff08;NOSQL&#xff09;的优点 我的其他博客 正文 关系型数据库的优点 容易理解&#xff0c…