2016-07-21 4 views
5

Das Problem, das ich habe, ist nach der Eingabe von Text zum ersten Mal, ich klicke dann auf Hinzufügen und das Eingabefeld wird gelöscht. Wenn ich jedoch wieder Text eingeben möchte, kann der eingegebene Text keinen anderen Text als den ersten eingeben. Ich bin mir nicht sicher, warum es das tut.Klartexteingabe nach Klickereignis

Antwort

4

Ich bin überrascht, dass dies sogar das erste Mal funktioniert. Mit controlled components reagieren (diejenigen, bei denen Sie den Wert wie bei Ihrer Eingabe einstellen). Sie müssen den Wert aktualisieren, wenn der Benutzer den Text ändert (mit dem Ereignis onChange()).

Ich machte eine JS fiddle here with your original code und Sie können sehen, Sie können nicht einmal den Wert in der Eingabe aktualisieren. Um es zu aktualisieren, müssen Sie das onBlur-Ereignis durch ein onChange event like this JS fiddle ersetzen. Ich hoffe, das hilft!

+0

Gibt es trotzdem die Methode default zu benutzen? Die Aktualisierung des Status nach jedem Treffer ist etwas unpoliert. Ich benutzte onBlur, so dass es den Status nur aktualisieren würde, nachdem sie die Textbox verlassen haben. – fes

+0

Keine Sorge, das ist der Weg, auf dem React erstellt wird, und zwar so, dass der Zustand Ihrer Benutzeroberfläche immer genau mit dem Status Ihres UI-Modells übereinstimmt und es ziemlich schnell ist, da react die UI ändert ! Das heißt, Sie tun eine Netzwerkanforderung bei jeder Änderung von "Wert"? Wenn ja, gibt es andere Möglichkeiten, das effizienter zu machen. –

1

Wie hier erwähnt (https://facebook.github.io/react/docs/forms.html#controlled-components)

A prop hat einen Wert gesteuert. Das Rendern eines kontrollierten Wertes spiegelt den Wert des Props wider.

Die Benutzereingabe hat keine Auswirkungen auf das gerenderte Element, da React den Wert als Hello deklariert hat. Um den Wert in Reaktion auf Benutzereingaben zu aktualisieren, können Sie die onChange Ereignis verwenden

Sie müssen entweder onBlur zu onChange ändern, oder verwenden Sie defaultValue statt value. z.B.

<input defaultValue={this.props.value} key={this.props.fid} type="text" onBlur={this.handleOnBlur} /> 
+0

Ich habe den DefaultValue versucht, aber das funktioniert nicht. Wenn ich eine console.log (this.props.value) in der Renderfunktion vor der Rückgabe mache ( fes

1

Sie müssen so schnell den Wert der Zustandsvariablen ändern, wie Sie den Eingabewert eingeben, weil das ist, was Sie die Eingabe bereitstellen, wenn Sie es nicht ändern Sie dann die Eingabe wird nicht den aktualisierten Wert anzeigen . Um dies zu tun, müssen Sie das Ereignis onChange überall verwenden.

var FormTextBox = React.createClass({ 
 
    handleOnChange: function (e) { 
 
     this.props.onChange(e.target.value); 
 
    }, 
 
    render: function() { 
 
     return (
 
      <input value={this.props.value} key={this.props.fid} type="text" onChange={this.handleOnChange} /> 
 
     ) 
 
    } 
 
}); 
 

 
var TestFormTextBox = React.createClass({ 
 
    getInitialState: function (e) { 
 
     return { 
 
      value: '' 
 
     } 
 
    }, 
 
    handleOnAdd: function (e) { 
 
     this.setState({ value: '' }); 
 
    }, 
 
    handleTextInfo: function (value) { 
 
     this.setState({ value: value }); 
 
    }, 
 
    render: function() { 
 
     return (
 
       <div> 
 
        <table> 
 
         <tbody> 
 
          <tr> 
 
           <td>Details</td> 
 
           <td></td> 
 
          </tr> 
 
          <tr> 
 
           <td><FormTextBox value={this.state.value} fid={1} onChange={this.handleTextInfo} /></td> 
 
           <td><button onClick={this.handleOnAdd}>Add</button></td> 
 
          </tr> 
 
         </tbody> 
 
        </table> 
 
       </div> 
 
     ) 
 
    } 
 
}); 
 

 
ReactDOM.render(<TestFormTextBox />, document.getElementById('app'));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.7/react-dom.min.js"></script> 
 
<div id="app"></div>

+0

Gibt es eine Möglichkeit ohne onChange zu verwenden? Ich möchte den Status nicht jedes Mal aktualisieren, wenn ein Zeichen eingegeben wird. Ich möchte den Status nach dem Beenden des Textfelds aktualisieren und dann auf der Schaltfläche zum Hinzufügen deaktivieren. – fes

+0

Nun, wenn Sie den Zustand als Wert verwenden, dann müssen Sie onChange verwenden oder versuchen, die Verwendung von Zustand als Wert zu beseitigen. Das habe ich noch nicht versucht, bevor ich diesen Ansatz gewählt habe. –

Verwandte Themen