I have a simple form which I have created just for experiment purpose. I am trying to keep the button disable unless original form data is changed but still keep the button disabled if the data changes is reverted back to original data (undo).
JavaScript
x
42
42
1
<template lang="pug">
2
form(@click.prevent="save")
3
.main
4
input(v-model="user.name")
5
input(v-model="user.email")
6
input(v-model="user.age")
7
select(v-model="user.sex")
8
option Male
9
option Female
10
.footer
11
button(:disabled="isFormEnable") Save
12
</template>
13
14
<script>
15
export default {
16
name: 'userForm',
17
data () {
18
return {
19
user: {
20
name: 'John Doe',
21
email: 'john@gmail.com',
22
age: '35',
23
sex: 'Male',
24
}
25
}
26
},
27
28
computed: {
29
isFormEnable () {
30
// I am not sure what I need to do here but something like this may be:
31
if (user.name) { return true }
32
}
33
},
34
35
methods: {
36
save () {
37
console.log('Form Submitted')
38
}
39
}
40
}
41
</script>
42
I found a jQuery solution here but I am looking for vanilla/vue javascript solution.
JavaScript
1
14
14
1
$('form')
2
.each(function(){
3
$(this).data('serialized', $(this).serialize())
4
})
5
.on('change input', function(){
6
$(this)
7
.find('input:submit, button:submit')
8
.prop('disabled', $(this).serialize() == $(this).data('serialized'))
9
;
10
})
11
.find('input:submit, button:submit')
12
.prop('disabled', true)
13
;
14
Advertisement
Answer
Here’s how i would do it with the help of 1 module
npm i deep-diff
deep-diff
is for comparing object values.
JavaScript
1
31
31
1
<script>
2
import { diff } from "deep-diff";
3
4
// default form value
5
const defaultUser = {
6
name: "John Doe",
7
email: "john@gmail.com",
8
age: "35",
9
sex: "Male"
10
};
11
12
export default {
13
//...
14
data() {
15
return {
16
user: { defaultUser } // cloning the object using object spread syntax
17
};
18
},
19
20
computed: {
21
isFormEnable() {
22
// check if it's default value
23
if (!diff(this.user, defaultUser)) return false;
24
25
return true;
26
}
27
},
28
//...
29
};
30
</script>
31