J'ai des problèmes avec un formulaire React et je gère correctement l'état. J'ai un champ de saisie de temps dans un formulaire (dans un modal). La valeur initiale est définie comme une variable d'état dans getInitialState
et est transmise à partir d'un composant parent. Cela fonctionne bien en soi.
Le problème survient lorsque je souhaite mettre à jour la valeur start_time par défaut via le composant parent. La mise à jour elle-même se produit dans le composant parent via setState start_time: new_time
. Cependant, dans ma forme, la valeur par défaut start_time ne change jamais, car elle n'est définie qu'une seule fois getInitialState
.
J'ai essayé de componentWillUpdate
forcer un changement d'état à travers setState start_time: next_props.start_time
, ce qui a effectivement fonctionné, mais m'a donné des Uncaught RangeError: Maximum call stack size exceeded
erreurs.
Ma question est donc la suivante: quelle est la bonne façon de mettre à jour l'état dans ce cas? Est-ce que je pense mal à cela d'une manière ou d'une autre?
Code actuel:
@ModalBody = React.createClass
getInitialState: ->
start_time: @props.start_time.format("HH:mm")
#works but takes long and causes:
#"Uncaught RangeError: Maximum call stack size exceeded"
componentWillUpdate: (next_props, next_state) ->
@setState(start_time: next_props.start_time.format("HH:mm"))
fieldChanged: (fieldName, event) ->
stateUpdate = {}
stateUpdate[fieldName] = event.target.value
@setState(stateUpdate)
render: ->
React.DOM.div
className: "modal-body"
React.DOM.form null,
React.createElement FormLabelInputField,
type: "time"
id: "start_time"
label_name: "Start Time"
value: @state.start_time
onChange: @fieldChanged.bind(null, "start_time”)
@FormLabelInputField = React.createClass
render: ->
React.DOM.div
className: "form-group"
React.DOM.label
htmlFor: @props.id
@props.label_name + ": "
React.DOM.input
className: "form-control"
type: @props.type
id: @props.id
value: @props.value
onChange: @props.onChange