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 getInitialStateet 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 componentWillUpdateforcer 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 exceedederreurs.
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