Я не могу справиться с правильным рендерингом после удаления элемента с помощью deleteData()
из массива объектов, который одновременно служит для создания динамических компонентов.
Элемент удаляется правильно, но он действует так, как если бы компонент не знал, что он должен обновиться, а Vue не знает, что данные изменились.
В расширении Chrome Vue правильный элемент удаляется, но Vue в DOM удаляет последний элемент ()
Вю:
<template>
<b-container>
<SectionSelector :AddSection="AddSection"/>
<component v-for="(section, index) in sections"
:key="index"
:is="section.type"
:sectionIndex="index"
:sectionData="section[index]"
:deleteData="deleteData"
@sectionDataEmit="sectionDataEmit"/>
</b-container>
</template>
<script>
import SectionSelector from './components/SectionSelector.vue';
import FullText from './components/sections/FullText.vue';
import FullImage from './components/sections/FullImage.vue';
import ImageRightTextLeft from './components/sections/ImageRightTextLeft.vue';
import ImageLeftTextRight from './components/sections/ImageLeftTextRight.vue';
import Vue from 'vue'
export default {
data() {
return {
sections: []
}
},
methods: {
AddSection(sectionData) {
this.sections.push(sectionData);
},
updateSection(sectionIndex, sectionData) {
Vue.set(this.sections, sectionIndex, sectionData);
},
sectionDataEmit(emitData) {
Vue.set(this.sections, emitData.position, emitData.content);
},
deleteData(index) {
// eslint-disable-next-line
console.log(index)
this.$delete(this.sections, index);
}
},
components: {
SectionSelector,
FullText,
FullImage,
ImageRightTextLeft,
ImageLeftTextRight
}
}
</script>
компонент:
<template>
<b-row>
<h3>Full text {{ sectionIndex+1 }}</h3>
<b-button variant="danger"
@click="deleteButton(sectionIndex)">delete</b-button>
<b-textarea :value="sectionData"
@input="sectionDataEmit" />
</b-row>
</template>
<script>
export default {
props: ['sectionIndex', 'sectionData', 'deleteData'],
methods: {
sectionDataEmit(value) {
let emitData = {
position: this.sectionIndex,
content: {
type: 'FullText',
fields: {
text: value
}
}
}
this.$emit('sectionDataEmit', emitData)
},
deleteButton(index) {
this.deleteData(index)
}
}
}
</script>
до удаления данных ()
после deleteData ()