Шаблон компонента ошибки Vue JS должен содержать ровно один корневой элемент

#javascript #laravel #vue.js #vue-component #vue-router

Вопрос:

При работе с компонентом VueJS вы сталкиваетесь со следующей ошибкой в консоли браузера (или в выводе JS linter):

Шаблон компонента должен содержать ровно один корневой элемент. Если вы используете v-if для нескольких элементов, вместо этого используйте v-else-if для их цепочки.

Как уже объяснялось, шаблоны компонентов VueJS могут содержать один и только один корневой узел. Это правильно:

 <template>
  <div class="hello">
    <h1>{{ msg }}</h1>
  </div>
</template>
 

Это не так:

 <template>
  <div class="hola">
    <h1>{{ msg }}</h1>
  </div>
  <div class="hello">
    <h1>{{ msg }}</h1>
  </div>
</template>
 

Чинить
Оберните свои html-теги в один родительский элемент:

 <template>
  <div>
    <div class="hola">
      <h1>{{ msg }}</h1>
    </div>
    <div class="hello">
      <h1>{{ msg }}</h1>
    </div>
  </div>
</template>
 

Идем дальше
В некоторых случаях вы не можете позволить себе добавить дополнительный родительский элемент, не нарушая структуру HTML. Например, если ваш шаблон дочернего компонента заменит несколько <tr> в родительской таблице HTML:

 <template>
  <tr class="hola">
    ...
  </tr>
  <tr class="hello">
    ...
  </tr>
</template>
 

В данном конкретном случае вам нужно иметь два решения:

используйте функциональные компоненты ; используйте фрагменты (мой любимый) Фрагменты позволяют группировать несколько дочерних элементов под родительским элементом без добавления дополнительных узлов в DOM при рендеринге. Существует пакет vue-фрагментов, который вы можете установить:

 npm install vue-fragments // yarn add vue-fragments
 

Во время загрузки VueJS:

 import { Plugin } from "vue-fragments"; Vue.use(Plugin);
 

Затем в вашем шаблоне компонента:

 <template>
  <v-fragment>
    <tr class="hola">
      ...
    </tr>
    <tr class="hello">
      ...
    </tr>
  <v-fragment>
</template>
 

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

1. Если вы используете Vue3 , то это больше не проблема, и для обхода линтинга вы могли бы сделать что-то вроде этого: "vetur.validation.template": false

2. Пожалуйста, проясните вашу конкретную проблему или предоставьте дополнительные сведения, чтобы точно указать, что вам нужно. Поскольку это написано в настоящее время, трудно точно сказать, о чем вы просите.