ElementUI,修改el-table中的数据,视图无法及时更新

news2024/9/23 7:17:38

需求:点击table表格中的“修改”之后,当前行变为可输入状态的行,点击“确定”后变为普通表格;
在这里插入图片描述
先贴上已经完美解决问题的代码
实现代码:

<section>
    <div style="display: flex;justify-content: space-between;align-items: center;margin-bottom: 10px">
        <h4>接入点信息</h4>
        <el-button type="primary" @click="addBtn">新 增</el-button>
    </div>
    <el-form ref="form1" :model="formData" label-width="0px" :inline-message="true">
        <el-table :data="formData.access_param" :border="true">
            <el-table-column label="名称" align="center" prop="name">
                <template slot="header">
                    <span>
                        <span class="fred">*</span>
                        名称
                    </span>
                </template>
                <template slot-scope="scope">
                    <el-form-item v-if="scope.row.editable" :prop="'access_param.' + scope.$index + '.name'" :rules="tableFromRules.name">
                        <el-input v-model="scope.row.name"></el-input>
                    </el-form-item>
                    <span v-else>{{ scope.row.name }}</span>
                </template>
            </el-table-column>
            <el-table-column label="拓扑角色" align="center" prop="topo_type">
                <template slot="header">
                    <span>
                        <span class="fred">*</span>
                        拓扑角色
                    </span>
                </template>
                <template slot-scope="scope">
                    <el-form-item v-if="scope.row.editable" :prop="'access_param.' + scope.$index + '.topo_type'" :rules="tableFromRules.topo_type">
                        <el-select v-model="scope.row.topo_type" clearable>
                            <el-option :value=1 label="任意到任意"></el-option>
                            <el-option :value=2 label="中心节点"></el-option>
                            <el-option :value=3 label="边缘节点"></el-option>
                            <el-option :value=4 label="点到点"></el-option>
                        </el-select>
                    </el-form-item>
                    <span v-else>{{ scope.row.topo_type }}</span>
                </template>
            </el-table-column>
            <el-table-column label="接入方式" align="center" prop="access_type">
                <template slot="header">
                    <span>
                        <span class="fred">*</span>
                        接入方式
                    </span>
                </template>
                <template slot-scope="scope">
                    <el-form-item v-if="scope.row.editable" :prop="'access_param.' + scope.$index + '.access_type'" :rules="tableFromRules.access_type">
                        <el-select v-model="scope.row.access_type" clearable>
                            <el-option :value=1 label="单归"></el-option>
                            <el-option :value=2 label="双归主备"></el-option>
                            <el-option :value=3 label="双归负载"></el-option>
                        </el-select>
                    </el-form-item>
                    <span v-else>{{ scope.row.access_type }}</span>
                </template>
            </el-table-column>
            <el-table-column label="操作" align="center" width="120">
                <template slot-scope="scope">
                    <div class="fullstacktable_btn">
                        <el-button @click="modifyBtn(scope.row,scope.$index)" type="button" v-show="title == '修改'&&!scope.row.editable">修改</el-button>
                        <el-button @click="saveBtn(scope.row,scope.$index)" type="button" v-show="title == '修改'&&scope.row.editable">确定</el-button>
                        <el-button @click="delBtn(scope.row,scope.$index)" type="button">删除</el-button>
                    </div>
                </template>
            </el-table-column>
        </el-table>
    </el-form>
</section>

data中的数据定义部分

formData: {
    access_param: [
        { name: "", topo_type: "", access_type: "", status: true, editable: true},
    ],
},

说明:其中,status字段为接口返回的字段,用来表示是否可以编辑或删除;true表示可以删除或修改,false表示被占用中,不可以删除或修改;editable是前端页面自己定义的字段,用来控制显示可编辑列还是普通列;
methods中的方法实现

