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

2024-09-02 01:12

本文主要是介绍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的新副本。这样,每个表单项都是独立的,修改一个表单项不会影响其他表单项。

这篇关于Vue 3 Composition API 中如何正确添加表单项副本到数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128581

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加