Estoy tratando de crear un formulario simple con reaccionar, pero tengo dificultades para que los datos se vinculen correctamente con el valor predeterminado del formulario.
El comportamiento que estoy buscando es este:
- Cuando abro mi página, el campo de entrada de texto debe llenarse con el texto de mi AwayMessage en mi base de datos. Eso es "Texto de muestra"
- Idealmente, quiero tener un marcador de posición en el campo de entrada de texto si el AwayMessage en mi base de datos no tiene texto.
Sin embargo, en este momento, veo que el campo de entrada de texto está en blanco cada vez que actualizo la página. (Aunque lo que escribo en la entrada se guarda correctamente y persiste). Creo que esto se debe a que el html del campo de texto de entrada se carga cuando AwayMessage es un objeto vacío, pero no se actualiza cuando se carga awayMessage. Además, no puedo especificar un valor predeterminado para el campo.
Eliminé parte del código para mayor claridad (es decir, 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>
my console.log para AwayMessage muestra lo siguiente:
AWAY_MESSAGE Object {}
AWAY_MESSAGE Object {id: 1, company_id: 1, text: "Sample Text", master_toggle: false}
fuente
Otra forma de solucionar este problema es cambiando el
key
de la entrada.Actualización: dado que esto obtiene votos positivos, tendré que decir que debe tener un objeto de apoyo
disabled
oreadonly
mientras se carga el contenido, para que no disminuya la experiencia de ux.Y sí, lo más probable es que sea un truco, pero hace el trabajo .. ;-)
fuente
select
conkey
lodefaultValue
que es en realidadvalue
.key
de la entrada es la clave para obtener el nuevo valor reflejado en la entrada. Lo usé contype="text"
éxito.Quizás no sea la mejor solución, pero haría un componente como el siguiente para poder reutilizarlo en todas partes de mi código. Ojalá ya estuviera en reacción por defecto.
El componente puede verse así:
Donde el cambio por matriz es una función que accede al hash mediante una ruta expresada por una matriz
fuente
La forma más confiable de establecer valores iniciales es usar componentDidMount () {} además de render () {}:
Puede que le resulte fácil destruir un elemento y reemplazarlo por uno nuevo con
Me gusta esto:
También puede utilizar esta versión del método de desmontaje:
fuente
Dar valor al parámetro "placeHolder". Por ejemplo :-
fuente