Вы можете добавить обработчик события input
, который вызывает мутацию Vuex, чтобы установить поле страницы ...
- В хранилище обновите элемент массива
fields
, чтобы он содержалvalue
свойство, которое будет содержать пользовательский ввод:
/* store.js */
const state = {
pages: [
{
// ...
fields: [
{
// ...
value: null ?
}
]
},
{
// ...
fields: [
{
// ...
value: null ?
}
]
}
]
}
Также добавьте мутацию Vuex, которая устанавливает поле страницы:
/* store.js */
const mutations = {
SET_PAGE_FIELD(state, { pageId, fieldName, fieldValue }) {
const page = state.pages.find(page => page.id === pageId)
if (page) {
const field = page.fields.find(field => field.name === fieldName)
if (field) {
field.value = fieldValue
}
}
}
}
export default new Vuex.Store({
state,
mutations ?
})
Обновлены элементы ввода
page-field
для генерации события
input
с целевым значением:
/* PageField.vue */
<template>
<div class="page-field">
<input @input="$emit('input', $event.target.value)" ...> ?
<textarea @input="$emit('input', $event.target.value)" .../> ?
</div>
</template>
Обработайте событие
input
в родительском объекте, изменив поле страницы в хранилище (с помощью мутации на шаге 2):
/* App.vue */
<template>
<div class="tab-pane" v-for="page in allPages" :key="page.id">
<div v-for="field in page.fields" :key="field.name">
<page-field
@input="setField(page.id, field.name, $event)" ?
:type="field.type"
/>
</div>
</div>
</template>
<script>
export default {
methods: {
setField(pageId, fieldName, fieldValue) {
this.$store.commit('SET_PAGE_FIELD', { ?
pageId,
fieldName,
fieldValue
});
}
}
}
</script>