在 Vue 中使用 v-for 处理 v-if 的正确方法

All*_*uin 3 javascript vue.js

在这个例子中我们应该如何处理 av-for与 a的组合v-if

这是我的data.json

[
  {
    image: 'foo.jpg'
  },
  {
    image: 'foobar.jpg',
    video: 'bar.mp4'
  },
  {
    image: 'barfoo.jpg'
  }
]
Run Code Online (Sandbox Code Playgroud)

在我的 vue 模板中,我想呈现如下内容:

<div v-for="(item, key, index) in data" : key="index">
   <img :src="item.image">
   <video v-if="!!item.video" :src="item.video"></video>
</div >
Run Code Online (Sandbox Code Playgroud)

但作为文档说,我们应该避免v-if使用v-for,而使用一个计算值。但是即使 json 条目没有视频,我也需要渲染图像。

这没什么大不了的,我已经找到了解决方案,但我想知道处理这个问题的最佳方法。

zer*_*298 6

我认为您误解了文档。在这种情况下,同时使用两者是有意义的v-forv-if因为您总是至少要渲染 ,<img>而您可能会渲染<video>. 该文档试图表明如果v-ifv-for位于完全相同的元素上,您应该预先过滤项目列表。

文档显示的示例试图让您将仅显示 3 个总元素中的 2 个元素的列表剪切为 2 个元素,并让计算道具告诉您何时有更多元素。否则每次需要重新渲染时都必须遍历整个列表。

考虑这种差异:

// An array of 1000 items but only 1 has a video element
const data = [0...999];

data.push({
  image: "some.jpg",
  video: "some.mp4"
});
Run Code Online (Sandbox Code Playgroud)
<!--
We always render 1000 items but only some will have video 
-->
<div 
v-for="(item, key, index) in data" 
:key="index">
  <img :src="item.image">
  <video v-if="!!item.video" :src="item.video"></video>
</div>


<!-- 
We have to visit 1000 elements but 
only 1 will actually end up rendering
-->
<div 
v-if="!!item.video" 
v-for="(item, key, index) in data" 
:key="index">
  <img :src="item.image">
  <video :src="item.video"></video>
</div>
Run Code Online (Sandbox Code Playgroud)