2016-02-09 37 views
20

dostaję ten błąd Uncaught TypeError: nie można odczytać właściwość „państwowego” undefined ilekroć wpisać cokolwiek w polu wejściowym AuthorForm. Używam React with ES7.reagują z ES7: Uncaught TypeError: nie można odczytać właściwość „państwowego” undefined

Błąd występuje na 3. linii funkcji setAuthorState w ManageAuthorPage. Niezależnie od tego wiersza kodu, nawet jeśli wstawię plik console.log (this.state.author) do setAuthorState, zatrzyma się on na console.log i wywoła błąd.

Nie można znaleźć podobnego problemu dla kogoś innego przez Internet.

Oto ManageAuthorPage kod:

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 

A oto AuthorForm kod:

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 

Odpowiedz

27

Trzeba powiązać obsługi zdarzeń w celu skorygowania kontekst (this):

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

kiedyś swój przykładowy kolego. Dzięki. – Khpalwalk

+0

@Khpalwalk Serdecznie zapraszamy :-) – madox2

+2

Uważam, że bardziej wymownym sposobem na to jest użycie funkcji strzałek, które z natury wiążą to z funkcją, uważam, że jest to szczególnie przydatne przy pisaniu kodu reakcji. Więc możesz użyć setAuthorState = event => {...}. Żadne dodatkowe linie kodu nie są konieczne, aby powiązać to z funkcją. Za każdym razem, gdy ten komponent jest klikany, nie wymaga dodatkowych kosztów związanych z jego powiązaniem. –

11

Należy ustawić this dla setAuthorState metody

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

czy możesz wyjaśnić, dlaczego tak jest? 'this.setAuthorState = this.setAuthorState.bind (this);' dlaczego trzeba go powiązać? – Ponciusz