架构师

您现在的位置是:首页 > 程序人生 > 前端别闹

前端别闹

Vue小案例:循环遍历数组v-for的基本用法

架构师小跟班 2020-04-30 前端别闹
案例:1、遍历数组,显示到页面2、点击数组中的一项,只有这一项数据颜色变红色,其他几项不变思路:定义一个当前索引的变量currentIndex,当当前索引值与数组某一项的索引值一样时,添加

v-for遍历数组

当我们有一组数据需要进行渲染时,我们就可以使用v-for来完成。

1、v-for的语法类似于JavaScript中的for循环。

2、格式如下:item in items的形式。

我们来看一个简单的案例:

如果在遍历的过程中不需要使用索引值,语法格式:v-for="movie in movies",依次从movies中取出movie,并且在元素的内容中,我们可以使用Mustache语法,来使用movie

如果在遍历的过程中,我们需要拿到元素在数组中的索引值呢?

语法格式:v-for=(item, index) in items其中的index就代表了取出的item在原数组的索引值

v-for遍历对象

v-for可以用于遍历对象:

比如某个对象中存储着你的个人信息,我们希望以列表的形式显示出来。

<div id="app">
  <ul>
    <li v-for="(value,key,index) in info">{{value}}-{{key}}-{{index}}</li>
  </ul>
</div>
<script src="../js/vue.js"></script>
<script>
  const app = new Vue({
    el: "#app",
    data: {
      message: "架构师小跟班",
      info: {
        name: "架构师小跟班",
        age: 18,
        height: "184cm"
      }
    }
  })
</script>

组件的key属性

官方推荐我们在使用v-for时,给对应的元素或组件添加上一个:key属性。

为什么需要这个key属性呢(了解)?

这个其实和Vue的虚拟DOM的Diff算法有关系。这里我们借用React’s diff algorithm中的一张图来简单说明一下:

当某一层有很多相同的节点时,也就是列表节点时,我们希望插入一个新的节点,我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的。即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很没有效率?

所以我们需要使用key来给每个节点做一个唯一标识:Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

所以一句话,key的作用主要是为了高效的更新虚拟DOM。

<li v-for="(item,index) in movies" @click="btnClick(item)" :class="{active:isActive}" :key="item">{{index}}-{{item}}</li>

案例:

1、遍历数组,显示到页面

2、点击数组中的一项,只有这一项数据颜色变红色,其他几项不变

思路:

定义一个当前索引的变量currentIndex,当当前索引值与数组某一项的索引值一样时,添加class属性。当点击数组项时,改变currentIndex的值。

源码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <style>
    .active {
      color: red;
    }
  </style>
</head>
<body>
<div id="app">
  <ul>
    <li v-for="(item,index) in movies" @click="btnClick(index)" :class="{active:currentIndex === index}">
      {{index}}-{{item}}
    </li>
  </ul>
</div>
<script src="../js/vue.js"></script>
<script>
  const app = new Vue({
    el: "#app",
    data: {
      movies: ["火影忍者", "进击的巨人", "黑猫警长", "海尔兄弟"],
      currentIndex: 0
 },
    methods: {
      btnClick(index) {
        this.currentIndex = index
      }
    }
  })
</script>
</body>
</html>

文章评论