在 Vue 中使用 v-for 处理 v-if 的正确方法 [英] Correct way to handle v-if with v-for in Vue
问题描述
在这个例子中,我们应该如何处理 v-for
和 v-if
的组合:
这里是我的 data.json
:
在我的 vue 模板中,我想呈现如下内容:
<img :src="item.image"><video v-if="!!item.video" :src="item.video"></video></div >但是作为 文档说,我们应该避免 v-if
和 v-for
,而是使用计算值.但是即使 json 条目没有视频,我也需要渲染图像.
这没什么大不了的,我已经找到了解决方案,但我想知道处理这个问题的最佳方法.
解决方案 我认为您误解了文档.在这种情况下,同时使用 v-for
和 v-if
是有意义的,因为您总是要至少渲染
并且您可以渲染
.该文档试图表明,如果 v-if
和 v-for
位于完全相同的元素上,您应该预先过滤项目列表.
文档显示的示例试图让您将仅显示 3 个总元素中的 2 个元素的列表剪切为 2 个元素,并让计算道具告诉您何时有更多元素.否则每次需要重新渲染时都必须遍历整个列表.
考虑这种差异:
//一个包含 1000 个项目但只有 1 个有视频元素的数组常量数据 = [0...999];数据推送({图片:some.jpg",视频:some.mp4"});
<!--我们总是渲染 1000 个项目,但只有一些会有视频--><img :src="item.image"><video v-if="!!item.video" :src="item.video"></video>
<!--我们必须访问 1000 个元素,但是实际上只有 1 个最终会渲染-->
<img :src="item.image"><video :src="item.video"></video>
How should we handle a v-for
combined with a v-if
in this exemple:
Here my data.json
:
[
{
image: 'foo.jpg'
},
{
image: 'foobar.jpg',
video: 'bar.mp4'
},
{
image: 'barfoo.jpg'
}
]
In my vue template, I'd like to render something like this:
<div v-for="(item, key, index) in data" : key="index">
<img :src="item.image">
<video v-if="!!item.video" :src="item.video"></video>
</div >
But as the documentation say, we should avoid v-if
with v-for
and instead use a computed value. But there I need to render the image even if the json entry doesn't have a video.
That's not a big deal, I've find a solution but I'd like to know the best way to handle this.
I think that you are misunderstanding the documentation. In this instance, it makes sense to use both v-for
and v-if
because you are always going to render at least the <img>
and you might render the <video>
. The documentation is trying to show that you should pre-filter a list of items if the v-if
and v-for
are on the exact same element.
The example the docs are showing are trying to get you to cut a list that would show only only 2 of the 3 total elements down to just 2 elements and letting the computed prop tell you when there are more. Otherwise you have to iterate through the entire list every time you need to re-render.
Consider this difference:
// An array of 1000 items but only 1 has a video element
const data = [0...999];
data.push({
image: "some.jpg",
video: "some.mp4"
});
<!--
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>
这篇关于在 Vue 中使用 v-for 处理 v-if 的正确方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!