Estou tentando criar um formulário simples com react, mas estou enfrentando dificuldade para vincular os dados corretamente ao defaultValue do formulário.
O comportamento que procuro é este:
- Quando abro minha página, o campo de entrada de texto deve ser preenchido com o texto da minha AwayMessage em meu banco de dados. Isso é "Texto de amostra"
- Idealmente, eu quero ter um espaço reservado no campo de entrada Texto se AwayMessage em meu banco de dados não tiver texto.
No entanto, agora, estou descobrindo que o campo de entrada Texto fica em branco sempre que atualizo a página. (Embora o que eu digito na entrada salve corretamente e persista.) Acho que isso ocorre porque o html do campo de texto de entrada carrega quando o AwayMessage é um objeto vazio, mas não é atualizado quando o awayMessage é carregado. Além disso, não consigo especificar um valor padrão para o campo.
Removi parte do código para maior clareza (ou seja, 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>
meu console.log para AwayMessage mostra o seguinte:
AWAY_MESSAGE Object {}
AWAY_MESSAGE Object {id: 1, company_id: 1, text: "Sample Text", master_toggle: false}
fonte
Outra maneira de corrigir isso é alterando o
key
da entrada.Atualização: Já que isso ganhou votos positivos, devo dizer que você deve ter um suporte
disabled
oureadonly
prop enquanto o conteúdo está carregando, para não diminuir a experiência de ux.E sim, provavelmente é um hack, mas dá conta do recado ... ;-)
fonte
select
comkey
odefaultValue
que realmente évalue
.key
da entrada é a chave para obter o novo valor refletido na entrada. Eu usei comtype="text"
sucesso.Talvez não seja a melhor solução, mas eu faria um componente como o abaixo para poder reutilizá-lo em todo o meu código. Eu gostaria que já estivesse em reação por padrão.
O componente pode ser semelhante a:
Onde mudança por array é uma função que acessa o hash por um caminho expresso por um array
fonte
A maneira mais confiável de definir valores iniciais é usar componentDidMount () {} além de render () {}:
Você pode achar fácil destruir um elemento e substituí-lo por um novo com
como isso:
Você também pode usar esta versão do método de desmontagem:
fonte
Dê valor ao parâmetro "placeHolder". Por exemplo :-
fonte