当前位置: 首页 > news >正文

Vue 3 Composition API 中如何正确添加表单项副本到数组

        在 Vue 3 中,使用 Composition API 时,如果你尝试直接通过引用(如 formState)来填充 formList 数组,你会遇到一个问题:所有通过 addForm 方法添加的表单项实际上都是对 formState 的同一个引用。这意呀着,如果你修改了任何一个表单项,所有其他通过 formState 添加的表单项也会同时被修改,因为它们实际上都是指向同一个对象。

        为了解决这个问题,你需要在每次调用 addForm 方法时创建一个 formState 的新副本。这可以通过展开操作符(...)或者使用 Object.assign() 来实现。以下是两种方法的示例:

方法 1: 使用展开操作符

import { reactive, ref } from 'vue';  const formState = reactive({  studentId: undefined,  coachId: undefined,  contractId: undefined,  startDate: '',  startTime: '',  endDate: '',  endTime: '',  memo: '',  
});  const formList = ref([]);  const addForm = () => {  // 创建一个 formState 的新副本并添加到 formList 中  formList.value.push({ ...formState });  
};

方法 2: 使用 Object.assign()

注意,Object.assign() 会返回目标对象(即新对象),但需要注意的是,如果 formState 中的属性值是对象或数组等引用类型,则这些嵌套对象或数组不会被深拷贝,而只是浅拷贝。对于基本数据类型(如数字、字符串、布尔值等),这种方法是足够的。

const addForm = () => {  // 创建一个 formState 的新副本(浅拷贝)并添加到 formList 中  formList.value.push(Object.assign({}, formState));  
};

完整示例

        这里是一个完整的示例,展示了如何在 Vue 3 组件中使用上述方法:

<template>  <div>  <button @click="addForm">Add Form</button>  <div v-for="(form, index) in formList" :key="index">  <!-- 渲染表单内容 -->  <p>Student ID: {{ form.studentId }}</p>  <!-- 其他表单字段... -->  <button @click="removeForm(index)">Remove</button>  </div>  </div>  
</template>  <script>  
import { reactive, ref } from 'vue';  export default {  setup() {  const formState = reactive({  studentId: undefined,  // 其他字段...  });  const formList = ref([]);  const addForm = () => {  formList.value.push({ ...formState });  };  const removeForm = (index) => {  formList.value.splice(index, 1);  };  return { formList, addForm, removeForm };  },  
};  
</script>


在这个示例中,每次点击“Add Form”按钮时,都会通过 addForm 方法在 formList 中添加一个formState的新副本。这样,每个表单项都是独立的,修改一个表单项不会影响其他表单项。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 快讯 | 阿里开源Qwen2-VL视觉大模型:刷新多模态AI性能
  • 【华为】轻松get!eNSP登录无线AC Web界面的新姿势
  • 反向迭代器:reverse_iterator的实现
  • 嵌入式Linux C应用编程指南-高级I/O(速记版)
  • 科研绘图系列:R语言组合图形绘图
  • unity游戏开放:标记物体 一目了然
  • Bean 的生命周期
  • gpt开发
  • vue如何引入element-ui
  • 有了它 一键掌握Vue新版本!
  • 【学习笔记】卫星通信NTN 3GPP标准化进展分析(六)- 参考标准
  • 基于Java的基础简单网络编程
  • Redis从入门再到入门(中)
  • 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch12 随机森林(Random Forest)
  • 算法的学习笔记—把数字翻译成字符串
  • python3.6+scrapy+mysql 爬虫实战
  • 【个人向】《HTTP图解》阅后小结
  • 4个实用的微服务测试策略
  • Asm.js的简单介绍
  • css的样式优先级
  • download使用浅析
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • EventListener原理
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Python连接Oracle
  • rc-form之最单纯情况
  • 给第三方使用接口的 URL 签名实现
  • 聚类分析——Kmeans
  • 码农张的Bug人生 - 见面之礼
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 那些年我们用过的显示性能指标
  • 学习笔记TF060:图像语音结合,看图说话
  • 源码安装memcached和php memcache扩展
  • 再谈express与koa的对比
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #预处理和函数的对比以及条件编译
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (2)nginx 安装、启停
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Python) SOAP Web Service (HTTP POST)
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (蓝桥杯每日一题)love
  • (三) diretfbrc详解
  • (转)shell调试方法
  • (转)为C# Windows服务添加安装程序
  • .Net - 类的介绍