【问题标题】:How to bypass the requirement of only one root element in a vue component?如何绕过 vue 组件中只有一个根元素的要求?
【发布时间】:2021-07-13 18:49:04
【问题描述】:

我有一个案例,我想不出任何其他解决方案可以解决我的问题。我的任务是在 CSS 网格中布局项目,这些项目可以是引导卡或卡列表或列表列表......或列表列表列表等等。最后总是归结为一张卡片。正如您可能已经猜到的那样,我需要为此进行递归。所以我有一个卡片组件,它的代码与我的问题无关,所以我不会包含它。我还有一个包装器组件如下

<template>
    <div class="container-fluid" >
        <div class="wrapper-content">
            <template v-for="item in items">
                <content-display :expand="expand" :item="item" :params="params" :param="neededParam(item.id)" :key="item.id"></content-display>
            </template>
        </div>
    </div>    
</template>
<script>

<style>
    .wrapper-content {
        display: grid;
        grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
        grid-auto-rows: auto;
        grid-gap: 1em;
    }
</style>

那我还有内容展示组件,要么使用卡片组件,要么使用列表组件

  <template>
    <div>
        <template v-for="item in items">
            <list-component v-if="expand" :params="params" :param="param" :key="item.id" :item="item" :is="item.object_type.ModelName"></list-component>
            <object-card v-else :key="item.id" :item="item" :param="param"></object-card>
        </template>
    </div>
    
</template>

最后,这是列表组件

<template>
    <object-card v-if="!expand" :item="item" :param="param">
    </object-card>
    <content-display v-else :items="item.entity.list_objects" :params="params">
    </content-display>
</template>

我的问题是 内容显示组件 我需要卡片是网格的直接子节点,但是由于 Vue 的限制,我无法实现这一点,因为我需要那个外部 div 包装器等等而不是这个

<div class="container-fluid" >
        <div class="wrapper-content">
            <div class="card"></div>
            <div class="card"></div>
            <div class="card"></div>
            <div class="card"></div>
            <div class="card"></div>
            <div class="card"></div>
            <div class="card"></div>
        </div>
    </div>    

我明白了

<div class="wrapper-content">
            <div class="card"></div>
            <div class="card"></div>
            <div>
                <div class="card"></div>
                <div class="card"></div>
            </div>
            <div class="card"></div>
            <div class="card"></div>
            <div class="card"></div>
        </div>

注意:我曾考虑在该外部 div 上使用 style="grid-column: 1 / -1;",然后在其中添加另一个网格,但我生成的 html 会非常混乱。

【问题讨论】:

    标签: vue.js vue-component css-grid


    【解决方案1】:

    使用 Vue 3 - doesn't have this limitation

    但是如果你使用 Vue 2,那就试试VueFragment

    const Fragments = window.VFragments
    const Fragment = Fragments.VFragment
    
    new Vue({
      el: "#app",
      components: {
        Fragment,
      },
    })
    .grid-container {
      display: grid;
      grid-template-columns: 1fr 1fr 1fr;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/@superyusuke/vue-fragment@1.0.0/dist/vue-fragments.min.js"></script>
    <div id="app" class="grid-container">
      <fragment>
        <div>1</div>
        <div>2</div>
        <div>3</div>
        <div>4</div>
        <div>5</div>
        <div>6</div>
      </fragment>
    </div>

    你可以看到&lt;fragment&gt;CSS Grid“绕过”了。

    【讨论】:

    • 虽然,我收到错误“无法在 'Node' 上执行 'removeChild':要删除的节点不是该节点的子节点。”也许您会知道是什么原因造成的?
    • @Matrix 不幸的是这可能会发生 - 我读过它here,所以有些人更喜欢vue-frag
    猜你喜欢
    • 2021-10-01
    • 2021-02-28
    • 1970-01-01
    • 2017-03-18
    • 2018-07-25
    • 2017-12-13
    • 2022-11-02
    • 2021-01-14
    • 2016-12-04
    相关资源
    最近更新 更多