В моем Vuex store
есть массив Notes. Каждая нота обозначена <textarea>
. У меня есть компонент NoteArray, который отображает каждое примечание:
// NoteArray.vue
export default {
name: "NoteArray",
components: { Note },
computed: {
...mapState({
notes: state => state.notes // get array of Notes from store
})
},
template: `
<div v-for="note in notes">
<!-- make one Note per note in array -->
<Note :contents.sync="note.contents"></Note>
</div>`
}
// Note.vue
export default {
name: "Note",
props: ["contents"], // recieve contents from NoteArray
template: `<textarea v-model="contents"></textarea>`
}
Эта настройка, вероятно, работала бы нормально, если бы я не использовал Vuex, но я хочу, чтобы содержимое каждого примечания было представлено одним массив в моем магазине:
// index.ts
let store = new Vuex.Store({
state: {
notes: [{contents: ""}] // will have a mutation to add/remove notes
}
}
Сейчас я использую v-model
, чтобы прикрепить содержимое каждой заметки к себе. Это прекрасно работает для односторонней привязки - начальное состояние Notes хорошо распространяется вниз. Проблема возникает при попытке изменить примечание. Здесь будет использоваться модификатор sync
, чтобы установить sh двустороннюю привязку без необходимости определять какие-либо события ввода.
Не так для Vuex - я могу только изменить состояние с использованием мутации. При включенном строгом режиме приведенный выше пример приводит к ошибке [vuex] do not mutate vuex store state outside mutation handlers
.
Исправление здесь состоит в том, чтобы определить мутацию, которая вызывается данной заметкой на @input
, которая изменяет значение contents
этой заметки. . Единственный способ, который я могу придумать, - это определить мутацию, которая обращается к содержимому и изменяет его (вместо v-model
и sync
):
// index.ts
...
mutations: {
update_note(state, payload) {
state.notes[payload.index] = payload.context
}
}
...
... но для этого требуется, чтобы каждое примечание знает и может передать мутации свой индекс в массиве state.notes
. Однако каждая заметка совершенно не осведомлена о своем контексте - у них нет этой информации.
Я не уверен, куда go отсюда - как я могу узнать значение contents
каждой заметки обновляться в store
, когда они меняются пользователем? Я хочу, чтобы NoteArray и Note оставались собственными компонентами.
Реализация приведенного выше примера: https://codesandbox.io/s/keen-moser-oe63d