【问题标题】:How to avoid Vue.js v-for duplicating bootstrap row如何避免 Vue.js v-for 复制引导行
【发布时间】:2020-07-16 13:44:20
【问题描述】:

我有这个 wordpress 自定义主题的代码。我正在使用 REST API 和 Vue.js 获取数据,以使 DOM 在单击事件时动态更改。我遇到了一个小问题,我无法使用我想要的布局显示数据,这是因为当我在要运行我的 vue 应用程序的主行上使用 v-if 时,这将复制该行,但我只想拥有布局所需的列。我正在使用引导程序 4,列是col-*-3,所以在一行内应该有四列。 我该如何解决这个问题?

  <div class="row bg-light p-5 mt-3" v-for="cat in catList" >

    <div class="col-sm-12 col-md-12 col-lg-12 p-0">
      <div class="dropdown">
        <a class="text-uppercase dropdown-toggle dropdown-toggle-split" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
          <?php _e('Collezioni'); ?>
        </a>
        <div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
          <a  v-on:click="displayCategory(cat.id)" class="dropdown-item" href="#">{{ cat.name }}</a>
        </div>
      </div>
    </div>

    <div class="col-sm-12 col-md-3 col-lg-3 col-background shadow-lg mt-5 mb-5 p-0" data-bg-url="" style="height:50vh;"></div>
    <div class="col-sm-12 col-md-3 col-lg-3 col-offset-top shadow-lg darkblue position-relative mt-5 mb-5 p-5">
      <small class="text-white m-0"></small>
      <h4 class="font-weight-bold text-white mt-2 mb-0" v-if="cat.name">{{ cat.name }}</h4>
      <h4 class="font-weight-bold text-white mt-2 mb-0" v-else>{{ cat.title }}</h4>
      <p v-if="cat.description">{{ cat.description }}</p>
      <p v-else>{{ cat.content }}</p>
    </div>

  </div>

更新

如果我使用 div &lt;div v-for="cat in catList"&gt; 来包装内容,布局将会中断。看画面

【问题讨论】:

  • 只需将v-for 移动到div 里面...就像这样&lt;div class="row bg-light p-5 mt-3"&gt;&lt;div v-for="cat in catList"&gt;...&lt;/div&gt;&lt;/div&gt;
  • 我试过了,但是添加的&lt;div v-for=""&gt; 会弄乱布局。请参阅问题中的附加屏幕
  • 你能解决这个问题以便我重现它吗?
  • 这里是一个 jsfiddle:jsfiddle.net/m10bw6ko/3 通常使用 php 而没有 vue.js 我将拥有三个内联列。这些列是两个 col 3,带有一点 css 以创建一个很好的重叠效果。

标签: twitter-bootstrap vue.js


【解决方案1】:

这里的问题是v-for 如果重复行内的每个元素,包括行本身。我看到您需要在两个不同的地方显示类别数据,在下拉列表和最后的正方形上,但不需要循环并生成其间的所有其他元素。

您可以在这里做几件事,为底部 div(具有背景阴影的那些)创建另一个组件,或者通过移动 v-for="cat in catList" 创建两个单独的循环,这将需要这三个更改

<!--remove the v-for="cat in catList" because this breaks everything-->
<div class="row bg-light p-5 mt-3">

<!--add one loop here for the dropdown elements-->
<a v-for="cat in catList" v-on:click="displayCategory(cat.id)" class="dropdown-item" href="#">{{ cat.name }}</a> 

<!--add the second loop here-->
<div v-for="cat in catList" class="col-sm-12 col-md-3 col-lg-3 col-offset-top shadow-lg darkblue position-relative mt-5 mb-5 p-5"> 

我在这里更新了小提琴https://jsfiddle.net/zgranda/y9d5fk67/2/

通过这样做,元素不应重复,但仍需要对阴影进行一些 CSS 修复

编辑:看到你的评论并编辑了小提琴,现在它应该循环两个 div,因为我不知道它应该是什么样子,所以你需要稍微调整一下 CSS https://jsfiddle.net/zgranda/2w39pdac/3/

【讨论】:

  • 感谢您的帮助。 jsfiddle 中只缺少一件事。我需要一个带有背景图像的&lt;div&gt; 和另一个带有相关文本的&lt;div&gt;。在小提琴中,我只看到包含文本的 div,包含图像的那个(小提琴中的空白)不会循环,这不是我想要实现的。如果我在上面也添加一个v-for,这能解决问题吗?
  • @guggio 我更新了答案以包含其他 div,请查看
猜你喜欢
  • 2018-08-16
  • 2018-09-15
  • 2020-03-10
  • 2020-07-18
  • 2020-02-14
  • 2019-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多