v-if 和 v-for 一起使用在同一个标签上会怎么样?
看例子:
使用v-for将如下object的所有value遍历显示,其中有一个value是数组
数据:
testData: {
name: 'TESTOBJECT',
id: 10,
data: [1.67, 1.33, 0.98, 2.21]
}
目标运行结果:
TESTOBJECT
10
1.67
1.33
0.98
2.21
初步实践:
.html:
<ul>
<li v-for="value in testData">
<div id="test" v-if="Array.isArray(value)" v-for="item in value">{{item}}</div>
<div id="test1" v-else>{{value}}</div>
</li>
</ul>
运行结果:
打印了10遍TESTOBJECT,10遍10,列出数组内容:1.67 1.33 0.98 2.21
为什么会有10个TESTOBJECT呢?尝试多加两个字母’TESTOBEJECTss‘,此时输出12个TESTOBEJECTss,10个10数字
原因分析:v-for优先级高于v-if,因此上面的html文本中两行div的执行大致是以下顺序:
this.value.map(function(item){
if(Array.isArray(value)){
return item; // T E S T O B J E C T
}else{
return value; // TESTOBJECT
}
})
遍历object的所有value(即li中的v-for),当拿到testData的第一个元素TESTOBJECT时,执行div中的v-for,此时的item对应T E S T O B J E C T这10个元素,于是循环10次,每一次都判断当前元素是否是array,很显然每次判断都是object,于是便打印出10个TESTOBJECT。
10个数字10的情况类似,不过由于是遍历一个数字,那么数字大小就影响循环的次数,如果改为5,则运行显示5遍5.
小结:
- vue官网推荐将v-if移到父元素,如ul中,先检查,后循环遍历。不要用在同一个元素上。
- 对上面例子进行如下修改:
<ul>
<li v-for="value in testData">
<div v-if="Array.isArray(value)">
<div v-for="item in value">{{item}}</div>
</div>
<div v-else>{{value}}</div>
</li>
</ul>
运行结果:
- TESTOBJECT
- 10
- 1.67
1.33
0.98
2.21