Vue's global API Vue.set
and Vue.delete
should be called with proper argument
- VUE_BAD_PROPERTY_SET_DELETE
- Error
- Medium
- vue
This rule applies when Vue.set()
or Vue.delete()
is called with wrong arguments.
The first argument of Vue.set()
or Vue.delete()
cannot be a Vue instance, or the root data object of a Vue instance. In this case, Vue outputs a warning message and ignores the function call.
Vue does not allow dynamically adding or deleting root-level reactive properties to an already created instance.
- In order to modify the value of a root-level property at runtime, declare the property upfront in
data
option and modify it by assigning the value instead of calling the API. - In order to add or delete reactive properties at runtime, make a wrapper object and call
Vue.set()
orVue.delete()
method on the object.
Note: This rule is based on Vue 2.x API specifications.
Noncompliant Code Example
View with compliant examples side by side<template>
<div>
<input class="input" type="text" v-model="inputString">
<button @click="storeString">+</button>
<button @click="resetString">-</button>
<p>
{{ this.$data }}
</p>
</div>
</template>
<script>
export default {
data() {
return {
inputString: ''
}
},
methods: {
storeString() {
// NOTE: this.$set is an alias to the global Vue.set
this.$set(this, 'storedString', this.inputString); // VUE_BAD_PROPERTY_SET_DELETE alarm
},
resetString() {
// NOTE: this.$delete is an alias to the global Vue.delete
this.$delete(this, 'storedString'); // VUE_BAD_PROPERTY_SET_DELETE alarm
}
}
}
</script>
Compliant Code Example
View with noncompliant examples side by side<template>
<div>
<input class="input" type="text" v-model="inputString">
<button @click="storeString">+</button>
<button @click="resetString">-</button>
<p>
{{ this.$data }}
</p>
</div>
</template>
<script>
export default {
data() {
return {
inputString: '',
storedString: ''
}
},
methods: {
storeString() {
// NOTE: this.$set is an alias to the global Vue.set
this.storedString = this.inputString;
},
resetString() {
// NOTE: this.$delete is an alias to the global Vue.delete
this.storedString = null;
}
}
}
</script>
Version
This rule was introduced in DeepScan 1.17.0-beta.
See
[Vue warn] Avoid adding reactive properties to a Vue instance or its root $data at runtime - declare it upfront in the data option.
[Vue warn] Avoid deleting properties on a Vue instance or its root $data - just set it to null.