Reactフォームに問題があり、状態を適切に管理しています。私は時間入力フィールドをフォームで(モーダルで)持っています。初期値はgetInitialState
の状態変数として設定され、親コンポーネントから渡されます。これ自体はうまくいきます。Reactフォームの小道具の状態の更新
問題は、親コンポーネントを介してデフォルトのstart_time値を更新するときに発生します。更新自体は親コンポーネントでsetState start_time: new_time
によって行われます。しかし、私のフォームでは、デフォルトのstart_time値は決して変更されません。それは一度だけgetInitialState
に定義されているからです。
私は実際に動作したsetState start_time: next_props.start_time
によって状態を強制的に変更するのにcomponentWillUpdate
を使用しようとしましたが、私にはUncaught RangeError: Maximum call stack size exceeded
のエラーが出ました。
私の質問は、この場合の状態を更新する正しい方法は何ですか?どういうわけか、この間違いを考えていますか?
現在のコード:
@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
ありがとう。それは助けてくれるよ – Sukanta
"あなたはその時間を子コンポーネントではなく親から更新したい。"逆に? – ram4nd
それから私は何かが分からない限り、子コンポーネント内の単純な 'setState()'になります。 –