2016-03-09 14 views
5

Nel mio componente Reagire Ho una forma con funzione di onSubmitPerché questo non è presente nella funzione React onSubmit?

<form className="form-horizontal" name="taskForm" onSubmit={this.submitTask}>

submitTask(e) { 

    e.preventDefault(); 
    console.log(this.props); // undefined 
    console.log(this) // window object 
} 

Per qualche ragione this.props non è portata quando uso modulo onSubmit. Quando I console.log(this.props) nel costruttore, gli oggetti di scena si disconnettono normalmente.

Quando I console.log(this) è l'oggetto finestra. Come ottengo lo scopo del componente di reazione?

+3

'onSubmit = {this.submitTask .bind (questo)} '. ** [Link] (http://reactkungfu.com/2015/07/why-and-how-to-bind-methods-in-your-react-component-classes/) **. –

+3

Tahir è corretto, sebbene raccomando di associare la funzione nel costruttore e non dentro il metodo 'render', in modo che si leghi solo una volta, non ogni volta che si chiama il rendering. Un altro modo senza binding sarebbe 'onSubmit = {event => this.submitTask (event, this.props)}' – azium

+1

La risposta di @azium dovrebbe essere la risposta corretta ... hai pieno accesso a oggetti di scena, funzioni e tutto. – Mussser

risposta

6

questo è più ampio problema, perché un comportamento simile a questo si noterà quando si utilizzano altri eventi dei componenti, ad esempio (onClick, onChange, onSubmit)

Nella documentazione v'è nota a questo proposito:

https://facebook.github.io/react/docs/reusable-components.html#no-autobinding

I metodi seguono la stessa semantica delle classi ES6 regolari, ovvero non si associano automaticamente all'istanza. Dovrai utilizzare esplicitamente .bind (this) o arrow functions =>.

Come descritto è necessario associare tali metodi o utilizzare le funzioni freccia. Se si sceglie l'associazione, è possibile eseguire il binding nel costruttore o nel componente sottoposto a rendering.

nel costruttore:

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

In componente reso:

<form className="form-horizontal" name="taskForm" onSubmit={this.submitTask.bind(this)}> 

Con la funzione freccia è possibile passare il contenuto submitTask a freccia funzione:

<form className="form-horizontal" name="taskForm" onSubmit={e => { 
    e.preventDefault(); 
    console.log(this.props); // undefined 
    console.log(this) // window object 
}}> 
Problemi correlati