You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue.js:仅在表单原始数据变更后启用提交按钮(含撤销判断)

实现表单变更检测以控制提交按钮状态

嘿,我来帮你搞定这个表单按钮的状态控制需求!核心思路是保存原始数据的快照,并实时对比当前数据与快照的差异,以此来决定按钮是否启用。下面是具体的实现步骤和修改后的代码:

1. 保存原始数据快照

首先要在组件初始化时,对初始的user数据做深拷贝,把它存为原始数据的基准。因为直接赋值会让两个变量指向同一个对象,修改user会同步改变原始值,所以必须用深拷贝来隔离:

export default {
  data() {
    return {
      user: {
        name: '',
        email: '',
        age: '',
        sex: 'Male'
      },
      originalUser: {} // 用来存储原始数据的快照
    }
  },
  created() {
    // 用JSON序列化的方式实现深拷贝(适合普通数据类型)
    this.originalUser = JSON.parse(JSON.stringify(this.user));
    // 如果你的user包含Date这类无法JSON序列化的类型,可以用lodash的_.cloneDeep,或者自己实现深拷贝函数
  }
}

2. 编写计算属性判断数据是否变更

创建一个计算属性,用来对比当前user和originalUser的内容是否完全一致。如果一致,按钮保持禁用;不一致则启用:

computed: {
  isFormDisabled() {
    // 自定义一个简单的深比较函数,对比两个对象的所有属性值
    const isObjectEqual = (objA, objB) => {
      const keysA = Object.keys(objA);
      const keysB = Object.keys(objB);

      if (keysA.length !== keysB.length) return false;

      for (const key of keysA) {
        if (objA[key] !== objB[key]) return false;
      }
      return true;
    };

    // 返回是否禁用:数据未变更则禁用按钮
    return isObjectEqual(this.user, this.originalUser);
  }
}

3. 调整Pug模板的按钮绑定

注意你原来的变量名isFormEnable逻辑是反的——:disabled绑定的是「是否要禁用按钮」,所以应该绑定我们刚写的isFormDisabled,同时建议把表单的点击事件改成@submit.prevent,更符合表单的语义(用户按回车也能触发提交):

template(lang="pug")
  form(@submit.prevent="save")
    .main
      input(v-model="user.name")
      input(v-model="user.email")
      input(v-model="user.age")
      select(v-model="user.sex")
        option Male
        option Female
    .footer
      button(:disabled="isFormDisabled") Save

补充小提示

如果你的表单数据包含嵌套对象、数组这类复杂结构,JSON序列化的深拷贝可能会出问题,这时候可以引入lodash的_.isEqual来简化对比逻辑:

import _ from 'lodash';

computed: {
  isFormDisabled() {
    return _.isEqual(this.user, this.originalUser);
  }
}

这样就能完美实现需求:按钮默认禁用,数据变更后自动启用,恢复原始数据后又会回到禁用状态~

内容的提问来源于stack exchange,提问作者Syed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:08:19