You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue中两个v-for循环使用重复key值的问题求助

解决Vue中两个v-for循环key重复的问题

问题核心是Vue要求同一渲染上下文中的v-for key必须唯一,你现在两个循环都用数组索引当key,必然会出现重复值(比如两个数组的第一个元素key都是0),导致虚拟DOM Diff逻辑出错。

下面是两种可行的解决办法:

方法一:使用唯一标识作为key(推荐)

本地Todo:添加唯一ID

修改本地Todo的数据结构,给每个新增的Todo分配一个唯一ID,比如利用你已有的todoKeys自增:

// 假设你有添加Todo的方法,修改成这样
addTodo() {
  this.todos.push({
    id: ++this.todoKeys,
    title: this.todo
  })
  this.todo = ''
}

GitHub Issues:利用自身唯一ID

GitHub API返回的Issue对象自带id或number字段(都是唯一值),直接用这个当key即可。

然后更新v-for代码:

<TodoItem
  v-for="(todo, index) in todos"
  :key="todo.id"
  :title="todo.title"
  @delTodo="removeTodo(index)"
/>
<TodoItem
  v-for="(issue, index) in issues"
  :key="issue.id" <!-- 或者issue.number,按需选择 -->
  :title="issue.title"
  @delTodo="closeIssue(index)"
/>

方法二:给key添加前缀区分(快速临时方案)

如果不想修改数据结构,可以给两个循环的key添加不同前缀,确保全局唯一:

<TodoItem
  v-for="(todo, index) in todos"
  :key="'local-' + index"
  :title="todo"
  @delTodo="removeTodo(index)"
/>
<TodoItem
  v-for="(issue, index) in issues"
  :key="'github-' + index"
  :title="issue.title"
  @delTodo="closeIssue(index)"
/>

额外优化:TodoItem组件简化

你当前的TodoItem组件把props的title存到data里是多余的,props本身是响应式的,直接使用即可,这样能避免不必要的状态维护:

<template>
  <div>
    <el-col :span="12">
      <el-card class="box-card" shadow="hover" style="margin: 5px 0">
        <el-row :gutter="12">
          <el-col :span="21">{{ title }}</el-col>
          <el-col :span="3">
            <el-button
              type="success"
              icon="el-icon-check"
              circle
              @click="$emit('delTodo')"
            ></el-button>
          </el-col>
        </el-row>
      </el-card>
    </el-col>
  </div>
</template>
export default {
  name: 'TodoItem',
  props: {
    title: String
  }
}

内容的提问来源于stack exchange,提问作者Agustin Oviedo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 08:40:54