addBtn() {
    let flag = false;
    this.formData.access_param.forEach((item, index) => {
        if (!item.name || !item.topo_type || !item.access_type) {
            flag = true;
            return true
        }
    })
    if (flag) {
        this.$message({
            message: '请先完善必填信息!',
            type: 'info',
            showClose: true
        });
    } else {
        this.formData.access_param.push({
            name: "", 
            topo_type: "", 
            access_type: "",
            editable: true,
            status: true
        })
    }
},
modifyBtn(row,index) {
    if (!row.status) { // true:可以修改;false:不可以修改;
        this.$message({
            message: '已被占用,不支持修改!',
            type: 'warning',
            showClose: true
        });
        return
    }
    this.formData.access_param[index].editable = true;
    this.formData = JSON.parse(JSON.stringify(this.formData));
},
saveBtn(row,index) {
    if (row.name == "" || row.topo_type == "" || row.access_type == "") {
        this.$message({
            message: '请先完善必填信息!',
            type: 'info',
            showClose: true
        });
        return
    }
    this.formData.access_param[index].editable = false;
    this.formData = JSON.parse(JSON.stringify(this.formData));
},
delBtn(row,index) {
    if (!row.status) { // true:可以修改;false:不可以修改;
        this.$message({
            message: '已被占用,不支持删除!',
            type: 'warning',
            showClose: true
        });
        return
    }
    if (this.formData.access_param.length === 1) {
        this.$message({
            message: '至少保留一条数据',
            type: 'warning',
            showClose: true
        })
        return
    }
    this.formData.access_param.splice(index,1)
},

遇到问题的解决步骤:

  1. 在modifyBtn方法中想要通过修改当前行的editable字段来切换可编辑行和普通行 this.formData.access_param[index].editable = true;点击“修改”按钮没有效果,数据更新了视图没有更新,因为数据层次太多,render函数没有自动更新,需手动强制刷新。

  2. 通过this.$forceUpdate()强制刷页面,依然无效

this.formData.access_param[index].editable = true;
this.$forceUpdate();
  1. 想要使用this.$set来更新视图
this.$set(this.formData.access_param[index],'editable', true);

结果:第一次点击“修改”按钮可以将当前行变为可编辑的列,但是点击其他的“修改按钮”就没有效果了

  1. 把当前行的this.formData.access_param[index].editable = true;设置为true;然后在把 表格的数据 用this.formData = JSON.parse(JSON.stringify(this.formData)); 重新克隆一遍再赋值给表格就OK了,这也是我代码中使用的方法,但是使用JSON.parse(JSON.stringify());这种方法会有缺陷:如果数据中有使用new Date会将其转换成字符串,需要把数据过滤一下;
this.formData.access_param = this.formData.access_param.filter(item => item);
  1. 最完美的办法:直接使用es6的 Object.assign复制一个新的对象 this.formData = Object.assign([],this.formData) 简单明了

其他办法:
给table加key:修改绑定在 table 上面的 key 值,可以触发 table 的重新渲染,这样就可以把修改后的 data 在表格里面更新渲染。

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

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

相关文章

数据中心服务器搬迁团队

数据中心机房服务器搬迁&#xff0c;需要专业的数据中心机房服务器提供技术保障服务。友力科技&#xff08;广州&#xff09;有限公司&#xff0c;作为华南地区主流的数据中心服务商&#xff0c;专业从事数据中心机房搬迁服务。 数据中心机房搬迁涉及设备数量多、系统复杂&…

基于联盟链Fabric 2.X 的中药饮片代煎配送服务与监管平台

业务背景 近年来&#xff0c;随着公众对中医药青睐有加&#xff0c;中药代煎服务作为中医药现代化的重要一环&#xff0c;在全国各地蓬勃兴起。鉴于传统煎煮方式的繁琐耗时&#xff0c;医疗机构纷纷转向与第三方中药饮片企业合作&#xff0c;采用集中代煎模式。这些第三方煎药中…

goenv丝滑控制多版本go

安装 先装下goenv brew install goenv去 ~/.bash_profile 添加一下 export GOENV_ROOT"$HOME/.goenv" export PATH"$GOENV_ROOT/bin:$PATH" eval "$(goenv init -)"执行一下让配置生效 source ~/.bash_profile插一嘴&#xff0c;如果之前是在…

【BUG】已解决:No Python at ‘C:Users…Python Python39python. exe’

No Python at ‘C:Users…Python Python39python. exe’ 目录 No Python at ‘C:Users…Python Python39python. exe’ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班…

独立游戏《星尘异变》UE5 C++程序开发日志8——实现敏感词过滤功能(AC自动机)

在游戏中经常会有需要玩家输入一些内容的功能&#xff0c;例如聊天&#xff0c;命名等&#xff0c;这款游戏只有在存档时辉用到命名功能&#xff0c;所以这个过滤也只是一个实验性的功能&#xff0c;我们将使用AC自动机来实现&#xff0c;这是在我们把“csdn”这个词设置为屏蔽…

nginx代理缓存配置-Linux(CentOS)

代理缓存 1. 编写主配置文件2. 编辑虚拟机配置文件3. 重启nginx服务 nginx代理服务配置&#xff0c;基于http协议 开启代理缓存的前提是已经开启了代理服务&#xff0c;请确保已经开启代理服务 1. 编写主配置文件 主配置文件通常在/etc/nginx/nginx.conf&#xff0c;在该文件…

