Описание (Tl; д-р):Vuex ошибка мутации, когда передача объекта (с объектами) к компоненту
Когда я передать «объект объектов» от магазина vuex к компонентам через v-model
, модификации от модели производят ошибку. Только, когда «Объект объектов» прошел. С любым другим типом все в порядке.
Когда я сказал «Объект объектов», я имею в виду эту структуру: {'A': {name: 'first'}, 'B': {name: 'second'}}
.
Workflow и structire:
- Структура:
view (page)
->parent
->child
; - Просмотреть Получите
Object
из магазина и передайте его на компоненты (->parrent
->child
); - Нет «
.sync
» разрешено, поэтому компоненты не должны мутировать объект в магазине; - После изменений в
child
,child
придется возвращать результатparent
,parent
наview
иview
должны сохранить его с помощью сеттер vuex в;
Сообщение об ошибке:
Error when evaluating setter "value.name": Error: [vuex] Do not mutate vuex store state outside mutation handlers. (found in component: <child>)
Getter (из магазина):
getObjFromStore // return {'A': {name: 'first'}, 'B': {name: 'second'}}
View (страница):
<parent :value="getObjFromStore"></parent>
Родитель компонент:
<template>
<div v-for="v in value">
<child :value="v"></child>
</div>
</template>
<script>
import Child from 'components/child'
export default {
data() {
return {}
},
props: {
value: {
type: Object
}
},
components: {
Child
}
}
</script>
Детский компонент:
<template>
<input type="text" v-model="value.name">
</template>
<script>
export default {
data() {
return {}
},
props: {
value: {
type: Object
}
}
}
</script>
P.S. Я предполагаю, что проблема возникает из-за того, что объекты переданы по ссылке. Но как бороться с этой ошибкой?
я уже знал это, но '@ input' не подходит для моего случая, и я не могу определить пользовательские геттер/сеттер внутри моего компонента, причины Мне нужно использовать события и использовать setter сверху (view). Я хочу понять, почему эта ошибка возникает только тогда, когда объект с объектами внутри прошел –
Ну, если вы получаете объект из хранилища, его следует модифицировать только с помощью мутаций, а не с помощью прямых сеттеров на объекте (и те, которые используются 'v -model'). Я немного смущен ... вы пытаетесь смешивать и сопоставлять Vuex и vanilla Vue в одном приложении? – pkawiak
Да, причиной того, что низкоуровневый компонент ничего не знает о магазинах. В основном 'userView' ->' userList' -> 'list'. Чем «Список» должен предоставлять данные (изменен) непосредственно на 'userList', но не хранить. И 'userList' может содержать некоторые другие элементы (кнопки) и должен предоставлять данные непосредственно' userView'. View имеют собственный магазин и сохраняют в нем собственное состояние. Мой рабочий процесс сосет? –