Vue.js实现可编辑表格并高亮修改的单元格

news2025/1/24 8:50:44

实现一个可编辑的表格,让用户可以修改表格中的数据,并且能够清楚地看到哪些单元格被修改过。这样的功能可以提高用户体验,也方便后端处理数据的变化。

本文将介绍如何使用Vue.js和Element UI的el-table组件来实现一个可编辑表格,并且修改的单元格会有不同的背景色。
在这里插入图片描述

代码实现

首先创建一个el-table组件,给它绑定一个data属性,用来存储表格的数据。给每个el-table-column设置一个prop属性,用来指定每一列对应的数据字段。使用v-for指令来动态生成表格的列,根据一个tableColumn数组,里面存储了每一列的信息,比如label,prop,fixed等。可以给el-table添加一些事件监听,比如cell-mouse-enter,cell-mouse-leave,cell-click等,用来实现鼠标移入移出和点击单元格的效果。代码如下:

<el-table ref="multipleTable"  stripe :border=true :data="tableData"
            @cell-mouse-enter="handleCellEnter" @cell-mouse-leave="handleCellLeave" @cell-click="handleCellClick"
            :cell-style="cellstyle">
            <el-table-column width=120 v-for="column in tableColumn" :key="column.aliasColName"
              :prop="column.aliasColName" :label="column.text" :fixed="column.fixed">
              <div class="item" v-if="column.editStyle == 5"
                slot-scope="scope">
                <el-input class="item__input"  v-model="scope.row[scope.column.property]" placeholder="请输入内容">
               <i slot="suffix" class="el-icon-edit" @click="showPwd(scope.row, scope.$index, scope.column)"></i>
                </el-input>
                <div class="item__txt">{{ scope.row[scope.column.property] }}</div>
              </div>
              <div class="item" v-else-if="column.editStyle == 22" slot-scope="scope">
                <el-select v-model="scope.row[scope.column.property]" placeholder="请选择">
                  <el-option v-for="item in listArray" :key="item.value" :label="item.display" :value="item.value">
                  </el-option>
                </el-select>
              </div>
            </el-table-column>
            <el-table-column fixed="right" label="操作" width="120" v-if="!visremove">
              <div class="item" slot-scope="scope">
                <el-popconfirm confirm-button-text='好的' cancel-button-text='取消' icon="el-icon-info" icon-color="red"
                  title="确定删除吗?" @confirm="removerow(scope.row)">
                  <el-button slot="reference" type="text" size="small">删除</el-button>
                </el-popconfirm>
              </div>
            </el-table-column>
          </el-table>

接下来需要在data中定义一些变量,用来存储表格的数据,列的信息,下拉框的选项,以及一些控制变量,比如clickSwitch,用来记录当前点击的单元格,clickCellMap,用来存储当前点击的单元格的DOM元素,tableDataCopy,用来存储表格数据的副本,用于和修改后的数据进行对比。代码如下:

data() {
      return {
        tableData: [], //表格数据
        tableColumn: [], //表格列信息
        listArray: [], //下拉框选项
        clickSwitch: { //当前点击的单元格
          row: "",
          col: ""
        },
        clickCellMap: [], //当前点击的单元格的DOM元素
        tableDataCopy: [], //表格数据的副本
      };
    },

然后,需要在mounted中调用一个loadtabledata方法,用来加载表格的数据和列的信息。这里使用了一个模拟的数据文件loadData.json,里面存储了表格的数据和列的信息。根据实际的需求,从后端获取数据或者自定义数据。还需要使用JSON.parse和JSON.stringify方法,来创建一个表格数据的副本,用于后续的对比。代码如下:

mounted() {
      this.loadtabledata();
    },
    methods: {
      //表格
      loadtabledata() {
        let resloadtabledata = require("@/artificialdata/loadData.json")
        this.tableData = resloadtabledata.data.data
        this.tableDataCopy = JSON.parse(JSON.stringify(resloadtabledata.data.data))
      },
    }

