I'm trying to create a modal but I'm getting this error only when I close it:
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "value"
found in
---> <PanelDesconectarModal> at resources\assets\vue\PanelDesconectarModal.vue
<VNavigationDrawer>
<PanelDrawer> at resources\assets\vue\PanelDrawer.vue
<VApp>
<PanelRoot> at resources\assets\vue\PanelRoot.vue
<VApp>
<Root>
PanelDesconectarModal.vue
<template>
<v-dialog v-model="value" max-width="350">
<v-card :dark="($theme === 'dark')">
<v-card-title class="headline">Desconectar</v-card-title>
<v-divider></v-divider>
<v-card-text>Você tem certeza que deseja desconectar-se?</v-card-text>
<v-card-actions>
<v-spacer></v-spacer>
<v-btn flat @click.native="closeDialog">Cancelar</v-btn>
<v-btn :color="$color" flat="flat" @click.native="desconectar">Desconectar</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<script>
export default {
name: 'panel-desconectar-modal',
props: ['value'],
methods: {
closeDialog() {
this.value = false;
},
desconectar() {
this.closeDialog();
window.location = this.$route + '/panel/desconectar';
}
}
}
</script>
Using ProgressDesconectarModal.vue, showDesconectar is a data variable
<panel-desconectar-modal :value="showDesconectar"></panel-desconectar-modal>
Emitting Events with setup()$emit() to send our event. Instead, we can access our emit method by using the second argument of our setup function – context . context has access to your components slots, attributes, and most importantly for us, its emit method. We can call context.
Vuex is a state management pattern + library for Vue. js applications. It serves as a centralized store for all the components in an application, with rules ensuring that the state can only be mutated in a predictable fashion.
This happens because you have props value
in your v-model
.
Do not do that, as that will mutate the prop(value
) when v-model
changes (you should only change data
values with v-model
afaik, but in this case, you don't even need additional data
variable).
Since vuejs v2.3.0, it is suggested to emit
value to the parent, so that parent changes it, and it is then passed to child component.
in v-dialog
component
remove v-model
and replace it with :value="value" @input="$emit('input')"
And your function:
closeDialog() {
this.$emit('input');
}
In panel-desconectar-modal
component use v-model="showDesconectar"
.
This will work because:
<input v-model="something"> is syntactic sugar for: <input v-bind:value="something" v-on:input="something = $event.target.value">
Here is working example pen which I provided in an answer to similar question.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With