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

React类组件报错_this.state is undefined,求解决方案

解决React类组件中"_this.state is not defined"错误

看起来你遇到了一个典型的React类组件初始化顺序问题,我来帮你分析并解决它:

问题根源

你在类组件中直接定义了stadt、listItemsFreiburg、listItemsKarlsruhe这些类属性,它们的初始化时机是在构造函数执行之前的。这时候this.state还没有被构造函数初始化完成,所以当你尝试访问this.state.termineFreiburg或者this.state.termineKarlsruhe时,自然会抛出_this.state is not defined的错误。

解决方法

这里提供两种常用的修复方案,你可以根据自己的习惯选择:

方案1:将列表渲染逻辑移到render方法内部

把生成列表项的代码放到render方法里,这样就能确保this.state已经完成初始化:

export class Kurse extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      termineFreiburg: [
        {date: "21.02.2019", free: 10},
        {date: "02.05.2018", free: 0},
        {date: "13.03.2018", free: 10},
        {date: "04.07.2018", free: 12},
        {date: "05.08.2018", free: 12}
      ],
      termineKarlsruhe:[
        {date: "09.03.2019", free: 2},
        {date: "12.01.2018", free: 5}
      ]
    };
  }

  render() {
    const stadt = this.props.location.stadt;
    // 在render内生成列表项,此时this.state已初始化
    const listItemsFreiburg = this.state.termineFreiburg.map((termin) => (
      <p key={termin.date}>
        <Link to={{pathname: "/bookCourse", datum: termin.date, stadt}}>
          <Button>
            {termin.date} Freie Plätze: {(termin.free > 0) ? termin.free : 'ausgebucht'}
          </Button>
        </Link>
      </p>
    ));
    const listItemsKarlsruhe = this.state.termineKarlsruhe.map((termin) => (
      <p key={termin.date}>
        <Link to={{pathname: "/bookCourse", datum: termin.date, stadt}}>
          <Button>{termin.date} Freie Plätze: {termin.free}</Button>
        </Link>
      </p>
    ));

    return(
      <div>
        <h2>Wähle Deinen Wunschtermin für einen Kurs in {stadt}</h2>
        {stadt === 'Freiburg' ? listItemsFreiburg : listItemsKarlsruhe}
      </div>
    );
  }
}
export default Kurse;

方案2:使用类的getter方法

把列表项的生成逻辑改成类的getter,这样它们会在被访问时才计算,此时this.state已经初始化完成:

export class Kurse extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      termineFreiburg: [
        {date: "21.02.2019", free: 10},
        {date: "02.05.2018", free: 0},
        {date: "13.03.2018", free: 10},
        {date: "04.07.2018", free: 12},
        {date: "05.08.2018", free: 12}
      ],
      termineKarlsruhe:[
        {date: "09.03.2019", free: 2},
        {date: "12.01.2018", free: 5}
      ]
    };
  }

  // 用getter延迟计算属性值
  get stadt() {
    return this.props.location.stadt;
  }

  get listItemsFreiburg() {
    return this.state.termineFreiburg.map((termin) => (
      <p key={termin.date}>
        <Link to={{pathname: "/bookCourse", datum: termin.date, stadt: this.stadt}}>
          <Button>
            {termin.date} Freie Plätze: {(termin.free > 0) ? termin.free : 'ausgebucht'}
          </Button>
        </Link>
      </p>
    ));
  }

  get listItemsKarlsruhe() {
    return this.state.termineKarlsruhe.map((termin) => (
      <p key={termin.date}>
        <Link to={{pathname: "/bookCourse", datum: termin.date, stadt: this.stadt}}>
          <Button>{termin.date} Freie Plätze: {termin.free}</Button>
        </Link>
      </p>
    ));
  }

  render() {
    return(
      <div>
        <h2>Wähle Deinen Wunschtermin für einen Kurs in {this.stadt}</h2>
        {this.stadt === 'Freiburg' ? this.listItemsFreiburg : this.listItemsKarlsruhe}
      </div>
    );
  }
}
export default Kurse;

小提示:我给每个map生成的<p>标签加上了key属性,这是React列表渲染的最佳实践,可以避免不必要的控制台警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:05:38