@ak_wi

Как рендерить рекурсивный вызов компонета Vue?

Хочется сделать вывод сохраненных в JSON блоков из бутстрапа, с простой вложенностью вида:
blocks: [
                    {
                        id: 1,
                        blockType: 'row',
                        classes: {
                            base: 12,
                            sm: 12,
                            md: 12,
                            lg: 12,
                            xl: 12,
                        },
                        blocks: [
                            {
                                id: 2,
                                blockType: 'col',
                                classes: {
                                    base: 6,
                                    sm: 5,
                                    md: 4,
                                    lg: 3,
                                    xl: 2,
                                },
                                content: {
                                    text: 'Блок 1'
                                },

                            },
                            {
                                id: 3,
                                blockType: 'col',
                                classes: {
                                    base: 6,
                                    sm: 5,
                                    md: 4,
                                    lg: 3,
                                    xl: 2,
                                },
                                content: {
                                    text: 'Блок 2'
                                },
                            }
                        ]
                    },


Есть компонент - родитель, который передает эти блоки дочернему:

<template>
    <div class="container">
        <BlockRender :items="blocks"></BlockRender>
    </div>
</template>


Дочерний компонент выглядит вот так:
<template>
    <div v-for="col in items" v-bind:key="col.id" v-bind:class="getBlockClass(col)">
        <template v-if="col.content">{{col.content.text}}</template>
        <BlockRender
                v-if="col.blocks && col.blocks.length"
                :items="col.blocks"
        ></BlockRender>
    </div>
</template>

<script>
    export default {
        name: 'BlockRender',
        props: {
            items: Array
        },

        methods: {
            getBlockClass: function (col) {},
        },
    }
</script>


Проблема в том, что внутри <template> должен быть один элемент. А добавление еще div в такой вложенности ломает дерево. Как сделать вывод такой структуры неограниченной вложенности без лишних блоков?
  • Вопрос задан
  • 172 просмотра
Решения вопроса 1
Можете воспользоваться компонентов vue-fragment

Тогда можно будет делать так
<template>
    <fragment v-for="col in items" v-bind:key="col.id">
        <template v-if="col.content">{{col.content.text}}</template>
        <BlockRender
                v-if="col.blocks && col.blocks.length"
                :items="col.blocks"
        ></BlockRender>
    </fragment>
</template>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы