我在使用React表单和正确管理状态时遇到麻烦。我有一个形式为模式的时间输入字段。初始值在中设置为状态变量getInitialState
,并从父组件传入。这本身工作正常。
当我想通过父组件更新默认的start_time值时,就会出现问题。更新本身通过发生在父组件中setState start_time: new_time
。但是在我的表单中,默认的start_time值从不更改,因为它仅在中定义一次getInitialState
。
我曾尝试通过componentWillUpdate
强制进行状态更改setState start_time: next_props.start_time
,该更改确实有效,但给了我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
从他们的文档中可以很明显地看出来:
使用:https : //reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#what-about-memoization