Vue3 → v-if 比 v-for 优先级高

过滤列表 - 不推荐一个元素同时使用v-if与v-for

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');

Untitled

报错解释

原因: v-if 优先级比 v-for 高

我们其实可以通过查看 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);

Untitled

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

Untitled

我们会发现解析之后是:

  1. 先执行的 v-if 的命令 todoList.length !== 0
  2. 而后才循环 todoList 渲染 li 元素的

解决方案