【表格单元格可编辑】vue-elementul简单实现table表格点击单元格可编辑,点击单元格变成输入框修改数据

news2024/12/23 15:48:39

前言

这是最近遇到的功能,经常会需要一个表格可以编辑数据
类似于excel那种点击一下单元格就可以编辑数据,修改后鼠标移动出去
光标消失就会保存数据给后台
这里记录一下实现方法,其实也比较简单
就是通过角标来判断显示隐藏的

效果图

在这里插入图片描述

代码

我这里是用的html的形式,引入了vue的语法使用的
各位自行在自己的代码中套用。和vue写法一样
然后核心就是注意那个@cell-click=‘getCell’ :cell-class-name=‘getRowColumn’
这两个方法解释:
cell-class-name:其实就是通过创建table时触发的把角标赋值给行和列方便后面使用
cell-click:就是点击单元格时触发的事件,可以通过这个拿到角标
然后我们通过点击v-if判断当前单元格位置的角标和我们点击的角标一致就显示不然就隐藏
这就实现了切换输入框的功能,然后给文字div加个点击事件,方便我们获取到数据,用于判断需要调用新增还是修改方法

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <!-- 公共css文件 -->
    <link rel="stylesheet" href="/statics/css/common/common.css">
    <!-- 公共js文件 -->
    <script type="text/javascript" src="/statics/vue_element/common.js"></script>
    <!-- vue方面文件 -->
    <link rel="stylesheet" href="/statics/vue_element/element.css">
    <script src="/statics/vue_element/vue.js"></script>
    <script src="/statics/vue_element/element.js"></script>
    <script src="/statics/vue_element/axios.js"></script>
    <title>表格单元格输入框修改</title>
</head>

<body>
    <div id="app" v-cloak>
        <!-- 搜索栏 -->
        <div class="search_main">
            <div class="ibox-search" ref="menus">
                <el-form :inline="true" class="form-inline">
                    <el-form-item label="排班日期">
                        <el-date-picker v-model="time" size="small" type="month" placeholder="选择日期"
                            value-format="yyyy-MM" clearable id="month1" class="ywidth">
                        </el-date-picker>
                    </el-form-item>
                    <el-form-item>
                        <el-button size="small" @click="search" type="primary">查询</el-button>
                    </el-form-item>
                </el-form>
            </div>
        </div>
        <!-- 内容栏 -->
        <div class="layout-main">
            <div class="ibox-search">
                <!-- 循环表头 -->
                <el-table :data="tableData" border style="width: 100%" v-loading="loadings" :height="height" ref="table"
                    @cell-click='getCell' :cell-class-name='getRowColumn'>
                    <el-table-column v-for="(arrd,index) in headered" :fixed="arrd.fixed" :key="index"
                        :label="arrd.name" align="center" show-overflow-tooltip :prop="arrd.key"
                        :width="arrd.key=='ks'||arrd.key=='doctor'?'100px':''">
                        <template slot-scope='scope'>
                            <!-- 列不等于科室和医生的才有输入框 -->
                            <div v-if="arrd.key!=='ks'&&arrd.key!=='doctor'">
                                <el-input v-model='scope.row[arrd.key]'
                                    v-if='scope.row.index == tabRowIndex  && scope.column.index == tabColumnIndex'
                                    @blur='inputBlur' size="mini" v-focus></el-input>
                                <div v-else style="cursor: pointer;" @click="inputType(scope.row[arrd.key])">
                                    {{scope.row[arrd.key]}}</div>
                            </div>
                            <div v-else>
                                {{scope.row[arrd.key]}}
                            </div>
                        </template>
                    </el-table-column>
                </el-table>
                <!-- 分页 -->
                <div class="list-footer" ref="footer">
                    <div class="foot-bg">
                    </div>
                    <div class="block page_r">
                        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
                            :current-page="currentPage" :page-sizes="[10, 30, 50, 100]" :page-size="pagesize"
                            layout="total, sizes, prev, pager, next, jumper" :total="count">
                        </el-pagination>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
