J'essaie de créer un formulaire simple avec react, mais je suis confronté à des difficultés pour que les données soient correctement liées à la valeur par défaut du formulaire.
Le comportement que je recherche est le suivant:
- Lorsque j'ouvre ma page, le champ de saisie de texte doit être rempli avec le texte de mon AwayMessage dans ma base de données. C'est "Exemple de texte"
- Idéalement, je souhaite avoir un espace réservé dans le champ de saisie Texte si le AwayMessage de ma base de données ne contient pas de texte.
Cependant, pour le moment, je constate que le champ de saisie de texte est vide chaque fois que j'actualise la page. (Bien que ce que je tape dans l'entrée enregistre correctement et persiste.) Je pense que c'est parce que le html du champ de texte d'entrée se charge lorsque AwayMessage est un objet vide, mais ne s'actualise pas lorsque le awayMessage se charge. De plus, je ne peux pas spécifier une valeur par défaut pour le champ.
J'ai supprimé une partie du code pour plus de clarté (c'est-à-dire 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>
mon console.log pour AwayMessage montre ce qui suit:
AWAY_MESSAGE Object {}
AWAY_MESSAGE Object {id: 1, company_id: 1, text: "Sample Text", master_toggle: false}
la source
Une autre façon de résoudre ce problème est de changer le
key
de l'entrée.Mise à jour: Étant donné que cela suscite des votes positifs, je dois dire que vous devriez correctement avoir un
disabled
ou unreadonly
accessoire pendant le chargement du contenu, afin de ne pas diminuer l'expérience ux.Et oui, c'est probablement un hack, mais ça fait le travail .. ;-)
la source
select
aveckey
comme cedefaultValue
qui est en réalitévalue
.key
de l'entrée est la clé pour obtenir la nouvelle valeur reflétée dans l'entrée. Je l'ai utilisé avectype="text"
succès.Peut-être pas la meilleure solution, mais je créerais un composant comme ci-dessous afin de pouvoir le réutiliser partout dans mon code. J'aurais aimé qu'il soit déjà en réaction par défaut.
Le composant peut ressembler à:
Où le changement par tableau est une fonction accédant au hachage par un chemin exprimé par un tableau
la source
Le moyen le plus fiable de définir les valeurs initiales consiste à utiliser componentDidMount () {} en plus de render () {}:
Vous trouverez peut-être facile de détruire un élément et de le remplacer par le nouveau avec
comme ça:
Vous pouvez également utiliser cette version de la méthode de démontage:
la source
Donnez une valeur au paramètre "placeHolder". Par exemple :-
la source