Is it possible to change props value from method in Vue component? Is it possible to change props value from method in Vue component? laravel laravel

Is it possible to change props value from method in Vue component?


What you are doing will throw a warning in Vue (in the console).

[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: "propRoomSelected"

The value will actually change inside the component, but not outside the component. The value of a parent property cannot be changed inside a component, and, in fact, the updated value will be lost if the parent re-renders for any reason.

To update the parent property, what you should do is $emit the updated value and listen for the change in the parent.

Vue.component("navigation-form",{    template: '#navigation-form',    props: ['propRoomSelected'],    data: function () {      return {        roomSelected: this.propRoomSelected,      }  },  methods:{      updateCoachStatus: function(event){         this.$emit("update-room-selected", 67) ;      }  }})

And in your parent template listen for the event

<navigation-form :prop-room-selected='propRoomSelected'                 @update-room-selected="onUpdatePropRoomSelected"></navigation-form>

Here is an example.

This is a common pattern and Vue implemented a directive to make it slightly easier called v-model. Here is a component that supports v-model that will do the same thing.

Vue.component("navigation-form-two",{    template: '#navigation-form-two',    props: ['value'],    data: function () {      return {        roomSelected: this.value,      }  },  methods:{      updateCoachStatus: function(event){         this.$emit("input", 67) ;      }  }})

And in the parent template

<navigation-form-two v-model="secondRoomSelected">

Essentially, for your component to support v-model you should accept a value property and $emit the input event. The example linked above also shows that working.


Another approach is using a computed property for handling props:

{  template: '#navigation-form',  props: ['propRoomSelected'],  data () {    return {      roomSelected: this.computedRoomSelected,      changeableRoomSelected: undefined    }  },  computed: {    computedRoomSelected () {      if (this.changeableRoomSelected !== undefined) {        return this.changeableRoomSelected      }      return this.propRoomSelected    }  },  methods: {    updateCoachStatus (event) {      this.changeableRoomSelected = 67    }  }}