<script>
    new Vue({
        el: '#app',
        directives: {
            //注册一个局部的自定义指令 v-focus,输入框自动聚焦
            focus: {
                inserted: function (el) {
                    el.querySelector('input').focus()
                }
            }
        },
        data() {
            return {
                time: '', //日期
                tableData: [{
                    "ks": "中医科",
                    "doctor": "段占国",
                    "num1": 0,
                    "num2": 0,
                    "num3": 0,
                    "num4": 0,
                    "num5": 0,
                    "num6": 0,
                    "num7": 0,
                    "num8": 0,
                    "num9": 0,
                    "num10": 0,
                    "num11": 0,
                    "num12": 0,
                    "num13": 0,
                    "num14": 0,
                    "num15": 0,
                    "num16": 0,
                    "num17": 0,
                    "num18": 0,
                    "num19": 0,
                    "num20": 0,
                    "num21": 0,
                    "num22": 0,
                    "num23": 0,
                    "num24": 0,
                    "num25": 0,
                    "num26": 0,
                    "num27": 0,
                    "num28": 0,
                    "index": 0
                }, {
                    "ks": "中医科",
                    "doctor": "陈森",
                    "num1": 0,
                    "num2": 0,
                    "num3": 0,
                    "num4": 0,
                    "num5": 0,
                    "num6": 0,
                    "num7": 0,
                    "num8": 0,
                    "num9": 0,
                    "num10": 0,
                    "num11": 0,
                    "num12": 0,
                    "num13": 0,
                    "num14": 0,
                    "num15": 0,
                    "num16": 0,
                    "num17": 0,
                    "num18": 0,
                    "num19": 0,
                    "num20": 0,
                    "num21": 0,
                    "num22": 0,
                    "num23": 0,
                    "num24": 0,
                    "num25": 0,
                    "num26": 0,
                    "num27": 0,
                    "num28": 0,
                    "index": 1
                }], //表格数据
                headered: [{
                        "key": "ks",
                        "name": "科室"
                    },
                    {
                        "key": "doctor",
                        "name": "专家"
                    },
                    {
                        "key": "num1",
                        "name": "2023-02-01"
                    },
                    {
                        "key": "num2",
                        "name": "2023-02-02"
                    },
                    {
                        "key": "num3",
                        "name": "2023-02-03"
                    },
                    {
                        "key": "num4",
                        "name": "2023-02-04"
                    },
                    {
                        "key": "num5",
                        "name": "2023-02-05"
                    },
                    {
                        "key": "num6",
                        "name": "2023-02-06"
                    },
                    {
                        "key": "num7",
                        "name": "2023-02-07"
                    },
                    {
                        "key": "num8",
                        "name": "2023-02-08"
                    },
                    {
                        "key": "num9",
                        "name": "2023-02-09"
                    },
                    {
                        "key": "num10",
                        "name": "2023-02-10"
                    },
                    {
                        "key": "num11",
                        "name": "2023-02-11"
                    },
                    {
                        "key": "num12",
                        "name": "2023-02-12"
                    },
                    {
                        "key": "num13",
                        "name": "2023-02-13"
                    },
                    {
                        "key": "num14",
                        "name": "2023-02-14"
                    },
                    {
                        "key": "num15",
                        "name": "2023-02-15"
                    },
                    {
                        "key": "num16",
                        "name": "2023-02-16"
                    },
                    {
                        "key": "num17",
                        "name": "2023-02-17"
                    },
                    {
                        "key": "num18",
                        "name": "2023-02-18"
                    },
                    {
                        "key": "num19",
                        "name": "2023-02-19"
                    },
                    {
                        "key": "num20",
                        "name": "2023-02-20"
                    },
                    {
                        "key": "num21",
                        "name": "2023-02-21"
                    },
                    {
                        "key": "num22",
                        "name": "2023-02-22"
                    },
                    {
                        "key": "num23",
                        "name": "2023-02-23"
                    },
                    {
                        "key": "num24",
                        "name": "2023-02-24"
                    },
                    {
                        "key": "num25",
                        "name": "2023-02-25"
                    },
                    {
                        "key": "num26",
                        "name": "2023-02-26"
                    },
                    {
                        "key": "num27",
                        "name": "2023-02-27"
                    },
                    {
                        "key": "num28",
                        "name": "2023-02-28"
                    }
                ],
                loadings: false, //表格加载
                height: null, //表格高度
                // 分页部分
                currentPage: 1,
                pagesize: 10,
                count: 0,
                //表单验证
                value: '', //区分新增和修改
                tabRowIndex: null, //行角标
                tabColumnIndex: '', //列角标
            }
        },
        mounted() {
            let that = this
            that.initTableHeight() //初始化 表格高度
            window.addEventListener('resize', this.initTableHeight) //动态表格高度监听
            that.time = timer.benyuefen() //初始化默认获取本月日期,不含日
            //that.searchList() //初始化表格数据获取
        },
        methods: {
            // 保存数据区分新增和修改
            inputType(num) {
                this.value = num
            },
            // 获取点击的单元格角标位置
            getCell(row, column, cell, event) {
                this.tabRowIndex = row.index
                this.tabColumnIndex = column.index
            },
            // 把角标赋值给行和列,上面才可以直接拿到点击位置的坐标
            getRowColumn({
                row,
                column,
                rowIndex,
                columnIndex
            }) {
                row.index = rowIndex
                column.index = columnIndex
            },
            // 失去光标
            inputBlur() {
                // 把输入框隐藏
                this.tabRowIndex = null
                this.tabColumnIndex = ''
                // 发请求把修改的数据发送给后台
                // this.subForm()
            },
            // 表格高度
            initTableHeight() {
                let that = this
                var menus = that.$refs.menus.offsetHeight //搜索栏高度
                var footer = that.$refs.footer.offsetHeight //分页高度
                that.height = window.innerHeight - menus - footer - 25 + 'px'
            },
            // 获取表格数据
            searchList() {
                let that = this
                that.loadings = true
                axios.get(apiadmin_url + `zkjk_doctor_limit?month=${that.time}`, {
                    headers: {
                        token: session_token,
                        hosId: userinfo.hospital_id,
                    }
                }).then(res => {
                    console.log(res, 'res');
                    this.headered = res.data.data.header
                    this.tableData = res.data.data.data
                    this.tableData.sort(function (a, b) {
                        return a.ks > b.ks ? 1 : -1
                    })
                    that.loadings = false
                }).catch(error => {})
            },
            // 搜索按钮
            search() {
                let that = this
                that.currentPage = 1
                console.log(this.time, '时间');
                that.searchList()
            },
            // 分页
            handleSizeChange(val) {
                let that = this
                that.pagesize = val;
                that.searchList()
            },
            // 分页
            handleCurrentChange(val) {
                let that = this
                that.currentPage = val;
                that.searchList()
            },
            // 弹框内提交
            subForm() {
                let that = this
                if (this.value == 0) {
                    axios.post(apiadmin_url + "zkjk_doctor_limit", {
                        date: this.tableTimer,
                        doctor: this.nickName,
                        limit_num: this.ruleForm.show_num
                    }, {
                        headers: {
                            token: session_token,
                            hosId: userinfo.hospital_id,
                        }
                    }).then(response => {
                        if (response.data.code == 200) {
                            that.dialogVisible = false
                            this.$message({
                                showClose: true,
                                type: 'success',
                                message: response.data.message
                            });
                            that.search()
                        } else {
                            this.$message({
                                showClose: true,
                                message: response.data.message,
                                type: 'error'
                            });
                        }
                    }).catch(error => {})
                } else {
                    axios.put(apiadmin_url +
                        `zkjk_doctor_limit/1?date=${this.tableTimer}&doctor=${this.nickName}&limit_num=${this.ruleForm.show_num}`, {}, {
                            headers: {
                                token: session_token,
                                hosId: userinfo.hospital_id,
                            }
                        }).then(response => {
                        if (response.data.code == 200) {
                            that.dialogVisible = false
                            this.$message({
                                showClose: true,
                                type: 'success',
                                message: response.data.message
                            });
                            that.search()
                        } else {
                            this.$message({
                                showClose: true,
                                message: response.data.message,
                                type: 'error'
                            });
                        }
                    }).catch(error => {})
                }
            },
        }
    })
