Документы vue.js довольно строги, утверждая, что мутирование реквизита внутри компонента - плохая практика. Также описаны два случая, в которых у разработчика может возникнуть желание нарушить это правило:
- При установке значения по умолчанию
- Когда данные значения реквизита должны быть изменены.
Поскольку я начал с vue.js, у меня возникло искушение обновить свойство props с помощью v-model
. Заходя в Интернет, я нашел несколько обсуждений, которые включали обходные пути или использование vuex.
Мой вопрос таков: обновляет ли свойство реквизита с помощью v-model
OK или плохо, потому что оно изменяет родительское состояние.
Имо, я хочу изменить родительское состояние, рассмотрим этот пример
Компонент Crud, который загружает определенный компонент формы:
<template>
<awesome-form @formSubmit="onFormSubmit" :entity="entity"></awesome-form>
</template>
<script>
import AwesomeForm from 'SomeForm'
export default {
data () {
return {
entity: {}
}
},
components: {
AwesomeForm
},
methods: {
onFormSubmit () {
axios.post('/backend', this.entity)
}
}
}
</script>
Конкретный компонент формы:
<template>
<form @submit.prevent="submit">
<input type="text" name="username" v-model="entity.username" />
...
</form>
</template>
<script>
export default {
props: {
entity: {
type: Object
}
},
methods: {
submit () {
this.$emit('formSubmit')
}
}
}
</script>
Это работает так, как задумано, и делает привязку данных очень простой. Но я думаю, это считается плохим, так как обновляет родительское состояние. Но в конце концов это именно то, чего я хочу.
Это действительно плохо и каковы альтернативы?
- Наличие событий для каждого обновления и отдельного свойства (супер избыточный)
- Всегда используйте vuex ... (правда?)