接下来实现一些事件处理的方法,用来实现鼠标移入移出和点击单元格的效果。handleCellEnter方法用来处理鼠标移入单元格的事件。获取当前单元格的column和cell,然后判断是否有prop属性,如果有,说明是可编辑的单元格,就给它的item__txt类添加一个item__txt–hover类,用来显示一个编辑图标,提示用户可以点击编辑。代码如下:

/** 鼠标移入cell */
    handleCellEnter(row, column, cell, event) {
      const property = column.property
      if (property) {
        cell.querySelector('.item__txt').classList.add('item__txt--hover')
      }
    },

然后,需要实现一个handleCellLeave方法,用来处理鼠标移出单元格的事件。需要获取当前单元格的column和cell,然后判断是否有prop属性,如果有,说明是可编辑的单元格,就给它的item__txt类移除一个item__txt–hover类,用来隐藏编辑图标。代码如下:

/** 鼠标移出cell */
    handleCellLeave(row, column, cell, event) {
      const property = column.property
      if (property) {
        cell.querySelector('.item__txt').classList.remove('item__txt--hover')
      }
    },

接下来,实现一个handleCellClick方法,用来处理点击单元格的事件。获取当前单元格的row,column,cell,然后判断是否是同一个单元格,如果是,就不做任何操作,如果不是,就记录当前点击的单元格的信息,存储到clickSwitch变量中。然后,需要判断是否有之前点击的单元格,如果有,就触发它的失焦事件,让它保存数据,并且切换它的显示状态,让它显示文本,隐藏输入框。最后,切换当前点击的单元格的显示状态,让它显示输入框,隐藏文本,并且让输入框获取焦点。代码如下:

/** 点击cell */
    handleCellClick(row, column, cell, event) {
      if (this.clickSwitch.row == row.id && this.clickSwitch.col == column.property) {
        return
      }
      this.clickSwitch.row = row.id
      this.clickSwitch.col = column.property

      const property = column.property
      // 保存cell
      if (this.clickCellMap.length > 0 ) {
        this.clickCellMap[0].querySelector('input').blur()
      }
      if (this.clickCellMap.length > 0) {
        this.clickCellMap[0].querySelector('.item__txt').style.display = 'block'
        this.clickCellMap[0].querySelector('.item__input').style.display = 'none'
      }
     
        this.clickCellMap[0]=cell
        cell.querySelector('.item__txt').style.display = 'none'
        cell.querySelector('.item__input').style.display = 'block'
        cell.querySelector('input').focus()
      
    },

最后实现一个cellstyle方法,用来设置单元格的样式。需要获取当前单元格的row,column,rowIndex,columnIndex,然后判断当前单元格的值是否和表格数据副本中的值相同,如果不同,就说明该单元格被修改过,就给它返回一个背景色的样式,比如"background-color: rgb(144 199 255);",让它显示为蓝色。这样,用户就可以一眼看出哪些单元格被修改过,哪些没有。代码如下:

cellstyle({ row, column, rowIndex, columnIndex }) {
      if (this.tableDataCopy[rowIndex][column.property] != row[column.property]) {
        return "background-color: rgb(144 199 255);"
      }
    },

效果展示

表格中有两种类型的可编辑单元格,一种是输入框,一种是下拉框。当鼠标移入一个可编辑的单元格时,它会显示一个编辑图标,提示可以点击编辑。当点击一个可编辑的单元格时,它会显示一个输入框或者下拉框修改数据。当修改完数据后,按下回车键或者点击其他地方,它会保存数据,并且切换回文本显示。同时可以看到,修改过的单元格会有一个蓝色的背景色,清楚地看到数据的变化。还可以点击右侧的删除按钮,删除一行数据。代码如下:

cellstyle({ row, column, rowIndex, columnIndex }) {
      if (this.tableDataCopy[rowIndex][column.property] != row[column.property]) {
        return "background-color: rgb(144 199 255);"
      }
    },

在这里插入图片描述
在这里插入图片描述

.el-input__icon {
  line-height: 24px !important;
}

.el-button--text {
  height: 24px;

}