</script>

</html>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Android开发基础4] 点击事件的响应与处理

文章目录 方法一&#xff1a;控件的onClick属性 方法二&#xff1a;内部类 方法一&#xff1a;控件的onClick属性 利用控件自带的onClick属性&#xff0c;指定事件处理函数名称即可实现控件点击事件的处理 这里有个小技巧就是当设置完控件的onClick属性后&#xff0c;它会报没…

XXE漏洞常见利用点总结

目录 知识点小结 常用payload 本地文件读取 SSRF 引入外部实体 dtd 信息探测 XXE漏洞攻击 案例演示 案例一&#xff08;有回显&#xff09; 案例二&#xff08;无回显读取本地敏感文件(Blind OOB XXE)&#xff09; XXE 防御 使用语言中推荐的禁用外部实体的方法 知…

08-linux网络管理-iftop命令详解

文章目录1. 安装2. 基本使用2.1 命令2.2 输出2.3 说明3. 选项3.1 选项说明3.2 几个示例-n&#xff08;不查找主机名&#xff09;-i &#xff08;查看指定网卡流量&#xff09;-P&#xff08;显示主机端口&#xff09;-t&#xff08;不使用ncurses 界面&#xff09;4. ncurses界…

IDEA集成Docker插件实现一键自动打包部署

