导航
let app = Vue.createApp({
template: `
<div>
<ul>
<li
v-for="todo of todoList" :key="todo.id"
v-if="!todo.completed"
>
{{ todo.content }}
</li>
</ul>
</div>
`,
data() {
return {
todoList: [
{
id: 1,
content: 'CONTENT 1',
completed: true
},
{
id: 2,
content: 'CONTENT 2',
completed: false
},
{
id: 3,
content: 'CONTENT 3',
completed: true
}
]
}
}
}).mount('#app');

todo 这个属性todo我们其实可以通过查看 render 函数的处理方式来佐证优先级:
let app = Vue.createApp({
template: `
<ul>
<li
v-for="todo of todoList" :key="todo.id"
v-if="todoList.length !== 0"
>
{{ todo.content }}</li>
</ul>
`,
data() {
return {
todoList: [...]
}
}
}).mount('#app');
console.log(app.$options.render);

我们单击这条打印(单击函数名 render):

我们会发现解析之后是:
todoList.length !== 0<ul>
<template v-for="todo of todoList" :key="todo.id">
<li
v-if="!todo.completed"
>{{ todo.content }}</li>
</template>
</ul>
let app = Vue.createApp({
template: `
<ul>
<li v-for="todo of NotCompletedTodoList" :key="todo.id">{{ todo.content }}</li>
</ul>
`,
computed: {
NotCompletedTodoList() {
return this.todoList.filter(todo => !todo.completed);
}
},
data() {
return {
todoList: [
{
id: 1,
content: 'CONTENT 1',
completed: true
},
{
id: 2,
content: 'CONTENT 2',
completed: false
},
{
id: 3,
content: 'CONTENT 3',
completed: true
}
]
}
}
}).mount('#app');
let app = Vue.createApp({
template: `
<ul>
<li
v-for="todo of todoList" :key="todo.id"
v-if="todoList.length > 0"
>{{ todo.content }}</li>
</ul>
`,
data() {
return {
todoList: []
}
}
}).mount('#app');
上述情况虽然 v-if 与 v-for 一起使用了,但 v-if 中的 todoList 是存在在data属性中的,所以不会报错也能联合使用。 但并不推荐这样!!!(要养成良好习惯不要一起使用,虽然不报错)
let app = Vue.createApp({
template: `
<ul v-if="todoList.length > 0">
<li
v-for="todo of todoList" :key="todo.id">
{{ todo.content }}</li>
</ul>
`,
data() {
return {
todoList: []
}
}
}).mount('#app');
let app = Vue.createApp({
template: `
<ul v-if="listHasItem">
<li
v-for="todo of todoList" :key="todo.id">
{{ todo.content }}</li>
</ul>
`,
computed: {
listHasItem() {
return this.todoList.length > 0;
}
},
data() {
return {
todoList: []
}
}
}).mount('#app');
我们还是来查看 render 函数看看内部如何处理优先级的:
let vm = new Vue({
el: '#app',
template: `
<div>
<ul>
<li
v-for="todo of todoList" :key="todo.id"
v-if="todo.completed"
>
{{ todo.content }}
</li>
</ul>
</div>
`,
data() {
return {
todoList: [
{
id: 1,
content: 'CONTENT 1',
completed: true
},
{
id: 2,
content: 'CONTENT 2',
completed: false
},
{
id: 3,
content: 'CONTENT 3',
completed: true
}
]
}
}
}).$mount();
console.log(vm.$options.render);

单击打印的函数 f 进去看看:

就会发现它跟 Vue3 不同
Vue2 是:
其实都不用想,如果先走遍历,就是:
明显性能要低于: