#vue.js #quasar-framework
Вопрос:
Я использую Vue3 с Quasar2, и у меня проблема во время мутации: DOM не обновляется.
- Код состоит из родительского компонента, списка дочерних компонентов (визуализируется v-for). Данные поступают из хранилища Vuex через вычисляемое свойство.
- Дочерние компоненты представляют только данные и выдают событие «изменить» с идентификатором представленных данных.
- В событии «редактировать» родительский компонент заполняет свойства фактическими данными, а представляет диалоговое окно.
- Когда диалоговое окно закрывается, родитель вызывает действие для хранения данных.
- Действие (и следующая мутация) выполняются нормально. Хранилище Vuex содержит правильные данные.
- Но список не обновляется 🙁
- Если я добавлю новый элемент в список данных (с помощью push), список будет обновлен.
Очищенными источниками являются следующие:
Родитель.vue:
<template>
<q-page class="flex flex-center" :key="mykey">
<q-list padding>
<child-component
v-for="d in data"
v-bind:key="d.id"
v-bind:data="data"
v-on:edit-time="onEdit"
>
</program>
</q-list>
<!-- EDITOR DIALOG -->
<q-dialog v-model="editing" @hide="onEditDone">
....
</q-dialog>
<script>
....
export default defineComponent({
name: "PageIndex",
created: function () {
this.loadData();
},
data: function () {
return {
editing: false,
....
},
};
},
components: { Child },
methods: {
...mapActions(["loadData", "updateData"]),
onEdit(id) {
...
this.editing = true; // <= show dialog
},
onEditDone() {
try {
...
this.updateData(data); // <== Vuex Action which updates an elem of the data list
} catch (e) {
...
}
},
},
computed: {
...mapState({
data: state => state.data
}),
}
});
</script>
state.js:
export default {
data: [],
}
getters.js:
const getters = {
data: (state) => {
return state.data;
},
};
export default getters;
mutations.js:
updateData: (state, data) => {
var idx = state.data.findIndex((element) => element.id == data.id);
state.data.splice(idx, 1, data);
},
actions.js:
async updateData(context, data) {
try {
await axios.post(`api/data?id=${data.id}`, data, {
headers: {
"Content-Type": "application/json",
},
});
context.commit("updateData", data)
} catch (err) {
console.log(err);
}
},
Комментарии:
1. Я думаю, что проблема заключается в глубоко вложенной структуре данных (данные представляют собой список сложных объектов, но я хотел бы заменить элементы массива).