一. 概述 大家部署项目的时候&#xff0c;动辄十几个服务&#xff0c;每次修改逐一部署繁琐不说也会浪费越来越多时间&#xff0c;所以本篇整理通过一次性配置实现一键部署微服务&#xff0c;直接上教程。 二. 配置服务器 1、Docker安装 服务器需要安装Docker&#xff0c;如…

iOS单元测试怎么写 ?

iOS单元测试怎么写 ? 什么是单元测试 ? 针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。对于面向对象编程&#xff0c;最小单元就是方法 iOS 集成了自己的测试框架 OCUnit 和 UITests 为什么单元测试 ? 执行单元测试&#x…

网络基础2-3 ---传输层的UDP协议:DP的特点,UDP的协议格式,UDP的应用

目录 一、tcpdump命令 二、UDP协议 前言 2.1、UDP协议的特点&#xff1a; 2.2、UDP的协议格式 16位的UDP长度&#xff1a; 结合抓包工具&#xff1a;分析一下UDP协议&#xff0c;就利用我们之前写的udp_socket编程 16位的校验和&#xff1a; 2.3、UDP的应用&#xff1…

Python的序列结构及常用操作方法,学完这一篇你就彻底懂了

上一篇&#xff1a;Python流程控制语句之跳转语句 文章目录前言一、索引二、切片三、序列相加四、乘法五、检查某个元素是否是序列的成员六、计算序列的长度、最大值和最小值总结前言 序列是一块用于存放多个值的连续内存空间&#xff0c;并且按一定顺序排列&#xff0c;每个值…

【论文阅读】Cleanits: A Data Cleaning System for Industrial Time Series

论文来源 标题: Cleanits (Xiaoou Ding,2019) 作者: Xiaoou Ding, Hongzhi Wang, Jiaxuan Su, Zijue Li, Jianzhong Li, Hong Gao 期刊: Proceedings of the VLDB Endowment 研究问题 工业时间序列数据清洗系统 1&#xff09;缺失值插补&#xff0c;2&#xff09;匹配不一致…

Maven可选依赖与排除依赖

可选依赖——指的是对外隐藏当前所依赖的资源&#xff08;不透明&#xff09; 可选依赖的作用&#xff1a;是隐藏所使用的依赖&#xff0c;用于控制当前依赖资源能否被别人发现 可选依赖的含义&#xff1a;当前工程所依赖的资源&#xff0c;不被其他项目所调用此依赖 pom文件…

DolphinScheduler 3.1.0 海豚集群运维使用问题记录

