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

Vue中如何获取子组件emit的值并赋值给父组件data?

解决Vue子组件传值到父组件data不生效的问题

问题场景

想获取Topbar子组件传递的标题值,赋值到父组件data的title变量中。目前能在父组件控制台打印出传递的值,但this.title = title赋值后,title变量似乎没更新。

排查与解决步骤

1. 先确认赋值是否真的未生效

你的代码逻辑本身是正确的,大概率是没有在模板中渲染title,导致误以为赋值失败。在父组件模板中添加title的渲染代码,验证是否更新:

<template>
    <div>
        <Topbar :tabs='tabs' @pass-data="getTabTitle"/>
        <!-- 新增此行,实时显示title的值 -->
        当前选中标题:{{ title }}
    </div>
</template>

点击Topbar的选项后,如果这里能显示对应的标题,说明赋值已经生效,只是之前没在视图中体现。

2. 检查this的指向(可选)

如果确实没赋值,先确认getTabTitle方法中this的指向是否正确。在方法中打印this:

methods: {
    getTabTitle(title) {
        console.log(this) // 应该输出当前父组件的Vue实例
        console.log(title)
        this.title = title
    }
}

如果打印的this不是Vue实例,说明方法的this被改变了(比如用了箭头函数定义方法),换成普通函数即可(你当前的写法是对的,这步主要是排查)。

3. 确认子组件事件触发正常

检查子组件的onClick方法是否正确触发:点击Topbar的Sec 1或Sec 2时,控制台是否打印出对应的标题。如果能打印,说明$emit('pass-data', tabName)已经成功传递数据到父组件。

完整可运行的父组件代码

<template>
    <div>
        <Topbar :tabs='tabs' @pass-data="getTabTitle"/>
        当前选中标题:{{ title }}
    </div>
</template>
<script>
import Topbar from "../components/Navigation/Topbar.vue";

export default {
    name: "Progress",
    components: {
        Topbar,
    },  
    data() {
        return {
            title: '',
            tabs: [  
                {
                    link:'',
                    name: "Sec 1",
                    dropdown: false,
                    dropdownTabs:[]
                },
                {
                    link:'',
                    name: "Sec 2",
                    dropdown: false,
                    dropdownTabs:[]
                }
            ]
        }
    },
    methods: {
        getTabTitle(title) {
            console.log(title)
            this.title = title
        }
    },
}
</script>

子组件代码无需修改

你的Topbar组件代码逻辑正确,$emit事件传递数据的写法没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:35:24