javascript Vue如何检测表单输入更改

ct2axkht  于 2023-04-19  发布在  Java
关注(0)|答案(3)|浏览(172)

在我的vue-应用程序中,我有一个表单,它应该检测每个更改。我试图使用@change和一个观察器,但没有运气...

form: {
  name: "",
  surname: "",
  email: "",
},
changed: false

在我的模板中:

<form @change="hasChanged">

我的观察者和方法:

watch: {
    form: {
        handler: function(v) {
            return this.hasChanged();
        },
        deep: true
    }
},
methods: {
  hasChanged(){
    this.changed = true
  }
}

但这不起作用……我做错了什么?

g6ll5ycj

g6ll5ycj1#

表单元素没有更改侦听器。请考虑改为使用onChanged事件绑定每个输入。
在我看来,你似乎想知道表单是否被编辑过。如果是这样的话,你可以试试这个

<template>
    <form>
        <input v-model="form.first_name"/>
        <input v-model="form.last_name"/>
        <input v-model="form.email"/>
    </form> 
</template>

<script>
    const defaultForm = {
        first_name: '',
        last_name: '',
        email: '',
    }  
    export default {
      data () {
        return {
            // form: defaultForm
            // edit
            form: {...defaultForm}
        }
      },
      computed: {
        hasChanged () {
          return Object.keys(this.form).some(field => this.form[field] !== defaultForm[field])
        }
      }
    }
</script>
ybzsozfc

ybzsozfc2#

你可以使用vuejs的手表,一个非常简单的技巧。

watch: {
   'form': {
        handler: function(v) {
         return this.enableFormSubmission();
        },
        deep: true
    }
},
ippsafx7

ippsafx73#

基于@Babacar answerhasChanged总是返回false,因为formdefaultForm引用的是同一个对象。在渲染之前,表单应该是一个副本。我们可以对普通情况和嵌套对象使用浅副本,我们需要使用深副本。

<template>
    <form>
        <input v-model="form.first_name"/>
        <input v-model="form.last_name"/>
        <input v-model="form.email"/>
    </form> 
</template>

<script>
    const defaultForm = {
        first_name: '',
        last_name: '',
        email: '',
    }  
    export default {
      data () {
        return {
            form: {...defaultForm } // copy here
        }
      },
      computed: {
        hasChanged () {
          return Object.keys(this.form).some(field => this.form[field] !== defaultForm[field])
        }
      }
    }
</script>

相关问题