2016-02-09 11 views
20

che sto ricevendo questo errore TypeError Uncaught: Impossibile leggere la proprietà 'stato' undefined ogni volta che digitare nulla nella casella di immissione di AuthorForm. Sto usando React con ES7.reagire con ES7: TypeError Uncaught: Impossibile leggere la proprietà 'stato' undefined

L'errore si verifica su 3a riga della funzione setAuthorState in ManageAuthorPage. Indipendentemente da quella riga di codice, anche se inserisco console.log (this.state.author) in setAuthorState, si fermerà su console.log e richiamerà l'errore.

Impossibile trovare il problema simile per qualcun altro su Internet.

Ecco il codice ManageAuthorPage:

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 

E qui è il codice AuthorForm:

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 

risposta

27

Bisogna collegare i gestori di eventi per correggere contesto (this):

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

ho usato il tuo esempio compagno. Grazie. – Khpalwalk

+0

@Khpalwalk Siete i benvenuti :-) – madox2

+2

Trovo che un modo più eloquente per farlo sia utilizzando le funzioni di freccia che lo collegheranno intrinsecamente alla funzione, lo trovo particolarmente utile quando si scrive codice di reazione. Quindi puoi usare setAuthorState = event => {...}. Non sono necessarie righe di codice aggiuntive per associare questo alla funzione. Inoltre, ogni volta che questo componente viene cliccato non richiede i costi aggiuntivi per vincolare questo. –

11

È necessario impostare this per setAuthorState metodo

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

puoi spiegare perché è così ?? 'this.setAuthorState = this.setAuthorState.bind (this);' Perché è necessario associarlo? – Ponciusz

Problemi correlati