React-Eingabe DefaultValue wird nicht mit Status aktualisiert
Ich versuche Sie ein einfaches Formular erstellen mit reagieren, aber, die Schwierigkeiten haben, die Daten ordnungsgemäß binden Sie die defaultValue-der form.
Das Verhalten, das ich Suche, ist dies:
- Wenn ich öffne meine Seite, die Text-input-Feld sollte ausgefüllt werden mit dem text meine AwayMessage in meiner Datenbank. Das ist "Sample Text"
- Im Idealfall möchte ich einen Platzhalter in den Text-Eingabe-Feld, wenn die AwayMessage in meiner Datenbank hat keinen text.
Aber jetzt, ich finde, dass der Text-input-Feld leer ist, jedes mal wenn ich die Seite aktualisieren. (Obwohl, was ich in die Eingabe nicht korrekt gespeichert und bleiben bestehen.) Ich denke, das ist, weil das input-text-Feld in das html geladen wird, wenn die AwayMessage wird ein leeres Objekt, aber nicht aktualisieren, wenn der awayMessage Lasten. Auch bin ich mir nicht geben Sie einen Standardwert für das Feld.
Habe ich entfernt, einige der code, der für Klarheit (d.h. onToggleChange)
window.Pages ||= {}
Pages.AwayMessages = React.createClass
getInitialState: ->
App.API.fetchAwayMessage (data) =>
@setState awayMessage:data.away_message
{awayMessage: {}}
onTextChange: (event) ->
console.log "VALUE", event.target.value
onSubmit: (e) ->
window.a = @
e.preventDefault()
awayMessage = {}
awayMessage["master_toggle"]=@refs["master_toggle"].getDOMNode().checked
console.log "value of text", @refs["text"].getDOMNode().value
awayMessage["text"]=@refs["text"].getDOMNode().value
@awayMessage(awayMessage)
awayMessage: (awayMessage)->
console.log "I'm saving", awayMessage
App.API.saveAwayMessage awayMessage, (data) =>
if data.status == 'ok'
App.modal.closeModal()
notificationActions.notify("Away Message saved.")
@setState awayMessage:awayMessage
render: ->
console.log "AWAY_MESSAGE", this.state.awayMessage
awayMessageText = if this.state.awayMessage then this.state.awayMessage.text else "Placeholder Text"
`<div className="away-messages">
<div className="header">
<h4>Away Messages</h4>
</div>
<div className="content">
<div className="input-group">
<label for="master_toggle">On?</label>
<input ref="master_toggle" type="checkbox" onChange={this.onToggleChange} defaultChecked={this.state.awayMessage.master_toggle} />
</div>
<div className="input-group">
<label for="text">Text</label>
<input ref="text" onChange={this.onTextChange} defaultValue={awayMessageText} />
</div>
</div>
<div className="footer">
<button className="button2" onClick={this.close}>Close</button>
<button className="button1" onClick={this.onSubmit}>Save</button>
</div>
</div>
meiner Konsole.Protokoll für die AwayMessage zeigt Folgendes:
AWAY_MESSAGE Object {}
AWAY_MESSAGE Object {id: 1, company_id: 1, text: "Sample Text", master_toggle: false}
InformationsquelleAutor der Frage Neeharika Bhartiya | 2015-05-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
defaultValue ist nur für das erste laden
Wenn Sie möchten, initialisieren Sie den Eingang, dann sollten Sie verwenden, defaultValue, aber wenn Sie verwenden möchten Staates, um den Wert zu ändern, dann müssen Sie verwenden Wert. Ich persönlich mag nur verwenden, defaultValue, wenn ich nur initialisieren und dann nur mit refs, um den Wert, wenn ich senden. Es gibt mehr info auf refs und Eingänge auf das reagieren, docs, https://facebook.github.io/react/docs/forms.html und https://facebook.github.io/react/docs/working-with-the-browser.html.
Hier ist, wie würde ich umschreiben Ihre Eingabe:
Auch Sie nicht wollen, um pass Platzhalter-text wie hast du denn das eigentlich setzen Sie den Wert auf "Platzhalter-text". Sie immer noch müssen, übergeben Sie einen leeren Wert in das Eingabefeld, da undefined und null stellt den Wert in Standardwert-im wesentlichen. https://facebook.github.io/react/tips/controlled-input-null-value.html.
getInitialState kann nicht in api-Aufrufe
Müssen Sie die api-Aufrufe nach getInitialState ausgeführt wird. Für deinen Fall würde ich es tun, in componentDidMount. Folgen Sie diesem Beispiel, https://facebook.github.io/react/tips/initial-ajax.html.
Ich würde auch empfehlen zu Lesen, bis auf die Komponente Lebenszyklus reagieren. https://facebook.github.io/react/docs/component-specs.html.
Umschreiben mit änderungen und laden von Staat
Persönlich mag ich nicht die ganze if -, else-dann-Logik in der render-und benutze lieber 'be' in meinem Zustand und machen einen font awesome spinner, bevor das Formular geladen wird, http://fortawesome.github.io/Font-Awesome/examples/. Hier ist ein umschreiben, um dir zu zeigen was ich meine. Wenn ich es vermasselte die Zecken für cjsx, es ist, weil ich normalerweise nur verwenden, coffeescript, wie diese, .
Sollte etwa deckt es. Nun, das ist ein Weg zu gehen, über die Formen, die verwendet Zustand und Wert. Sie können auch einfach verwenden defaultValue anstelle von Wert und verwenden Sie dann refs zu Holen Sie sich die Werte, wenn Sie Sie Einreichen. Wenn Sie diesen Weg gehen, würde ich empfehlen, Sie haben eine äußere Schale Komponente (in der Regel bezeichnet als high-Bestellung von Komponenten), um die Daten abzurufen, und dann geben Sie auf dem Formular als Requisiten.
Insgesamt würde ich empfehlen, das Lesen die reagieren docs alle den Weg durch und machen Sie einige tutorials. Es gibt viele blogs da draußen und http://www.egghead.io hatte einige gute tutorials. Ich habe einige Sachen auf meiner Website als gut, http://www.openmindedinnovations.com.
InformationsquelleAutor der Antwort Blaine Hatab
Anderen Weg, dies zu beheben ist durch die änderung der
key
des Eingangs.Update:
Da diese bekommen upvotes, ich muss sagen, dass Sie sollten ordnungsgemäß ein
disabled
oderreadonly
prop, während der Inhalt geladen wird, damit Sie nicht abnehmen das ux-Erlebnis.Und ja, es ist wahrscheinlich ein hack, aber es bekommt den job zu erledigen.. 😉
InformationsquelleAutor der Antwort TryingToImprove
Vielleicht nicht die beste Lösung, aber ich würde dafür eine Komponente wie unten, so kann ich es wiederverwenden, überall in meinem code. Ich wünschte, es war bereits zu reagieren, indem default.
Die Komponente kann wie folgt Aussehen:
Wo die Veränderung durch ein array ist eine Funktion, die den Zugriff auf hash durch einen Pfad, ausgedrückt durch eine Reihe
InformationsquelleAutor der Antwort Mïchael Makaröv
Die zuverlässigste Möglichkeit, um erste Werte ist die Verwendung componentDidMount(){} zusätzlich zu render(){}:
Können Sie feststellen, es einfach zu zerstören, element und ersetzen es durch das neue mit
wie diese:
Können Sie auch diese version der unmount-Methode:
InformationsquelleAutor der Antwort Roman
obwohl nicht empfohlen von reagieren, es funktioniert:
InformationsquelleAutor der Antwort
Geben Wert für parameter "Platzhalter".
Zum Beispiel :-
InformationsquelleAutor der Antwort Manas Gond