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

Angular 5/TypeScript中@Input()传值失效:父子组件传值显示undefined

解决Angular父子组件传值出现undefined的问题

嘿,我来帮你搞定这个问题!你遇到的undefined其实是两个小细节没处理好,咱们一步步来修复:

问题1:父组件未完成属性绑定

你在子组件里用@Input()声明了接收category的入口,但父组件的模板里压根没把值传过去!子组件相当于空等,自然输出undefined。

修改父组件模板:
把原来的<app-menu-list></app-menu-list>改成带属性绑定的写法,用Angular的方括号语法把父组件的变量传递给子组件:

<div class="container">
  <div class="row">
    <app-menu-list [category]="category"></app-menu-list>
  </div>
</div>

问题2:生命周期执行顺序的时机差

就算完成了绑定,你可能还是会遇到undefined——因为Angular组件的生命周期执行顺序是:
父组件constructor → 子组件constructor → 子组件ngOnInit → 父组件ngOnInit

你在父组件的ngOnInit里给category赋值,这时候子组件的ngOnInit已经跑完了,所以子组件在ngOnInit里打印的还是初始的undefined。

这里给你两种解决思路:

方法A:提前父组件的赋值时机

把父组件的category赋值移到constructor里,这样子组件初始化前就有值了:

export class MenuComponent implements OnInit {
  category: string;
  constructor() { 
    this.category = "Human"; // 移到constructor中提前赋值
  }
  ngOnInit() {
    // 这里保留其他初始化逻辑即可
  }
}

方法B:子组件监听输入属性变化

如果父组件的category是异步获取的(比如从接口请求数据),没法提前在constructor赋值,那就在子组件里用ngOnChanges钩子监听category的变化:

import { Component, Input, OnInit, OnChanges, SimpleChanges } from '@angular/core';

export class MenuListComponent implements OnInit, OnChanges{
  @Input() category: string;
  
  constructor() { }
  
  ngOnInit() {
    // 这里无需打印,时机不对
  }

  ngOnChanges(changes: SimpleChanges) {
    // 当category发生变化时触发
    if (changes['category']) {
      console.log(this.category); // 这里能拿到最新的有效值
    }
  }
}

验证修改

按照上面的步骤调整后,子组件就能正确接收父组件传递的category值,控制台不会再输出undefined啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:32:45