Vue循环遍历

1.v-for介绍

作用 循环遍历
预期 Array | Object | number | string | Iterable (2.6 新增)
用法 alias in expression

2. v-for 遍历数组

<div id="app">
  <ul>
    <li v-for="name in names">{{name}}</li>
  </ul>
</div>
<script>
  const vue = new Vue({
      el: '#app',
      data: {
        names: ['张三', '李四']
      },
  });
</script>

在这里插入图片描述
使用过程中使用index

<div id="app">
  <ul>
    <li v-for="(name, index) in names">{{index + 1}} {{name}}</li>
  </ul>
</div>
<script>
  const vue = new Vue({
      el: '#app',
      data: {
        names: ['张三', '李四']
      },
  });
</script>

在这里插入图片描述

3.v-for遍历对象

<div id="app">
  <ul>
<!--    这样只能拿到属性的value,不能拿到key-->
    <li v-for="attribute in person">{{attribute}}</li>
  </ul>
</div>
<script>
    const vue = new Vue({
        el: '#app',
        data: {
            person: {
                name: '张三',
                age: '12',
                height: '160'
            },
        },
    });
</script>

在这里插入图片描述
value 、 key 都获取

<div id="app">
  <ul>
    <li v-for="(value, key) in person">{{key}}: {{value}}</li>
  </ul>
</div>
<script>
    const vue = new Vue({
        el: '#app',
        data: {
            person: {
                name: '张三',
                age: '12',
                height: '160'
            },
        },
    });
</script>

在这里插入图片描述

value 、 key 和 index 都获取

<div id="app">
  <ul>
    <li v-for="(value, key, index) in person">{{index + 1}}{{key}}: {{value}}</li>
  </ul>
</div>
<script>
    const vue = new Vue({
        el: '#app',
        data: {
            person: {
                name: '张三',
                age: '12',
                height: '160'
            },
        },
    });
</script>

在这里插入图片描述

4.v-for是使用key和不使用key的区别

官方推荐在使用v-for的时候,给对应的元素或组件添加上一个key属性
1.遍历时不使用key
在这里插入图片描述

1.遍历时使用key
在这里插入图片描述

注意:
1.所谓的位移其实是元素重新创建初始化,不用位移就是复用以前的元素。
2.如果要使用key的话,不要用index,要保证key与内容的唯一标识性,因为index是会更新的,如果新增或者修改,那么用key就没什么意思了。

key 的特殊 attribute 主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。
如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。
而使用 key 时,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。

有相同父元素的子元素必须有独特的 key。重复的 key 会造成渲染错误。

5.可以响应式的方法

<div id="app">
  <ul>
<!--    这样只能拿到属性的value,不能拿到key-->
    <li v-for="(name, index) in names" :key="name">{{name}}</li>
  </ul>
  <button @click="pushArray">push</button>

</div>
<script>
    const vue = new Vue({
        el: '#app',
        data: {
            names: ['张三', '李四'],
        },
        methods: {
            pushArray() {
                this.names.push("aaa");
            }
        }
    });
</script>

在这里插入图片描述

5.1 注意直接修改数组元素时是不会响应式的

<div id="app">
  <ul>
<!--    这样只能拿到属性的value,不能拿到key-->
    <li v-for="(name, index) in names" :key="name">{{name}}</li>
  </ul>
  <button @click="changed">changed</button>

</div>
<script>
    const vue = new Vue({
        el: '#app',
        data: {
            names: ['张三', '李四'],
        },
        methods: {
            changed() {
                this.names[0] = 111;
            }
        }
    });
</script>

点击changed之后页面没有变化,可以数组元素已经变化了
在这里插入图片描述

5.2 以上问题的解决方案:

<div id="app">
  <ul>
<!--    这样只能拿到属性的value,不能拿到key-->
    <li v-for="(name, index) in names" :key="name">{{name}}</li>
  </ul>
  <button @click="changed">changed</button>

</div>
<script>
    const vue = new Vue({
        el: '#app',
        data: {
            names: ['张三', '李四'],
        },
        methods: {
            changed() {
              this.names.splice(0, 1, '111');
              // Vue 内部实现的方法
              Vue.set(this.names, 1, '222');
            }
        }
    });

</script>

在这里插入图片描述
点击changed后:

在这里插入图片描述

5.3 以下方法都是响应式的:

push() 向数组末尾添加一个元素
pop() 删除数组中最后一个元素
shift() 删除数组中第一个元素
unshift() 向数组最前面添加一个或者多个个元素(参数是可变长度)
splice() 删除元素:第二个参数传入你要删除几个元素(如果没穿,就删除后面所有元素) 替换元素:第二参数,表示我们要替换几个元素,后面是用于替换前面的元素 插入元素:第二个参数穿0,后面是插入的元素
sort() 排序
reverse() 内容反转
Logo

前往低代码交流专区

更多推荐