.item {
  .el-input--suffix .el-input__inner {
    padding-right: 20px;
    padding-left: 10px;
  }

  .el-input__inner {
    height: 24px !important;
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
  }

  .item__input {
    display: none;
  }

  .item__txt {
    box-sizing: border-box;
    border: 1px solid transparent;
    width: 100px;
    line-height: 24px;
    padding: 0 8px;
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
  }

  .item__txt--hover {
    border: 1px solid #dddddd;
    border-radius: 4px;
    cursor: text;
  }
}
.el-table {
  .el-table__cell {
    padding: 6px 0 !important;
  }

}

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

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

相关文章

课堂练习3.1:进程的描述与状态

3-1 进程是操作系统中一个非常重要的概念。程序的运行是通过进程来完成的。在层次结构的操作系统中&#xff0c;进程不仅是系统分配资源的基本单位&#xff0c;而且是 CPU 调度的基本单位。进程管理是操作系统最重要的功能之一。 通过本实训将会学习到&#xff1a;Linux 0.11 …

C#如何使用SqlSugar操作MySQL/SQL Server数据库

一. SqlSugar 连接MySQL数据库 public class MySqlCNHelper : Singleton<MySqlCNHelper>{public static SqlSugarClient CnDB;public void InitDB() {//--------------------MySQL--------------------CnDB new SqlSugarClient(new ConnectionConfig(){ConnectionString…

谈谈 LLM 在推荐域的渗透,探索推荐新范式

搜索慢慢的被大模型渗透&#xff0c;那么很自然很多人想到了推荐&#xff0c;但是推荐是不是真的可以被大模型渗透呢&#xff1f;大模型能改变推荐的范式吗&#xff1f; 最近大模型真的很火&#xff0c;从个人到公司&#xff0c;各行各业都在学习大模型、总结大模型和尝试应用…

SpringBoot项目静态资源默认访问目录

SpringBoot项目&#xff1a;静态资源默认访问目录 参考博客&#xff1a;https://blog.csdn.net/weixin_43808717/article/details/118281904

Brushed DC mtr--PIC

PIC use brushed DC mtr fundmental. Low-Cost Bidirectional Brushed DC Motor Control Using the PIC16F684 DC mtr & encoder

iOS——UIPickerView选择器

UIPickerView UIPickerView是 iOS 开发中常用的用户界面组件之一&#xff0c;用于在垂直方向上显示一个滚动的列表&#xff0c;用户可以通过滚动选择其中的一项。 UIPickerView的协议方法 UIPickerView和UItableView差不多&#xff0c;UIPickerView也要设置代理和数据源。UI…

【Effective C++】条款7:为多态基类声明virtual析构函数

如果你实现的一个类打算作为基类&#xff0c;并且要实现多态&#xff0c;那么就应该将析构函数声明为virtual。 class TimeKeeper { public:TimeKeeper();~TimeKeeper(); }; TimeKeeper::TimeKeeper() {cout << "TimeKeeper构造" << endl; } TimeKeeper:…

修改移远提供的GobiNet、quectel-CM源码,使其支持有方N720 4G模块

最近在研究imx6ull linux下4G模块驱动的移植&#xff0c;参考的移远ec20的移植方法&#xff0c;添加了GobiNet驱动&#xff0c;编译了quectel-CM工具&#xff0c;并且可以正常拨号&#xff0c;分配到ip&#xff0c;如下&#xff1a; ping外网也没有压力&#xff0c;如下…

MySQL之数据库及表操作

MySQL之数据库及表操作 文章目录 MySQL之数据库及表操作一、数据库的基本结构二、数据库的创建和删除三、数据表的结构定义和操作四、数据的插入五、主键和自增长属性1、什么是主键2、自增长属性 一、数据库的基本结构 数据库系统由数据库服务器为载体&#xff0c;拥有一个或者…

实用篇 | 一文学会人工智能中API的Flask编写(内含模板)

----------------------- &#x1f388;API 相关直达 &#x1f388;-------------------------- &#x1f680;Gradio: 实用篇 | 关于Gradio快速构建人工智能模型实现界面&#xff0c;你想知道的都在这里-CSDN博客 &#x1f680;Streamlit :实用篇 | 一文快速构建人工智能前端展…

class063 双向广搜【算法】

class063 双向广搜【算法】 算法讲解063【必备】双向广搜 code1 127. 单词接龙 // 单词接龙 // 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 // 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk &#xff1a; // 每一对相邻的单词只…

听GPT 讲Rust源代码--src/tools(10)

File: rust/src/tools/rust-analyzer/crates/ide-assists/src/handlers/generate_is_empty_from_len.rs 在Rust源代码中&#xff0c;rust-analyzer是一个Rust语言的IDE插件和代码分析器。其中&#xff0c;generate_is_empty_from_len.rs是rust-analyzer中的一个处理程序&#x…

超声波清洗机可以清洗什么?2023年超声波清洗机推荐

之前跟朋友聊天了解到&#xff0c;他作为一个眼镜党&#xff0c;竟然不知道要清洗自己的眼镜&#xff0c;如果眼镜长时间不清洗的话&#xff0c;很容易细菌感染并且导致眼睛酸痛&#xff0c;这是一个弊端&#xff0c;还有就是如果不正确清洗眼镜方法也很容易导致眼镜被刮花&…

算数运算符和算数表达式

基本算数运算符 算数运算符&#xff1a; &#xff08;加法运算符或正值运算符&#xff09;、-&#xff08;减法运算符或负值运算符&#xff09;、*&#xff08;乘&#xff09;、/&#xff08;除&#xff09;、%&#xff08;求余数&#xff09; 双目运算符&#xff1a; 双目…

行业地位失守,业绩持续失速,科沃斯的故事不好讲

特劳特曾在《定位》一书中提到&#xff0c;为了在容量有限的消费者心智中占据品类&#xff0c;品牌最好的差异化就是成为第一&#xff0c;做品类领导者或开创者&#xff0c;销量遥遥领先&#xff1b;其次分化品类&#xff0c;做到细分品类的唯一&#xff0c;即细分品类的第一。…

C# Solidworks二次开发:三种获取SW设计结构树的方法-第三讲

今天要讲的文章接着上一篇讲&#xff0c;第三种获取SW设计结构树的方法。 这个方法的逻辑是通过先获取第一个特征&#xff0c;然后通过循环不断的寻找下一个特征来完成获取所有节点。 1、获取第一个特征的API如下所示&#xff1a;FirstFeature Method (IModelDoc2) 这个API的…

构建Servlet项目流程

第一步&#xff1a;创建maven项目 部分基础 依赖的模板基础部分如下 maven-archetype-quickstart: 这是最基本的Archetype&#xff0c;它创建一个包含简单Java类和单元测试的项目。 maven-archetype-webapp: 这个Archetype创建一个简单的Java web应用&#xff0c;包括一个serv…

(数据结构)单链表的定义

#include<stdio.h> typedef struct LNode {int data;struct LNode* next; }LNode,*LinkList; //LNode为结构体类型&#xff0c;LinkList为指向单链表的指针 //初始化一个空的单链表 void InitList(LinkList L) {L NULL; //空表&#xff0c;暂时没有任何节点 } //判断单…

启动游戏出现concrt140.dll错误的8种解决方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是找不到concrt140.dll文件。这个错误通常会导致程序无法正常运行&#xff0c;给用户带来困扰。本文将介绍找不到concrt140.dll无法继续执行代码的8个方法&#xff0c;同时探讨concrt140.dll丢…

六:Day03_Mybatis-Plus

一、介绍 MyBatis-Plus&#xff08;简称 MP&#xff0c;是由baomidou(苞米豆)组织开源的&#xff09;是一个基于 MyBatis 的增强工具&#xff0c;它对 Mybatis 的基础功能进行了增强&#xff0c;但未做任何改变&#xff0c;Mybatis-Plus 其实可以看作是对 Mybatis 的再一次封装…