javascript - Vue.js - 禁用提交按钮,除非原始表单数据已更改

标签 javascript vue.js vuejs2

我有一个简单的表单,只是为了实验目的而创建的。我试图保持按钮禁用,除非原始表单数据发生更改,但如果数据更改恢复到原始数据(撤消),仍保持按钮禁用。

<template lang="pug">
  form(@click.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="isFormEnable") Save
</template>

<script>
export default {
  name: 'userForm',
  data () {
    return {
      user: {
        name: 'John Doe',
        email: 'john@gmail.com',
        age: '35',
        sex: 'Male',
      }
    }
  },

  computed: {
    isFormEnable () {
      // I am not sure what I need to do here but something like this may be:
      if (user.name) { return true }
    }
  },

  methods: {
    save () {
      console.log('Form Submitted')
    }
  }
}
</script>

我找到了一个 jQuery 解决方案 here但我正在寻找 vanilla/vue javascript 解决方案。

$('form')
    .each(function(){
        $(this).data('serialized', $(this).serialize())
    })
    .on('change input', function(){
        $(this)             
            .find('input:submit, button:submit')
                .prop('disabled', $(this).serialize() == $(this).data('serialized'))
        ;
     })
    .find('input:submit, button:submit')
        .prop('disabled', true)
;

最佳答案

这是我如何在 1 个模块的帮助下做到这一点

npm 我深度差异

deep-diff 用于比较对象值。

<script>
import { diff } from "deep-diff";

// default form value
const defaultUser = {
  name: "John Doe",
  email: "john@gmail.com",
  age: "35",
  sex: "Male"
};

export default {
  //...
  data() {
    return {
      user: { ...defaultUser } // cloning the object using object spread syntax
    };
  },

  computed: {
    isFormEnable() {
      // check if it's default value
      if (!diff(this.user, defaultUser)) return false;

      return true;
    }
  },
  //...
};
</script>

关于javascript - Vue.js - 禁用提交按钮,除非原始表单数据已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49623074/

相关文章:

javascript - Node.js 进程中运行的 setInterval 导致内存泄漏

javascript - 如何触发带有类标签的按钮?

javascript - 在扩展组件的数据中使用时,扩展组件的数据未定义

javascript - jQuery 的 $ ('.foo' 的非库等价物是什么,上下文)?

javascript - vuetifyjs 选择 'hide-selected=true' 仅显示前 20 个项目

vue.js - 无法使用 'in' 运算符在 undefined 中搜索 'X'

javascript - 如何通过循环使用vuex中的img src

javascript - 调用对象中定义的函数

javascript - axios没有发出请求,没有结果,没有错误

javascript - 拖放文件上传