# 条件和列表渲染

# 条件渲染

# v-if

直接作用于 DOM 结构,在<template>元素上使用 v-if 条件渲染,最终的渲染结果不包含<template>元素

v-else

v-else-if

key管理可复用的元素

​ vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。这么做除了使 Vue 变得非常快之外,还有其他一些好处,比如允许用户在不同的登录方式之间切换

<template v-if="loginType === 'username'">
  <label>Username</label>
  <input placeholder="Enter your username" />
</template>
<template v-else>
  <label>Email</label>
  <input placeholder="Enter your email address" />
</template>

​ 在上面的代码中,切换 loginType 将不会清楚用户已经输入的内容,虽然前后的两个 input 在 DOM 结构中是不一样的。因为两个模板使用了相同的元素,<input>不会被替换掉——仅仅是替换了它的placeholder

​ 但这样有时并不符合实际需求,所以 Vue 提供一种方式来表达”这两个元素是完全独立的,不要复用它们“。这就是 key,只需要给这两个元素添加一个具有唯一值的 key 属性即可。

<template v-if="loginType === 'username'">
  <label>Username</label>
  <input placeholder="Enter your username" key="username-input" />
</template>
<template v-else>
  <label>Email</label>
  <input placeholder="Enter your email address" key="email-input" />
</template>

现在,每次切换时,输入框都会被重新渲染

# v-show

不同于 v-if,v-show 只是简单的切换了元素的 css 属性 display,并且 v-show 不支持<template>元素,毕竟 ta 不是真正的 DOM 元素,不具有 css 属性

# v-if 与 v-for 一起使用

不推荐这两一起使用,当 v-if 与 v-for 一起使用时,v-for 具有更高的优先级,注意在 Vue 3.0 中 v-if 会具有更高的优先级。

# 列表渲染

# v-for

  1. 用 v-for 把一个数组对应为一组元素

我们可以用 v-for 指令基于一个数组来渲染一个列表。v-for 指令需要使用 item in itemList 形式的特殊语法,其中 item 是被迭代的数组元素的别名

<ul id="example-1">
  <li v-for="item in items" :key="item.message">{{ item.message }}</li>
</ul>
var example1 = new Vue({
  el: "#example-1",
  data: {
    items: [{ message: "Foo" }, { message: "Bar" }]
  }
});

也可以使用 of 来替代 in 作文分隔符,其中 item 是数组元素的别名,index 是索引

<div v-for="(item,index) of items"></div>
  1. 在 v-for 里使用对象

也可以用 v-for 来遍历一个对象的属性,其中第一个参数是键值得别名,第二个参数是键名的别名

<div v-for="(value, name) in object">
  {{ name }}: {{ value }}
</div>
  1. 维护状态

当 Vue 正在更新使用 v-for 渲染的元素列表是,它默认使用"就地更新"的策略,如果数据线的顺序被改变,Vue 将不会移动 DOM 来匹配,而是就地更新每个元素。

为了给 Vue 一个提示,以便它能跟踪每个节点的身份从而重用和重新排序现有元素,需要为每项元素提供一个唯一的key属性,另外请使用字符串或者数值类型的值作为key

<div v-for="item in items" v-bind:key="item.id">
  <!-- 内容 -->
</div>

在使用 v-for 渲染列表的时候,尽可能提供一个绑定数据线的唯一的 key 值,比如索引,键名等,也可以组合来达到唯一的效果

# 维护状态

当 Vue 正在更新使用 v-for 渲染的元素列表时,它默认使用“就地更新”的策略。如果数据项的顺序被改变,Vue 将不会移动 DOM 元素来匹配数据项的顺序,而是就地更新每个元素,并且确保它们在每个索引位置正确渲染。

# 数组更新检测

  1. 变更方法

Vue 把被侦听的数组的变化方法进行了重新包装,所以他们亦将会触发视图的更新,这些方法包括

push() pop()
shift() unshift()
splice() sort()
reverse()
  1. 替换数组

变更方法,顾名思义,会变更调用了这些方法的数组,但也有非变更方法,他们不会变更原始数组,而总是返回一个新数组,此时我们可以用一个新数组来替代换旧数组,保持统一。

example1.items = example1.items.filter(function (item) {
  return item.message.match(/Foo/);
});

在 Vue 中用一个含有相同元素的数组去替换原来的数组是非常高效的操作

  1. 注意事项

由于 JavaScript 的限制,Vue 不能检测数组和对象的变化,这时我们可以使用 watch 中的深度监听

# 显示过滤/排序后的结果

有时我们想要显示一个数组经过过滤活排序后的版本,而不去实际变更或重置原有的数据,在这种情况下可以创建一个计算属性,来返回过滤或排序后的数组,然后渲染这个计算属性即可

# 在 v-for 里使用值范围

v-for 也可以接受整数。在这种情况下,它会把模板重复对应次数。

<div>
  <span v-for="n in 10">{{ n }}</span>
</div>

#<template>使用 v-for

类似 v-if,利用<template>来包括需要循环渲染的元素

# 在组件上使用 v-for

和普通元素一样使用,记得要加 key,又因为组件有自己独立的作用域,为了把迭代数据传递到组件里,我们要使用 prop

<my-component
  v-for="(item, index) in items"
  v-bind:item="item"
  v-bind:index="index"
  v-bind:key="item.id"
></my-component>