2016-08-31 4 views
0

Описание (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. Я предполагаю, что проблема возникает из-за того, что объекты переданы по ссылке. Но как бороться с этой ошибкой?

ответ

0

В основном только 2 варианта:

  1. пропускам DeepCopy объекта к props;
  2. Использование @input события или v-model с вычисленными опорами (как в ответе pkawiak https://stackoverflow.com/a/39249362/930170);

Я предпочитаю использовать deepcopy, в то время как я уверен, что объект не слишком большой. Этот подход помогает сохранить код более чистым и намного проще в обслуживании.

Второй подход только в тех случаях, когда ожидается объект чертов-большой

1

Взгляните на документы Vuex form handling. Он рекомендует, используя @input событие или v-model с расчетным реквизитом ...

Предполагая, что OBJ является вычисляемым свойством, которое возвращает объект из магазина, v-модель здесь будет пытаться непосредственно мутировать obj.message, когда пользователь на входе. В строгом режиме это приведет к ошибке, потому что мутация не выполняется внутри явного обработчика мутации Vuex.

+0

я уже знал это, но '@ input' не подходит для моего случая, и я не могу определить пользовательские геттер/сеттер внутри моего компонента, причины Мне нужно использовать события и использовать setter сверху (view). Я хочу понять, почему эта ошибка возникает только тогда, когда объект с объектами внутри прошел –

+0

Ну, если вы получаете объект из хранилища, его следует модифицировать только с помощью мутаций, а не с помощью прямых сеттеров на объекте (и те, которые используются 'v -model'). Я немного смущен ... вы пытаетесь смешивать и сопоставлять Vuex и vanilla Vue в одном приложении? – pkawiak

+0

Да, причиной того, что низкоуровневый компонент ничего не знает о магазинах. В основном 'userView' ->' userList' -> 'list'. Чем «Список» должен предоставлять данные (изменен) непосредственно на 'userList', но не хранить. И 'userList' может содержать некоторые другие элементы (кнопки) и должен предоставлять данные непосредственно' userView'. View имеют собственный магазин и сохраняют в нем собственное состояние. Мой рабочий процесс сосет? –

Смежные вопросы