Vue + Element UI 实现复制当前行数据功能(复制到新增页面组件值不能更新等问题解决)
1、需求
使用Vue + Element UI 实现在列表的操作栏新增一个复制按钮,复制当前行的数据可以打开新增弹窗后亦可以跳转到新增页面,本文实现为跳转到新增页面。
2、实现
1)列表页 index.vue
<el-table>
<!-- 其他列 -->
<el-table-column label="操作" width="150">
<template slot-scope="scope">
<el-button icon="el-icon-copy-document" title="复制" @click="toCopyNew(scope.row)"></el-button>
</template>
</el-table-column>
</el-table>
方法部分:用id来区分,正常新增id为0,复制id不为0
methods: {
// 复制
toCopyNew (item) {
const { url } = this.$getKey('这是是业务权限值,不需要这里可以不写')
this.$router.push(`/${url}-New/${item.Id}`)
},
}
2)新增页 New.vue
data () {
return {
id: this.$route.params.id,
dataList: [],
form: {
Name: '',
BG: '',
InfoJson: [],
},
rules: {
Name: [
{ required: true, message: '请输入名称', trigger: 'blur' },
],
BG: [
{ required: true, message: '请选择所属组织', trigger: 'change' },
],
InfoJson: [
{ required: true, message: '请选择集合', trigger: 'blur' },
],
},
submitLoading: false,
}
},
created () {
if (this.id !== '0') {
this._getDetail()
}
},
methods: {
async _getDetail () {
try {
// 获取详情接口
const data = await GetInfo({
Id: this.id * 1,
})
if (data) {
this.form = data
this.form.id = ''
this.form.Name = data.Name
this.form.BG= { Id: data.BG_Id, Name: data.BG_Name }
this.form.InfoJson= JSON.parse(data.InfoJson)
this.dataList = this.form.InfoJson
}
} catch (error) {}
},
}
3)问题
按上述代码操作后,点击列表操作栏的复制按钮会跳转到新增页面并且将当前行的数据复制到对应各个组件内,数据呈现和保存正常,但是发现了一个问题,数据无法修改,网上查阅资料应该异步获取详情信息且数据获取时打印输出下返回数据是否有问题等,具体分析如下
① 异步问题
确保数据的获取是异步完成的。如果你的数据是通过异步请求获取的,确保在数据返回之前不要执行任何赋值操作。你可以使用async/await或者.then()语法确保异步请求完成后再进行赋值。
② 数据是否正确
确保你查询到的数据是正确的。你可以在控制台打印查询到的数据,确保它包含你所需的信息。
③ Reactivity(响应性)
Vue.js中的响应性是通过数据属性的getter和setter来实现的。确保你正在使用Vue.js的响应性系统来更新数据。如果你是在异步操作中修改数据,确保在Vue.js的上下文中执行这些操作。
④ 组件是否正确渲染
确保组件已正确渲染,并且你正在尝试更改的数据在组件中可见。你可以在组件的模板中使用双花括号 {{ variable }} 来输出数据,以确保它们正在正确显示。
4)解决
经过排查,本文问题为周期和响应性问题,具体修改为调整周日created为mounted,调整数据返回的赋值方式改为响应式获取,思路和代码如下:
① 之前在 created 钩子中异步调用方法,可能会导致在数据获取之前组件渲染完成,这可能导致数据无法正确地绑定到组件。将数据获取移动到 mounted 钩子中,因为 mounted 钩子在组件已经挂载到 DOM 后触发,这时候可以确保组件已经渲染完成。
② Vue.js 需要对象是响应式的才能在数据更改时触发视图更新。确保你的 form 对象是在 data 中声明的,并且使用了 Vue.set 或 this.$set 来确保嵌套属性的响应性。
mounted () {
if (this.id !== '0') {
this._getDetail()
}
},
methods: {
async _getDetail () {
try {
// 获取详情接口
const data = await GetInfo({
Id: this.id * 1,
})
if (data) {
this.form = data
this.form.id = ''
// 使用 Vue.set 或 this.$set 来确保响应性
this.$set(this.form, 'Name', data.RG_Name)
this.$set(this.form, 'Sign', data.RG_Sign)
this.$set(this.form, 'BG', { Id: data.BG_Id, Name: data.BG_Name })
this.$set(this.form, 'Sign', data.RG_Sign)
this.$set(this.form, 'RuleJson', JSON.parse(data.RuleJson))
this.dataList = this.form.RuleJson
}
} catch (error) {}
},
}
5)其他方便排查的原因在此做个列举
① 确保数据绑定正确
在模板中使用双花括号 {{ variable }} 输出数据,确保数据正确地绑定到组件。例如,你可以在模板中添加一些输出语句:
<template>
<div>
{{ form.Name }}
{{ form.BG }}
<!-- 其他组件的输出语句 -->
</div>
</template>
这将帮助你确定是否有数据正确地传递到了组件
② 检查数据类型和结构
确保 GetInfo 返回的数据与你在 New.vue 中的期望一致。可以在 mounted 钩子中使用 console.log(data) 来查看获取的数据结构。
async _getDetail () {
try {
const data = await GetInfo({
Id: this.id * 1,
})
console.log(data); // 查看数据结构
// ... 其他代码
} catch (error) {}
}
③ 检查是否有报错信息
查看浏览器控制台是否有任何错误消息。可能有网络请求问题或其他导致数据无法正确加载的问题。
④ 确保组件的 form 数据对象是响应式的
Vue.js 需要对象是响应式的才能在数据更改时触发视图更新。确保你的 form 对象是在 data 中声明的,并且使用了 Vue.set 或 this.$set 来确保嵌套属性的响应性。如本文解决办法
若本文有帮助到阅读本文的同学,欢迎点赞、关注、收藏,互相学习交流。
Vue + Element UI 实现复制当前行数据功能(复制到新增页面组件值不能更新等问题解决)的更多相关文章
- Vue + Element UI 实现权限管理系统 前端篇(十三):页面权限控制
权限控制方案 既然是后台权限管理系统,当然少不了权限控制啦,至于权限控制,前端方面当然就是对页面资源的访问和操作控制啦. 前端资源权限主要又分为两个部分,即导航菜单的查看权限和页面增删改操作按钮的操作 ...
- 基于 vue+element ui 的cdn网站(多页面,都是各种demo)
前言:这个网站持续更新中...,有网上预览,github上也有源码,喜欢记得star哦,欢迎留言讨论. 网站地址:我的个人vue+element ui demo网站 github地址:yuleGH g ...
- 分享一个自搭的框架,使用Spring boot+Vue+Element UI
废弃,新的:https://www.cnblogs.com/hackyo/p/10453243.html 特点:前后端分离,可遵循restful 框架:后端使用Spring boot,整合了aop.a ...
- vue + element ui 表格自定义表头,提供线上demo
前言:工作中用到 vue+element ui 的前端框架,需要使用自定义表头,需要使用 re.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9710826.h ...
- vue+element ui 的表格列使用组件
前言:工作中用到 vue+element ui 的前端框架,有这个场景:很多表格的列有许多一样的,所以考虑将列封装为组件.转载请注明出处:https://www.cnblogs.com/yuxiaol ...
- Vue+element ui table 导出到excel
需求: Vue+element UI table下的根据搜索条件导出当前所有数据 参考: https://blog.csdn.net/u010427666/article/details/792081 ...
- 基于vue(element ui) + ssm + shiro 的权限框架
zhcc 基于vue(element ui) + ssm + shiro 的权限框架 引言 心声 现在的Java世界,各种资源很丰富,不得不说,从分布式,服务化,orm,再到前端控制,权限等等玲琅满目 ...
- Vue + Element UI 实现权限管理系统
Vue + Element UI 实现权限管理系统 前端篇(一):搭建开发环境 https://www.cnblogs.com/xifengxiaoma/p/9533018.html
- vue + element ui 实现实现动态渲染表格
前言:之前需要做一个页面,能够通过表名动态渲染出不同的表格,这里记录一下.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9786326.html 网站地址:我的 ...
- vue+element ui 的上传文件使用组件
前言:工作中用到 vue+element ui 的前端框架,使用到上传文件,则想着封装为组件,达到复用,可扩展.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9 ...
随机推荐
- 关于微信小程序原生组件与uniApp混合开发过程遇到的问题与解决方式
前言: 在实际开发过程中,尤其是小程序的开发,我们常常会遇到一些在文档中解决不了的问题,在这里,我就浅谈一下我遇到的一些问题 1.小程序的构建框架是uni-app,却突然被要求用原生的微信小程序代码来 ...
- 【技术积累】Linux中的命令行【理论篇】【二】
ag命令 命令介绍 ag命令是一个用于在Linux系统中进行文本搜索的工具.它是基于Silver Searcher的改进版本,具有更快的搜索速度和更强大的功能. ag命令的基本用法是在指定的目录中搜索 ...
- C# 多线程访问之 SemaphoreSlim(信号量)【进阶篇】
SemaphoreSlim 是对可同时访问某一共享资源或资源池的线程数加以限制的 Semaphore 的轻量替代,也可在等待时间预计很短的情况下用于在单个进程内等待. 由于 SemaphoreSlim ...
- LangChain:打造自己的LLM应用
1.LangChain是什么 LangChain是一个框架,用于开发由LLM驱动的应用程序.可以简单认为是LLM领域的Spring,以及开源版的ChatGPT插件系统.核心的2个功能为: 1)可以将 ...
- 使用lame转wav为mp3
使用lame转wav为mp3 由于服务器之前都是直接存储wav格式的录音文件,存储空间总是不够用.网上搜索了一下,可以使用lame这个开源工具,将wav转成MP3 格式,还可以将mp3文件转回wav格 ...
- 手写 Vuex4 源码
本文首发于掘金,未经许可禁止转载 Vuex4 是 Vue 的状态管理工具,Vuex 和单纯的全局对象有以下两点不同: Vuex 的状态存储是响应式的 不能直接改变 store 中的状态.改变 stor ...
- 【RocketMQ】消息的发送
RocketMQ是通过DefaultMQProducer进行消息发送的,它实现了MQProducer接口,MQProducer接口中定义了消息发送的方法,方法主要分为三大类: send同步进行消息发送 ...
- 《小白WEB安全入门》02. 开发篇
@ 目录 初识HTML潜在漏洞 初识CSS潜在漏洞 初识JS潜在漏洞 初识后端潜在漏洞 后端能做什么 后端种类 后端框架 潜在漏洞 本系列文章只叙述一些超级基础理论知识,极少有实践部分 本文涉及到的语 ...
- Ubuntu Linux 更换国内源
Ubuntu的官方源对于国内用户来说是比较慢的,可以将它的源换成国内的源,用起来就快很多了. # Ubuntu server 环境 ubuntu@ubuntu:~$ sudo su - [ sudo ...
- MIPS寄存器堆
实验目的 熟悉并掌握 MIPS 计算机中寄存器堆的原理和设计方法 理解源操作数/目的操作数的概念 实验环境 Vivado 集成开发环境 MIPS寄存器 寄存器R0的值恒为0. 模块接口设计 1个写端口 ...