我在Vue.js中有一个嵌套的for ... in
循环。我试图做的是,如果元素的值是null
,则跳过元素。下面是Vue模板代码:
<ul>
<li v-for="item in items" track-by="id">
<ol>
<li v-for="child in item.children" track-by="id"></li>
</ol>
</li>
</ul>
null
元素可以同时存在于item
和item.children
对象中。
例如:
var data = {
1: {
id: 1,
title: "This should be rendered",
children: {
100: {
id: 100,
subtitle: "I am a child"
},
101: null
}
},
2: null,
3: {
id: 3,
title: "Should should be rendered as well",
children: {}
}
};
有了这个数据,data[1].children[101]
不应该被渲染,如果data[1].children[100]
后来变成null,它应该从列表中省略。
我无法控制这些数据的结构,所以我必须以这种形式处理它。
6条答案
按热度按时间9njqaruj1#
一个简单的
v-if
可以工作:给予一下。如果没有,请这样做:
您可以为此添加一个过滤器(在App示例之前的
main.js
中):然后在模板中:
hvvq6cgz2#
在Vue 2中,
v-for
s中的过滤器已被弃用。现在你应该使用计算属性了。
ws51t4hk3#
我建议你不要在同一个元素中使用v-if和v-for。我发现工作并且不影响性能的是:
你只需要在你要遍历的数组上运行filter函数。这是c#中的一个常见用法,发现在JavaScript中也没有什么不同。这基本上会在迭代时跳过null。
希望这对你有帮助(3年后)。
aelbi1ox4#
只需使用
v-if
来处理它。但首先,不要使用track-by="id"
,因为null
项和null
子项。您可以在这里查看https://jsfiddle.net/13mtm5zo/1/的演示。dxpyg8gm5#
Vue.js风格指南告诉我们:
“永远不要在同一个元素上使用v-if和v-for。”
如何根据Vue样式指南正确处理v-if和v-for:
更多关于如何使用
v-for
处理v-if
的信息,请参见:https://v2.vuejs.org/v2/style-guide/#Avoid-v-if-with-v-for-essentialwwtsj6pe6#
首先,让我们从一个一般性的指导方针开始,因为它已经在其他答案中提出:永远不要在同一个元素上使用
v-if
和v-for
。由于这两个指令都控制元素是否被渲染,所以一起使用它们会引起混淆并容易出错。在Vue 2中,
v-for
优先于v-if
,但在Vue 3中,反之亦然-总是避免一起使用它们。对于你的问题,你有一个列表的列表,你实际上是在处理两种null值:空列表和这些列表中的空项。
我们可以通过像这样将多个
v-if
和v-for
编织在一起来处理这两个列表,每个列表都有一对,第三个v-if
避免呈现空的子列表:这可能看起来有点复杂,但这是核心:我们可以解决这个问题,同时避免
v-if
与v-for
限制,使用<template>
elements作为 Package 器。通过使用
<template>
s作为列表项的 Package 器,在父列表和子列表中,我们都可以:1.使用
v-for
渲染父列表和子列表中的项1.选择是否使用
v-if
单独呈现每个项目,而不创建一堆空的<li>
可运行代码段示例:
使用分层的
v-if
s和v-for
s以及<template
〉s来呈现列表是一种很好的方法,可以给予您最大限度地控制要呈现的内容,同时还有助于避免在同一个元素上使用两个指令的陷阱。