создание подраздела в vuejs не работает

#arrays #vue.js #file

Вопрос:

Я работаю над приложением vuejs, которое требует создания раздела и подраздела

Я попытался создать подраздел, нажав на раздел «Добавить подраздел», но это приводит к ошибке

 Uncaught TypeError: sections[1] is undefined  

Шаблон

Это шаблон, который отображает разделы и подразделы на странице

 lt;div v-if="sections.length gt; 0 "gt;  lt;div class="__course-sub-section" v-for="(section, index) in sections" :key="index"gt;  lt;divgt;lt;input type="text" placeholder="Enter Section Title" v-model="section.title" class="section-title form-control x_focus"gt;lt;/divgt;  lt;div class="__upload-section d-flex justify-content-between align-items-center" v-for="(sub_section, index) in section.sub_sections" :key="index"gt;  lt;div class="d-flex"gt;  lt;input type="text" placeholder="Enter Sub Section Title" v-model="sub_section.title" class="section-title form-control x_focus"gt;  lt;div class="__choose"gt;  lt;label for=""gt;  lt;divgt;  lt;input type="file" @change="uploadFile( $event )" name="" id=""gt;  Upload File  lt;/divgt;  lt;img src="@/assets/images/upload.png" alt=""gt;  lt;/labelgt;    lt;/divgt;  lt;/divgt;  lt;div class="__sub-section-image"gt;  lt;div class="placeholder"gt;  lt;img :src="sub_section.url" alt=""gt;  lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;button @click="addSubSection" class="app_button primary_btn d-flex mt-4"gt;  Add Sub Section  lt;/buttongt;  lt;button @click="addSection" class="app_button primary_btn d-flex mt-4"gt;  Add Section  lt;/buttongt;  

язык JavaScript

Это javascript(vue), который хранит форму в массиве и отображает их.

 export default {  name: 'CreateCourse',  setup(){  const sections = reactive([{'title': '', 'sub_sections': [{'title': '', 'file': '', 'url': ''}]}]);  const addSection = () =gt; {  sections.push({"title": "", 'sub_sections': [{'title': '', 'file': '', 'url': ''}]});  }  const addSubSection = () =gt; {    sections[1].sub_sections.push({"title": "", 'file': '', 'url': ''});  }   const uploadFile = (e) =gt; {  console.log(e.target.files[0]);  sections[1].sub_sections[1].file = e.target.files[0];  sections[1].sub_sections[1].url = URL.createObjectURL(sections[1].sub_sections[1].file);  }  return {  sections  }  } }  

Как мне решить эту проблему?

Ответ №1:

Вам нужно возвращать функции из setup функции и передавать индекс в addSubSection функцию:

 lt;scriptgt; import { reactive } from "vue";   export default {  name: 'CreateCourse',  setup(){  const sections = reactive([{'title': '', 'sub_sections': [{'title': '', 'file': '', 'url': ''}]}]);  const addSection = () =gt; {  sections.push({"title": "", 'sub_sections': [{'title': '', 'file': '', 'url': ''}]});  }  const addSubSection = (idx) =gt; {   sections[idx].sub_sections.push({"title": "", 'file': '', 'url': ''});  }  const uploadFile = (e, idx, i) =gt; {  console.log(e.target.files[0]);  sections[idx].sub_sections[i].file = e.target.files[0];  sections[idx].sub_sections[i].url = URL.createObjectURL(sections[idx].sub_sections[i].file);  }  return { sections, addSection, addSubSection, uploadFile }  } } lt;/scriptgt; 
 lt;templategt;  lt;div v-if="sections.length gt; 0 "gt;  lt;div class="__course-sub-section" v-for="(section, index) in sections" :key="index"gt;  lt;divgt;  lt;input type="text" placeholder="Enter Section Title" v-model="section.title" class="section-title form-control x_focus"gt;  lt;/divgt;  lt;div class="__upload-section d-flex justify-content-between align-items-center" v-for="(sub_section, idx) in section.sub_sections" :key="idx"gt;  lt;div class="d-flex"gt;  lt;input type="text" placeholder="Enter Sub Section Title" v-model="sub_section.title" class="section-title form-control x_focus"gt;  lt;div class="__choose"gt;  lt;label for=""gt;  lt;divgt;  lt;input type="file" @change="uploadFile( $event , index, idx)" name="" id=""gt;  Upload File  lt;/divgt;  lt;img src="" alt=""gt;  lt;/labelgt;  lt;/divgt;  lt;/divgt;  lt;div class="__sub-section-image"gt;  lt;div class="placeholder"gt;  lt;img :src="sub_section.url" alt=""gt;  lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;button @click="addSubSection(index)" class="app_button primary_btn d-flex mt-4"gt;  Add Sub Section  lt;/buttongt;  lt;button @click="addSection" class="app_button primary_btn d-flex mt-4"gt;  Add Section  lt;/buttongt;  lt;/divgt;  lt;/divgt; lt;/templategt; 

Комментарии:

1. Сработало как по волшебству. Спасибо

2. Добро пожаловать, приятель, ура 🙂

Ответ №2:

Попробуй это:

 const sections = reactive([  { title: "", sub_sections: [{ title: "", file: "", url: "" }] },  { title: "", sub_sections: [{ title: "", file: "", url: "" }] }, ]);