首页 > 其他分享 >vue中表单修改提交前利用watch找出新数据和原来数据之间的改动

vue中表单修改提交前利用watch找出新数据和原来数据之间的改动

时间:2024-04-02 11:11:07浏览次数:20  
标签:vue formData watch 表单 Vue key 数据 属性

<template>  
  <div>  
    <form @submit.prevent="submitForm">  
      <input v-model="formData.name" type="text" placeholder="Name">  
      <input v-model="formData.email" type="email" placeholder="Email">  
      <button type="submit">Submit</button>  
    </form>  
  </div>  
</template>  
  
<script>  
export default {  
  data() {  
    return {  
      formData: {  
        name: '',  
        email: '',  
      },  
      originalData: {  
        name: '',  
        email: '',  
      }  
    }  
  },  
  watch: {  
    formData: {  
      handler(newVal, oldVal) {  
        // 对比新旧值找出改动部分  
        this.findChanges(newVal, oldVal);  
      },  
      deep: true, // 设置为deep,以便于监听对象内部数据的变动  
    }  
  },  
  methods: {  
    submitForm() {  
      // 提交表单前进行数据对比  
      this.findChanges(this.formData, this.originalData);  
    },  
    findChanges(newData, oldData) {  
      // 找出新旧数据中存在但对方不存在的属性,即新增属性或被删除的属性  
      const newKeys = Object.keys(newData).filter(key => !Object.keys(oldData).includes(key));  
      const oldKeys = Object.keys(oldData).filter(key => !Object.keys(newData).includes(key));  
      console.log('新增属性:', newKeys); // 新增属性或被删除的属性  
      console.log('被删除属性:', oldKeys); // 新增属性或被删除的属性  
      // 对比新旧数据属性值是否发生改变,这里只简单判断新旧值是否相等,实际应用中可能需要更为详细的对比逻辑。  
      const changes = [];  
      Object.keys(newData).forEach(key => {  
        if (newData[key] !== oldData[key]) {  
          changes.push({ key, oldValue: oldData[key], newValue: newData[key] });  
        }  
      });  
      console.log('发生改变的属性:', changes); // 发生改变的属性及其新旧值  
    }  
  },  
  mounted() {  
    // 初始加载时保存原始数据,后续表单数据变动时将自动对比找出改动部分。注意这里使用setTimeout模拟异步数据加载。实际开发中根据实际情况进行数据加载。  
    setTimeout(() => {  
      this.originalData = Object.assign({}, this.formData); // 复制一份原始数据,用于后续对比。实际开发中原始数据可能是从服务器加载的异步数据。  
    }, 1000); // 假设1秒后数据加载完成,将原始数据保存在originalData中。实际开发中原始数据的加载时间可能会更长。  
  }  
}  
</script>

在Vue.js中,<form @submit.prevent="submitForm"> 是一个表单元素(<form>)绑定了一个事件监听器的示例。这里的监听器是用来处理表单的提交事件的。

  1. <form>:这是HTML的表单元素,通常用于收集用户输入。
  2. @submit:这是Vue的事件监听器语法,用于监听表单的submit事件。当表单尝试提交时(例如,当用户点击一个提交按钮时),这个事件就会被触发。
  3. .prevent:这是一个事件修饰符,它告诉Vue在触发事件处理函数之前先调用event.preventDefault()。在表单提交的情况下,这通常会阻止浏览器默认的表单提交行为(即跳转到新页面或重新加载当前页面)。
  4. "submitForm":这是当表单提交事件被触发时将要调用的Vue实例中的方法名。这个方法通常定义在Vue组件的methods对象中,用于处理表单数据。

