v-for 要用 key,且不能是 index和 random 随机数

简介: v-for 要用 key,且不能是 index和 random 随机数

v-for 要用 key

v-for 要用 key 的原因可详见 vue 原理中的 diff 算法

其核心要领在于,diff 算法中通过 tag 和 key 来判断是否是同一个节点,使用 key 能减少渲染次数,提升渲染性能。

key 不能使用 random 随机数

因为随机数每次渲染时都会变化,按 diff 算法的比较规则,因 key 值的不同,就会视为节点发生了变化,而引发所有 v-for 节点的再次渲染。

key 不能使用 index

key 使用 index 或 无 key 时,在某些场景中会引发 diff 算法 的误判,导致页面错误的渲染。

比如包含输入框时,若 key 使用 index

左侧的内容重新排序了,但右侧输入框内容并没有同步变化。

完整演示代码如下:

<template>
  <div style="margin: 30px">
    <button @click="sort">重新排序</button>
    <div v-for="(item, index) in list" :key="index">
      {{ item }}
      <input type="input" placeholder="请输入" />
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [1, 3, 2, 4],
    };
  },
  methods: {
    sort() {
      this.list.sort();
    },
  },
};
</script>

修正方案:将 key 改为 item

<template>
  <div style="margin: 30px">
    <button @click="sort">重新排序</button>
    <div v-for="item in list" :key="item">
      {{ item }}
      <input type="input" placeholder="请输入" />
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [1, 3, 2, 4],
    };
  },
  methods: {
    sort() {
      this.list.sort();
    },
  },
};
</script>

达到预期效果!

目录
相关文章
Random随机数的使用
Random随机数的使用
116 0
|
2月前
|
Java
成随机数的几种方法、Math.random()随机数的生成、Random()的使用
这篇文章介绍了生成随机数的三种方法:使用`System.currentTimeMillis()`获取当前时间的毫秒值来生成0到100的随机整数、使用`Math.random()`生成[0,1)范围内的`double`类型随机数并扩大到指定范围、以及使用`Random`对象的`nextInt()`方法生成指定范围内的随机整数,并提供了相应的Java代码示例和测试结果。
成随机数的几种方法、Math.random()随机数的生成、Random()的使用
|
5月前
|
算法 安全 大数据
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(二)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
155 0
|
3月前
|
安全 算法 Java
使用Random.next生成随机数
使用Random.next生成随机数
|
5月前
|
算法 安全 数据安全/隐私保护
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析(一)
【C/C++ 随机函数行为】深入探索C++中的随机数:std::random_device与rand的行为分析
324 0
|
编译器 C语言 C++
C++中rand随机数的用法
C++标准函数库提供一随机数生成器rand,返回0-RAND_MAX之间均匀分布的伪随机整数。 RAND_MAX必须至少为32767。rand()函数不接受参数,默认以1为种子(即起始值)。 随机数生成器总是以相同的种子开始,所以形成的伪随机数列也相同,失去了随机意义。(但这样便于程序调试)
|
数据安全/隐私保护
Random的nextInt()用法
Random的nextInt()用法
198 0
Random类和Math.random生成的随机数
Random类和Math.random生成的随机数
200 0
|
Java
Random rand = new Random(47);的简单解释
Random rand = new Random(47);的简单解释
312 0
|
数据安全/隐私保护
Random快速产生相同随机数的原因及解决方案
老生常谈,还是那三句话: 学历代表你的过去,能力代表你的现在,学习代表你的将来 十年河东,十年河西,莫欺少年穷 学无止境,精益求精 问题描述:很多时候我们可能需要在极短的时间内生成大量的随机数,但是你可能会发现生成了很多重复的随机数。
1937 0