基础/列表渲染

92 阅读2分钟

v-for

script setup 中声明的变量或方法,在 app.vuetemplate 部分都是可以使用的

<!-- app.vue -->
<template>
  {{ count }}
  {{ msg }}
  
  <button @click="inc"> + </button>
</template>

<script setup>
  import { ref } from 'vue'
  
  let count = 0
  const msg = ref('Hello')
  
  function inc() {
    count += 1
    console.log(count)
  }
</script>

v-for 指令的参数 itemindex(如果items是一个对象参数就是 value key index),只在带有 v-for 指令的起始标签 <li v-for="(item, index) in items">,和对应的闭合标签 </li> 区域内,才可以使用:

<template>
  <li v-for="(item, index) in items">
    <!-- 这里的 item 是 { message: 'msg1' },该区域可以访问 v-for 指令的item参数,就不会再去外层找全局的item -->
    {{ item }}
    {{ index }} - {{ item.message }}
  </li>
  
  <!-- 并不是 items 的某一个元素 -->
  {{ item }} // 全局变量
</template>

<script setup>
  import { ref } from 'vue'
  
  const items = ref([
    {
      message: 'msg1'
    }
  ])
  
  const item = ref('全局变量')
</script>

即使可以,也不推荐 v-for 的参数与全局变量同名

in 还是 of

<div v-for="item in items"></div>
<div v-for="item of items"></div>

这两行代码效果是一样的,选择 in 还是 of ,取决于你们团队的代码风格

v-for 里使用范围值

注意如果你要直接遍历一个数字,那么一定要是 正整数

<span v-for="n in 10">{{ n }}</span> <!-- 正常渲染 1~10 -->

<span v-for="n in -10">{{ n }}</span> <!-- 报错 -->

<span v-for="n in 10.2">{{ n }}</span> <!-- 报错 -->

<span v-for="n in 0">{{ n }}</span> <!-- 不报错,效果和 v-if="false" 类似,当前元素和子元素都不会被添加到 DOM 中 -->

template 上的 v-for

<ul>
  <template v-for="item in items">
    <li>{{ item.msg }}</li>
    <li class="divider" role="presentation"></li>
  </template>
</ul>

最终的 DOM 里不会出现 <template>

v-forv-if

只需要记住,v-forv-if 作用在同一个标签上时,v-if 不能使用 v-for参数带有参数的表达式 作为值,其他情况都没问题

<!-- 可以这样用 -->
<li v-for="todo in todos" v-if="true">
  {{ todo.name }}
</li>

<!-- 可以这样用 -->
<li v-for="todo in todos" v-if="false">
  {{ todo.name }}
</li>

<!-- 可以这样用 -->
<li v-for="todo in todos" v-if="todos.length">
  {{ todo.name }}
</li>

<!-- 不可以这样用 -->
<li v-for="todo in todos" v-if="todo.isComplete">
  {{ todo.name }}
</li>

<!-- 不可以这样用 -->
<li v-for="(item, index) in todos" v-if="index > 1">
  {{ todo.name }}
</li>

上面例子中 itemindex 都不能出现在 v-if 接收的表达式中

对于对象 value key index 都不能出现在 v-if 接收的表达式中

你可以这么理解

<li v-for="todo in todos" v-if="!todo.isComplete">    
 {{ todo.name }}
</li>

<!-- 类似,并不是完全等价。如果真按照下面这么写,会去找组件内声明的todo变量 -->
<template v-if="!todo.isComplete">
  <li v-for="todo in todos">
    {{ todo.name }}
  </li>
</template>