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

Vue.js点击CheckList组件按钮删除数组对象失败,提示remove方法未定义

问题原因
  • 你的remove方法定义在父组件Example.vue中,子组件CheckList.vue内部既没有声明该方法,也没有通过自定义事件接收父组件的方法传递,所以子组件调用时直接报错找不到该方法
  • 父组件Example.vue里的remove方法存在逻辑错误,你操作的是不存在的this.events数组,实际要操作的是存储列表数据的this.items数组
  • 直接传递过滤后数组的循环索引会出现匹配错误,doneItems、notDoneItems都是原数组过滤后的新数组,循环索引和原items数组的索引不对应,删除会错位
修复步骤

1. 修改CheckList.vue(子组件)

子组件不直接操作父组件数据,通过$emit触发自定义事件,把要删除的项的唯一key传给父组件即可:

<template>
  <div>
    <h3>{{ title }}</h3>
    <ul>
      <li v-for="(item,key) in items" :key="item.key">
        <input type="checkbox" v-model="item.done">
        {{item.name}}
        <!-- 把原来的remove调用改成触发自定义事件,传递当前项的key -->
        <button v-if="all" v-on:click="$emit('remove', item.key)" class="button1">remove</button>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "CheckList",
  props: ['items', 'title', 'all']
}
</script>

2. 修改Example.vue(父组件)

先给CheckList组件绑定自定义remove事件,再修正remove方法的逻辑:

<template>
  <div>
    <input type="text" v-model="message" @keyup.enter="add">
    <button @click="add">Add Item</button>
    <!-- 绑定remove事件,关联父组件的remove方法,all属性显式传布尔值更规范 -->
    <CheckList :items="items" :all="true" title="All Items" @remove="remove"></CheckList>
    <CheckList :items="doneItems" :all="false" title="Done Items"></CheckList>
    <CheckList :items="notDoneItems" :all="false" title="Not Done Items"></CheckList>
  </div>
</template>

<script>
import CheckList from "./CheckList";
export default {
  name: "Example",
  components: {CheckList},
  data() {
    return {
      message: '',
      items: [
        {name:'Apple', done: true, key: 0},
        {name:'Orange', done: false, key: 1},
        {name:'Grapes', done: true, key: 2},
      ],
    }
  },
  methods: {
    add(){
      if(this.message !== '') {
        this.items.push({
          name: this.message,
          done: false,
          key: this.items.length
        });
        this.message = '';
      }
    },
    // 修正remove方法,根据传过来的key匹配原数组的项删除
    remove(key){
      const targetIndex = this.items.findIndex(item => item.key === key)
      if(targetIndex > -1) {
        this.items.splice(targetIndex, 1)
      }
    }
  },
  computed: {
    doneItems(){
      return this.items.filter(item => item.done);
    },
    notDoneItems(){
      return this.items.filter(item => !item.done);
    }
  }
}
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:06:02