= new Vuex.Store({
state: {
object: {}
},
mutations: {
init(state) {
state.object = _.assignIn({}, state.object, {
array: [1, 2, 3],
string: 'string',
num: 0,
obj: { key1: 1, key2: 2 }
})
},
},
getters: {
value(state) {
return _.get(state, 'object')
}
}
})
...
App.vue
...
<p>{{ $store.state }}</p>
<input type="text" v-model.number="value.num" />
<button type="button" @click="value.num++">+++</button>
<ul>
<li v-for="(num, idx) in value.array" :key="idx">
{{ num }}
<button type="button" @click="value.array.splice(idx, 1)">
delete
</button>
</li>
</ul>
...
Почему-то мутация value, которое является геттером, влияет напрямую на стейт. Как такое возможно? В другом проекте с vue 2.5.17 и vuex 3.1.1 этого поведения нету, и приходится отправлять экшны на обновление стейта. Разница просто в версии, как я понял?
>влияет напрямую на стейт. Как такое возможно? читаем про передачу объектов по ссылке >Почему-то мутация value а зачем ты вообще мутируешь геттер?
Я в курсе про ссылки Я просто попробовал интуитивно, и оно сработало. Я в курсе, что чище будет диспатчить экшны
во-первых, твой геттер абсолютно бесполезный во-вторых, он просто возвращает ссылку на объект в стейте, поэтому любая мутация этого объекта влияет на сам объект в стейте >чище будет диспатчить экшны это не “чище”, это единственный правильный вариант
Я не говорю сейчас о правильном подходе в написании кода, я говорю о конкретном поведении. В рабочем проекте с такой вот структурой state'a этого поведения не наблюдается, когда я обращаюсь к какому-то глубоко вложенному ключу и пытаюсь менять его значение.
Хотя, по идее, должно было бы, раз я передаю объект по ссылке так же, как и в тестовом примере.
это нужно смотреть, где и как ты обращаешься, и как его меняешь
Например, путь такой: state.default.existingKey.label (string). Объект state.default должен быть полностью реактивен, но почему-то не работает v-model на инпуте по этому ключу.
показывай код, где именно не работает по описанию все должно работать, если ключ, например, не добавляется динамически
Обсуждают сегодня