Mit ES7 reagieren: Uncaught TypeError: Eigenschaft „state“ von undefined kann nicht gelesen werden [duplicate]

Lesezeit: 3 Minuten

Ich erhalte diesen Fehler Uncaught TypeError: Eigenschaft ‘state’ von undefined kann nicht gelesen werden immer wenn ich etwas in das Eingabefeld von AuthorForm eingebe. Ich verwende React mit ES7.

Der Fehler tritt auf Dritte Zeile der setAuthorState-Funktion in ManageAuthorPage. Unabhängig von dieser Codezeile, selbst wenn ich eine console.log(this.state.author) in setAuthorState einfüge, stoppt sie bei der console.log und ruft den Fehler auf.

Kann kein ähnliches Problem für jemand anderen über das Internet finden.

Hier ist der Autorenseite verwalten Code:

import React, { Component } from 'react';
import AuthorForm from './authorForm';

class ManageAuthorPage extends Component {
  state = {
    author: { id: '', firstName: '', lastName: '' }
  };

  setAuthorState(event) {
    let field = event.target.name;
    let value = event.target.value;
    this.state.author[field] = value;
    return this.setState({author: this.state.author});
  };

  render() {
    return (
      <AuthorForm
        author={this.state.author}
        onChange={this.setAuthorState}
      />
    );
  }
}

export default ManageAuthorPage 

Und hier ist die Autorenformular Code:

import React, { Component } from 'react';

class AuthorForm extends Component {
  render() {
    return (
      <form>
                <h1>Manage Author</h1>
        <label htmlFor="firstName">First Name</label>
                <input type="text"
                    name="firstName"
          className="form-control"
                    placeholder="First Name"
          ref="firstName"
          onChange={this.props.onChange}
                    value={this.props.author.firstName}
          />
        <br />

        <label htmlFor="lastName">Last Name</label>
                <input type="text"
                    name="lastName"
          className="form-control"
                    placeholder="Last Name"
          ref="lastName"
                    onChange={this.props.onChange}
          value={this.props.author.lastName}
                    />

                <input type="submit" value="Save" className="btn btn-default" />
            </form>
    );
  }
}

export default AuthorForm

  • Sie dürfen den Status NICHT direkt ändern. Es gibt asynchronous setState(…) dafür. Ich schreibe über diese Aussage this.state.author[field] = value;.

    – Leonid Dashko

    13. September 2018 um 19:45 Uhr

  • einfach umwandeln setAuthorState(event) {...}; zu setAuthorState = (event) => {...}; andernfalls müssen Sie (dies) ausdrücklich binden

    – CrackerKSR

    18. September 2021 um 17:38 Uhr

Sie müssen Ihre Event-Handler an den richtigen Kontext binden (this):

onChange={this.setAuthorState.bind(this)}

  • Ich habe dein Beispiel Kumpel verwendet. Vielen Dank.

    – Khpalwalk

    9. Februar 2016 um 9:18 Uhr

  • @Khpalwalk Gern geschehen 🙂

    – madox2

    9. Februar 2016 um 9:19 Uhr

  • Ich finde eine eloquentere Methode, dies zu tun, indem Pfeilfunktionen verwendet werden, die dies von Natur aus an die Funktion binden. Ich finde es besonders nützlich, wenn ich Reaktionscode schreibe. Sie können also setAuthorState=event=>{…} verwenden. Es sind keine zusätzlichen Codezeilen erforderlich, um dies an die Funktion zu binden. Auch jedes Mal, wenn auf diese Komponente geklickt wird, fallen keine zusätzlichen Kosten für die Bindung an.

    – Brett Reinhard

    5. August 2017 um 6:39 Uhr


  • Ich stimme zu, ich habe das Gefühl, dass „dies“ vielen Entwicklern entgeht und sie nicht vollständig verstehen, was „dies“ wirklich darstellt. Ich habe das Gefühl, dass Entwickler ein besseres Verständnis von „diesem“ haben, ob das nun rein oberflächlich ist, ist eine andere Sache. Für diejenigen, die “das” nicht verstehen, sollten Sie sich Kyle Simpsons ansehen, Sie kennen js Repo auf GitHub nicht. Sein Benutzername ist getify und hat ein paar Kapitel, die „dies“ gewidmet sind, die helfen werden, den Stein ins Rollen zu bringen, um zu verstehen, was „dies“ im gegebenen Kontext bedeutet.

    – Brett Reinhard

    7. August 2017 um 5:40 Uhr

  • ja danke es funktioniert bei mir. Ich habe vergessen, bind in meinem Code zu verwenden.

    – Faris Rayhan

    12. März 2018 um 6:59 Uhr

Benutzer-Avatar
Oleksand T.

Stellen Sie sicher, dass Sie anrufen super() als erstes in Ihrem Konstruktor.

Du solltest einstellen this zum setAuthorState Methode

class ManageAuthorPage extends Component {

  state = {
    author: { id: '', firstName: '', lastName: '' }
  };

  constructor(props) {
    super(props);
    this.handleAuthorChange = this.handleAuthorChange.bind(this);
  } 

  handleAuthorChange(event) {
    let {name: fieldName, value} = event.target;

    this.setState({
      [fieldName]: value
    });
  };

  render() {
    return (
      <AuthorForm
        author={this.state.author}
        onChange={this.handleAuthorChange}
      />
    );
  }
}

Eine weitere Alternative basierend auf arrow function:

class ManageAuthorPage extends Component {

  state = {
    author: { id: '', firstName: '', lastName: '' }
  };

  handleAuthorChange = (event) => {
    const {name: fieldName, value} = event.target;

    this.setState({
      [fieldName]: value
    });
  };

  render() {
    return (
      <AuthorForm
        author={this.state.author}
        onChange={this.handleAuthorChange}
      />
    );
  }
}

  • Alternative Methode hat bei mir funktioniert Danke für die Antwort

    – Sumit Ghewade

    11. April 2020 um 13:56 Uhr

1051490cookie-checkMit ES7 reagieren: Uncaught TypeError: Eigenschaft „state“ von undefined kann nicht gelesen werden [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy