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

Vue如何从ItemRow子组件修改父组件的APIData数组?

Vue子组件修改父组件数组的正确实现方式

现有实现的问题

你当前直接导入父组件文件操作APIData的方案不可行,原因有两点:

  • 你导入的Index.vue是组件的类定义对象,不是页面运行时的父组件实例,直接操作其属性不会触发页面响应式更新
  • 该写法违反了Vue的单向数据流设计原则,父子组件强耦合,后续组件复用、问题排查难度都会大幅提升

正确实现方案

按照Vue的组件通信规范,子组件通过$emit触发自定义事件,将操作参数传递给父组件,由数据的持有者(父组件)执行数据修改逻辑,具体修改如下:

第一步:修改子组件ItemRow.vue

<script>
import moment from 'moment';
import { api } from '../axios-api'
// 删掉导入父组件的无效代码

export default {
    name: "ItemRow",
    props: {
        task: {
            type: Object,
            required: true,
        },
        index: {
            type: Number,
            required: true,
        }
    },
    methods: {
        completeTask(task) {
            const newCompleteStatus = !task.complete
            api.patch(`tasks/${task.id}/`, { complete: newCompleteStatus })
            .then(() => {
                // 触发更新完成状态的自定义事件,传递任务id和新的完成状态
                this.$emit('update-complete', task.id, newCompleteStatus)
            })
            .catch(response => {
                console.log('error', response)
            })
        },
        deleteTask(task, index) {
            api.delete(`tasks/${task.id}/`)
              .then(() => {
                  // 触发删除的自定义事件,传递要删除的索引
                  this.$emit('delete-task', index)
              })
        },
        formatDate(date) {
            return moment(date).format('YYYY-MM-DD');
        },
    }
}
</script>

第二步:修改父组件Index.vue

先给子组件绑定自定义事件监听:

<ItemRow 
    v-for="(task, index) in APIData"
    :key="task.id"
    :task="task"
    :index="index"
    @delete-task="handleDeleteTask"
    @update-complete="handleUpdateComplete"
>
</ItemRow>

然后在父组件的methods中添加对应的处理逻辑:

methods: {
    createTask(title) {
        api.post('tasks/', {title: title})
          .then((response) => {
              this.APIData.unshift(response.data)
              this.newTask = ''
          })
    },
    // 新增删除任务处理方法
    handleDeleteTask(index) {
        this.APIData.splice(index, 1)
    },
    // 新增更新任务完成状态处理方法
    handleUpdateComplete(taskId, newCompleteStatus) {
        const targetTask = this.APIData.find(task => task.id === taskId)
        if (targetTask) {
            targetTask.complete = newCompleteStatus
        }
    }
},

该方案严格遵循Vue设计规范,父子组件职责清晰,复用性和可维护性都更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 17:36:03