【Vue3】watch 监视 ref 定义的数据

【Vue3】watch 监视 ref 定义的数据 背景简介开发环境开发步骤及源码参数说明 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努…

江科大/江协科技 STM32学习笔记P6

文章目录 LED闪烁&LE流水&蜂鸣器一、操作STM32的GPIO步骤二、RCC库函数什么是AHB与APB&#xff1f; 三、GPIO库函数GPIO初始化选择IO接口工作方式 四、四种方法实现LED闪灯 LED闪烁&LE流水&蜂鸣器 一、操作STM32的GPIO步骤 1、使用RCC开启GPIO的时钟 2、使用…

【C语言报错已解决】Use of Uninitialized Variable

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言&#xff1a; 在编程中&#xff0c;未初始化的变量是一个常见的问题&#xff0c;它可能导致程序的行为变得不可预测。未初…

CAD图块的对齐方法的使用技巧

对齐功能配合鼠标技巧才能正常使用&#xff0c;不然对齐的图形胡乱翻转。

Cxx Primer-chap7

类的基本思想是数据抽象和封装&#xff0c;前者强调interface和implement分离&#xff0c;后者在此基础上&#xff0c;强调访问控制符&#xff08;存疑&#xff09;。同时类的实现者和使用者考虑的角度不同&#xff0c;前者考虑实现效率&#xff0c;后者仅需关注功能即可&#…

PSINS工具箱函数介绍——insplot

insplot是一个绘图命令,用于将avp数据绘制出来 本文所述的代码需要基于PSINS工具箱,工具箱的讲解: PSINS初学指导基于PSINS的相关程序设计(付费专题)使用方法 此函数使用起来也很简单,直接后面加avp即可,如: insplot(avp);其中,avp为: 每行表示一个时间1~3列为姿态…

基于VUE的软件项目开发管理系统/项目管理系统/软件开发过程管理系统的设计与实现

摘 要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括软件项目开发管理系统的网络应用&#xff0c;在外国软件项目开发管理系统已经是很普遍的方式&#xff0c;不过国内的软件项目开发管理可能还处于起步阶段。软件项目开发…

elasticsearch 解决全模糊匹配最佳实践

事件背景&#xff1a; 某 CRM 系统&#xff0c;定义了如下两个表&#xff1a; 客户表 t_custom 字段名 类型 描述 idlong自增主键phonestring客户手机......... 客户产品关系表 t_custom_product 字段名 类型 描述 idlong自增主键custom_idlong客户idproduct_idlong产品…

第一百七十七节 Java IO教程 - Java路径操作

Java IO教程 - Java路径操作 比较路径 我们可以基于它们的文本表示来比较两个Path对象的相等性。 equals()方法通过比较它们的字符串形式来测试两个Path对象的相等性。 等式测试是否区分大小取决于文件系统。 以下代码显示如何比较Windows路径: import java.nio.file.Pat…

【Unity实战】yield return null还是WaitForEndOfFrame

当在Unity中编写协程&#xff08;尤其是协程套无限循环&#xff09;时&#xff0c;常常会用到yield关键字来控制协程的执行流程避免程序假死。以下是常见做法&#xff1a; yield return null 当使用yield return null时&#xff0c;协程会在下一帧继续执行。这意味着协程将暂…

vscode-CodeGeeX AI在vscode运用

1.CodeGeeX 代码自动生成和补全&#xff0c;代码翻译&#xff0c;自动添加注释&#xff0c;智能问答等 2.vscode中使用 3.官方网址 https://codegeex.cn/downloadGuide#vscode 进行登录注册使用&#xff0c;个人免费

机器学习 | 回归算法原理——多项式回归

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的最速下降法&#xff08;梯度下降法&#xff09;继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享多项式回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目&#xff0c;…

idea一键为实体类赋值

file -> settings -> plugins -> marketplace 把这个插件装上 找个实体&#xff0c;选中&#xff0c;altenter进入edit界面 我是选择只保留右边这种生成方法&#xff0c;然后选择ok 返回到那个实体&#xff0c;选择&#xff0c;altenter generate生成

前端开发知识(一)-html

1.前端开发需掌握的内容&#xff1a; 2.前端开发的三剑客&#xff1a;html、css、javascript Vue可以简化JavaScpript流程。 Element&#xff08;饿了么开发的&#xff09; &#xff1a;前端组件库。 Ngix&#xff1a;前端服务器。 3.前端开发工具&#xff1a;vscode 1)按…