watch是一个非常有用的特性,它允许你对组件的数据进行观察和响应。当被观察的数据发生变化时,watch属性中的函数就会被调用。

  1. watch: 这是 Vue 的一个选项,用于观察和响应组件的数据变化。
  2. formData: 这是你要观察的数据属性名。这意味着当 formData 发生变化时,与其关联的 handler 函数就会被触发。
  3. handler(newVal, oldVal): 这是一个函数,当 formData 发生变化时,这个函数会被调用。newVal 是 formData 的新值,而 oldVal 是它原来的值。
  4. this.findChanges(newVal, oldVal): 在 handler 函数内部,你调用了 findChanges 方法,并将新值和旧值作为参数传递给它。这个方法可能是用来找出新旧值之间的差异或进行其他处理。
  5. deep: true: 当设置为 deep: true 时,Vue 会深度观察 formData。这意味着不仅仅是 formData 的值会变化,其内部的对象或数组的任何变化也会触发 handler 函数。如果只是简单观察基本类型(如字符串或数字),则不需要设置 deep

标签:vue,formData,watch,表单,Vue,key,数据,属性
From: https://www.cnblogs.com/whblogs/p/18110169

相关文章

  • Ant Design Vue中的table与pagination的联合使用
    效果: 代码:<a-table:dataSource="dataSource":columns="columns":pagination="pagination"@change="handleTableChange":scroll="{x:'100%',y:600}"></a-table>......
  • vue3从精通到入门9:计算属性computed
    在Vue3中,computed 是一个用于创建计算属性的工具,它基于组件的响应式依赖进行复杂的计算,并返回一个新的响应式引用。计算属性是Vue的一个核心概念,它提供了一种声明式的方式来执行基于其依赖的响应式数据的计算。computed使用:计算属性与常规属性类似,但是它们是基于它们......
  • 2024前端vue面试问题以及答案
    Vuex相关问题Vuex是什么,它解决了什么问题?Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex的核心概念有哪些?State:存储所有组件的状态。Getters:类似于计算属......
  • Vue 3.0 + Element-Plus + Ruoyi
    1项目搭建1.1项目源码1.2项目架构后端目录结构ruoyi-admin:后台服务的核心模块,包含主要的业务处理逻辑。ruoyi-common:公共模块,包含工具类和通用代码。ruoyi-framework:框架核心,包含安全、配置和核心管理功能。ruoyi-generator:代码生成模块,用于自动生成代码。ruoyi-quar......
  • Vue.js基础指令
    (在讲指令之前,可以先了解插值表达式,如果已经知道,当我没说)一.插值表达式1.数据绑定最常见的形式就是双大括号的文本插值,Mustache上属性的值替代。只要绑定的数据对象上属性发生了改变,插值处的内容都会更新。,message是将数据解析成纯文本的,也就是说,就算中含有了html,message......
  • vue3 设置el-dialog height超过滚动条
     方法一:<stylescoped>::v-deep.el-dialog.el-dialog-body{height:500px;overflow-y:auto;}</style> 如果要设置动态的高度话,则要在setup里面设置 <script>exportdefaultdefineComponent({setup:{constcssContent=ref({heigh......
  • 前端技术栈和Vue学习总结
    前端技术栈+Vue笔记ES6新特性1.let1)let声明有严格的局部作用域​ 此时"console.log("job="+job)"将报错 {varname="zy学习";letjob="java工程师";console.log("name="+name)console.log("job=&quo......
  • vue在组件销毁的时候将异步请求撤销
    背景Vue2+ArcGISJS加载图层使用FeatureLayer.queryFeatures(query)对服务端执行地理数据查询请求。该请求为fetch类型。复现Bug:刚打开专题A,未等加载完,点击快速切换到共用同一个地图的新专题B,地图却加载专题A的数据图层。原因:由于地图还是用的同一个对象,且该函数Feat......
  • 使用Element-UI的form表单验证文件是否上传
    项目中有个需求,表单中的文件为必传项。 其中使用了element-ui的form表单验证,话不多说,上代码。<template><div><el-formlabel-position="top":model="reportForm"ref="checkerForm":rules="rules"label-......
  • vue3中播放flv流视频,以及组件封装超全
    实现以上功能的播放,只需要传入一个流的地址即可,当然组件也只有简单的实时播放功能下面直接上组件里面的flvjs通过npmiflv.js直接下载 <template><divclass="player"style="position:relative;"><pstyle="position:absolute!important;top:10px;lef......