2016-02-09 9 views
20

Ich Uncaught Typeerror diesen Fehler: nicht Eigenschaft ‚Zustand‘ undefinierter lesen kann, wenn ich irgendetwas in dem Eingabefeld von AuthorForm eingeben. Ich verwende React mit ES7. Der Fehler tritt bei 3. Zeile der SetAuthorState-Funktion in ManageAuthorPage auf Unabhängig von dieser Codezeile, auch wenn ich eine console.log (this.state.author) in setAuthorState setze, wird es bei der console.log stoppen und den Fehler aufrufen.Reagieren mit ES7: Uncaught Typeerror: kann nicht lesen Eigenschaft ‚Zustand‘ undefinierten

Kein ähnliches Problem für jemand anderes über das Internet finden. Hier

ist die ManageAuthorPage 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 der AuthorForm 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 

Antwort

27

Sie haben Ihre Event-Handler zu binden Kontext zu korrigieren (this):

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

ich dein Beispiel paaren verwendet gesetzt. Danke. – Khpalwalk

+0

@Khpalwalk Sie sind willkommen :-) – madox2

+2

Ich finde einen eloquenteren Weg, dies zu tun, ist die Verwendung von Pfeilfunktionen, die diese Funktion inhärent an die Funktion binden, finde ich besonders nützlich, wenn ich reaktiven Code schreibe. Sie können also setAuthorState = event => {...} verwenden. Es sind keine zusätzlichen Codezeilen erforderlich, um dies an die Funktion zu binden. Jedes Mal, wenn auf diese Komponente geklickt wird, sind keine zusätzlichen Kosten für die Bindung erforderlich. –

11

Sie sollten this für setAuthorState Methode

class ManageAuthorPage extends Component { 

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

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

    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} 
     /> 
    ); 
    } 
} 
+0

Können Sie erklären, warum es so ist? 'this.setAuthorState = this.setAuthorState.bind (this);' Warum müssen Sie es binden? – Ponciusz

Verwandte Themen