文章目录海豚常见问题1. 认证问题2. 时区问题3. jdk问题导致的认证问题4. 海豚调度sqoop任务问题(1. 海豚不允许脚本有空行出现(2. 脚本调脚本:权限不足(3. 直接执行某个表的sqoop同步任务:(4. sudo权限不足5. 海豚配置hive/impala数据源问题(1.海豚连接hive数据源配置(2. 配置…

[架构之路-97]:《软件架构设计:程序员向架构师转型必备》-7-需求分析与业务需求领域建模

前言&#xff1a;需求分析工程师工作中业务领域&#xff0c;而业务领域有很多业务领域专有的概念&#xff1b;程序员主要工作在计算机领域&#xff0c;他们没有足够的业务领域的知识识别业务领域的过于专业化的业务需求。为了确保业务需求能够被软件工程师正确无误地实现&#…

《MFC编程》:第一个MFC程序

《MFC编程》&#xff1a;第一个MFC程序《MFC编程》&#xff1a;第一个MFC程序设置开发环境如何把一个win32程序改成MFC程序&#xff1f;代码书写《MFC编程》&#xff1a;第一个MFC程序 设置开发环境 头文件为<afxwin.h>&#xff1b;在设置中勾选“使用MFC库”。 注&…

53.Isaac教程--ZED相机

ZED相机 ISAAC教程合集地址文章目录ZED相机Codelets支持的固件下载出厂校准文件通过本地校准提高相机精度为相机校准文件指定自定义位置Isaac SDK 支持 StereoLabs ZED 和 ZED Mini (ZED-M) 以及 ZED2 立体相机。 使用本节中的程序下载出厂校准文件或在相机上执行本地校准。 …

看涨期权与看跌期权

目录 1. 看涨期权多头 2. 看涨期权空头 3. 看跌期权多头 4. 看跌期权空头 买进期货合约者称为多头&#xff0c;卖出股指期货合约者称为空头。 1. 看涨期权多头 买入沪深 300 指数的看涨期权&#xff0c;行权价 2000 点&#xff0c;期限 1 个月期权费 100 点1 点 100 元初…

PMP和ACP哪个更有用?

PMP证书和ACP证书都是项目管理类的证书&#xff0c;但是方向不一样&#xff0c;ACP特别验证了从业者在项目工作中理解及实施敏捷管理原则与实践的能力&#xff0c;PMP则认证了从业者所表现出的领导和引导项目团队的能力。 PMP是传统的项目管理模式&#xff0c;适合各行各业&am…

日常小工具之:不花一分钱,不限制视频大小,用 python 和 ffmpeg 批量视频转格式,并保存到 iphone / ipad

应用背景 2008 年左右买的一个系列视频&#xff0c;全都是 .rmvb 的格式&#xff0c;想移到 iphone 里面&#xff0c;但是显示解码格式不支持上 知乎 看格式转换的工具发现这些工具需要把视频上传上去处理&#xff0c;而且很慢&#xff0c;而且有些还限制视频大小 我觉得有必要…

规则引擎-drools-3.4-drl文件构成-rule部分-结果部分Action

文章目录drl文件构成-rule部分结果部分 RHSsetinsert && insertLogicalmodify && updatedeletedrl文件构成-rule部分 drl文件构成&#xff0c;位于官网的第5章位置&#xff0c;也是drools作为规则引擎应用的最核心部分。 其中rule模块&#xff0c;包括属性&am…

Linux命令使用错误记录

问题描述 今天在使用jenkins自动部署的时候&#xff0c;查看日志也是打印成功的&#xff0c;如下图&#xff1a; 自以为是成功&#xff0c;没有看项目启动日志。当访问接口的时候&#xff0c;返回的还是原有数据&#xff0c;没有更新数据接口。 解决思路 首先&#xff0c;打…

春晚背后的“新技术”,腾讯技术助力央视频春晚“新看法”

伴随着《难忘今宵》音乐的响起&#xff0c;兔年春晚圆满落幕。今年&#xff0c;我们和中央广播电视总台一起打造了“竖屏春晚HDR及菁彩声”技术方案&#xff0c;并在“央视频”客户端上线。让你“听”得更沉浸&#xff0c;“看”得更清晰。三维菁彩声&#xff0c;观看春晚“如临…

【Flume】Flume原理简述及示例实践

文章目录1. Flume是什么2. Flume三大组件3. Flume高级应用场景3.1 多路复用3.2 整合4. 示例实践4.1 配置4.2 运行4.2.1 运行结果输出4.2.2 设置后台运行1. Flume是什么 Flume是一个高可用&#xff0c;高可靠&#xff0c;分布式的海量日志采集、聚合和传输的系统&#xff0c;能够…