В элементе VUE отсутствует закрывающий тег

У меня есть следующее в Vue3, где я пытаюсь поместить элементы в строку начальной загрузки, и каждая строка должна содержать 6 элементов. Однако VueJS не любит, когда я это делаю! Он жалуется, что мой первый <b-row> содержит отсутствующий закрывающий тег (что сделано специально!):

[plugin:vite:vue] В элементе отсутствует закрывающий тег.

Как мне нужно реструктурировать это, чтобы хорошо играть в VUE?

<main role = "main" class = "container-fluid">
    <div class = "container">
        <template v-for = "(item, index) in items">
            <template v-if = "index == 0 || index % 6 == 0">
                <b-row>
            </template>
                <b-col>
                {{ item.name }}
                </b-col>
            <template v-if = "(index != 0 && index % 6 == 0) || index == items.length">
                </b-row>
            </template>
        </template>
    </div>
</main>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
119
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вместо этого вы можете реструктурировать его так:

<template>
  <main role = "main" class = "container-fluid">
    <div class = "container">
      <template v-for = "(row, rowIndex) in itemRows" :key = "rowIndex">
        <b-row>
          <template v-for = "(item, itemIndex) in row" :key = "itemIndex">
            <b-col>
              {{ item.name }}
            </b-col>
          </template>
        </b-row>
      </template>
    </div>
  </main>
</template>

<script setup>
const items = ref([
  {
    name: "Hello",
  },
// add as many more elements as you'd like
]);

const itemRows = computed(() => {
  const rows = [];
  for (let i = 0; i < this.items.length; i += 6) {
    rows.push(this.items.slice(i, i + 6));
  }
  return rows;
});
</script>

По сути, используйте вычисляемое свойство itemRows, чтобы разделить массив элементов на фрагменты по 6.

Эта реструктуризация гарантирует, что каждый элемент содержит ровно 6 элементов, а все оставшиеся элементы (если общее количество элементов не кратно 6) будут помещены в последнюю строку.

Вот мой результат:

Надеюсь, это поможет. Если у вас есть еще вопросы, дайте мне знать.

Ответ принят как подходящий

Это так не работает, в Vue.js нельзя разбивать такие html-теги. Сначала надо разбить массив на части, а затем запустить их в v-for:

<script setup>
const items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];

const chunkArray = (arr, size) => arr.reduce((acc, _, index) => {
    if (index % size === 0) {
        acc.push(arr.slice(index, index + size));
    }
    return acc;
}, []);


const chankItems = chunkArray(items, 6);
</script>

<template>
<main>
  <div v-for = "items in chankItems">
    <span v-for = "el in items">
      {{ el }};
    </span>
  </div>
</main>
</template>

Игровая площадка Vue SFC

@kissu, пожалуйста, объясни, почему ты редактируешь мой ответ, не внося никаких изменений? Потому что это не первый раз.

imhvost 17.06.2024 00:12

Предпочитайте использовать языковую предустановку html для кода VueJS, она более точна с точки зрения выделения (возможно, однажды SO реализует что-то более конкретное, ха-ха). Пока ничего, кроме лучшего чтения здесь. Смело оставляйте откат, если он вам не понравится, сэр.

kissu 17.06.2024 00:24

ХОРОШО. Понимать. Это просто бесполезно, поэтому я и спросил.

imhvost 17.06.2024 00:50

В большинстве случаев это лучше, но, возможно, здесь это не слишком актуально, просто привычка, которую я выработал за несколько месяцев, ха-ха.

kissu 17.06.2024 00:54

То, что вы пытаетесь сделать, это сделать строки 6 элементов на 6 элементов из исходного массива. Для этого вы можете использовать алгоритм, который обычно называется chunks.

Он принимает на вход массив элементов, а также максимальное количество элементов на фрагмент (назовем его n) и возвращает массив массивов элементов, длина которых равна n, за исключением последнего, имеющего ограничение length <= n поскольку вы не сможете разделить свой массив равномерно.

Так:

// Some JS file
export const function chunks(arr, maxItemsPerChunk) {
  let currChunk = [];
  const chunksArr = arr.reduce((chunks, item, i) => {
    if (i !== 0 && i % maxItemsPerChunk === 0) {
      // The current chunk has reached its limit
      // therefore we push it into the results
      // and update the new current chunk to contain the current item
      chunks.push(currChunk);
      currChunk = [item];
    } else {
      // The current chunk hasn't reached its limit
      // just yet, so we push the item into it
      currChunk.push(item);
    }

    return chunks;
  }, []);

  if (currChunk.length) {
    // If there are leftovers, that means the
    // number of items in the array was not
    // divisible by maxItemsPerChunk.
    // Thus we push the last chunk whose length
    // is strictly less than maxItemsPerChunk
    chunksArr.push(currChunk);
  }

  return chunksArr;
}

И используйте его в своем компоненте следующим образом:

<!-- The vue component -->
<script setup>
import { chunks } from "...";
const items = /* [...] */;

const chunkedItems = computed(() => chunks(items, 6));
</script>

<template>
<main role = "main" class = "container-fluid">
    <div class = "container">
        <!-- TODO: Find a better key for the chunks -->
        <b-row v-for = "(chunk, index) in chunks" :key = "index">
            <!-- TODO: Find a better key for the items -->
            <b-col v-for = "(item, index) in chunk" :key = "index">
                {{ item.name }}
            </b-col>
        </b-row>
    </div>
</main>
</template>

Другие вопросы по теме