Вы уже пытаетесь использовать .sync
, и это одно из возможных решений. Передача примитивных значений, как в следующем коде, не работает и будет выдавать Vue предупреждений, так как мы изменяем свойство напрямую:
// InputWrapper
<input
v-model="freeformValue"
>
// Demo
<InputWrapper
:freeformValue.sync="person.ExactIncome"
></InputWrapper>
Мы можем передать весь объект как свойство, как в следующем примере. Это работает и не выдает никаких предупреждений, но передача объекта не всегда является оптимальным решением, а источник мутации остается неясным.
// InputWrapper
<input
v-model="freeformValue.ExactIncome"
>
// Demo
<InputWrapper
:freeformValue.sync="person" //pass an object here
></InputWrapper>
Решение, предложенное @MisterIsaak, более удобно:
// InputWrapper
<input
v-model="wrappedFreeform"
>
computed: {
wrappedFreeform: {
get() {
return this.freeformValue; // here we just get the value
},
set(v) {
this.$emit("update:freeformValue", v); // emmit an event instead of mutating the prop directly
}
}
}
// Demo
<InputWrapper
:freeformValue.sync="person.ExactIncome" //the value will be updated properly
></InputWrapper>