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

使用Vuetify实现点击v-list-item图标时仅切换当前对应项图标

解决方案

核心原因是你把选中状态放在了全局变量,所有列表项共用同一个状态,所以会同步切换。你需要把完成状态绑定到每个子任务对象本身即可。

1. 修改状态定义

删掉全局的showDoneSub和showUnDoneSub变量,给每个子任务项增加done字段标识当前项是否完成:

itemSubtasks: [{
    title: 'My custom subtask 1',
    done: false // 新增字段,默认未完成
  },
  {
    title: 'My custom subtask 2',
    done: false
  },
],

2. 修改模板代码

把图标显示条件绑定到当前遍历项的done属性,点击事件传入当前项作为参数:

<v-list-item v-for="(item, index) in itemSubtasks" :key="index">
  <v-list-item-action style="padding-top: 20px;">
    <!-- 未完成时显示空心圆圈 -->
    <v-icon v-show="!item.done" @click="clickSubtask(item)"> 
      mdi-circle-outline
    </v-icon>
    <!-- 已完成时显示勾选圆圈 -->
    <v-icon v-show="item.done" @click="unDoneSubtask(item)">
      mdi-checkbox-marked-circle-outline 
    </v-icon>
  </v-list-item-action>
  <v-list-item-content>
    <v-list-item-title>
      <v-text-field v-model="item.title"></v-text-field>
    </v-list-item-title>
  </v-list-item-content>
</v-list-item>

3. 修改点击处理方法

修改方法直接操作传入的当前项的done属性:

clickSubtask(item) {
  item.done = true
},
unDoneSubtask(item) {
  item.done = false
},

优化方案(可选)

你可以把两个点击方法合并为一个,减少冗余代码:
模板简化为:

<v-icon @click="toggleSubtask(item)">
  {{ item.done ? 'mdi-checkbox-marked-circle-outline' : 'mdi-circle-outline' }}
</v-icon>

方法简化为:

toggleSubtask(item) {
  item.done = !item.done
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:39:02