我有问题的反应形式和管理的状态适当。我在一个表单中有一个时间输入字段(在一个模态中)。初始值在GetInitialState
中设置为状态变量,并从父组件传入。这本身就很好用。
当我想通过父组件更新默认的start_time值时,问题就来了。更新本身通过setstate start_time:new_time
在父组件中发生。但是,在我的表单中,默认的start_time值从不更改,因为它只在getinitialstate
中定义过一次。
我尝试使用componentwillupdate
通过setstate start_time:next_props.start_time
强制更改状态,这确实起到了作用,但给了我未捕获的RangeError:最大调用堆栈大小超出
错误。
所以我的问题是,在这种情况下更新状态的正确方式是什么?我是不是想错了?
当前代码:
@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
显然事情正在发生变化....getDerivedStateFromProps()现在是首选函数。
null
class Component extends React.Component {
static getDerivedStateFromProps(props, current_state) {
if (current_state.value !== props.value) {
return {
value: props.value,
computed_prop: heavy_computation(props.value)
}
}
return null
}
}
componentWillReceiveProps自react 16以来被启用:改用getDerivedStateFromProps
如果我没有理解错的话,您有一个父组件正在将start_time
向下传递给modalbody
组件,该组件将它分配给自己的状态?并且您希望从父组件而不是子组件更新该时间。
React提供了一些处理这种情况的技巧。(注意,这是一篇已经从Web上删除的旧文章。这里有一个关于组件道具的当前文档的链接)。
在getinitialstate
中使用props生成状态经常会导致“真相来源”的重复,即真实数据在哪里。这是因为GetInitialState
仅在首次创建组件时调用。
只要有可能,立即计算值,以确保它们以后不会不同步,从而造成维护问题。
基本上,每当您将父级的props
分配给子级的state
时,并不总是在prop更新时调用render方法。您必须使用ComponentWillReceiveProps
方法手动调用它。
componentWillReceiveProps(nextProps) {
// You don't have to do this check first, but it can help prevent an unneeded render
if (nextProps.startTime !== this.state.startTime) {
this.setState({ startTime: nextProps.startTime });
}
}
问题内容: 我在使用React表单和正确管理状态时遇到麻烦。我有一个形式为模式的时间输入字段。初始值在中设置为状态变量,并从父组件传递。这本身工作正常。 当我想通过父组件更新默认的start_time值时,就会出现问题。更新本身通过发生在父组件中。但是在我的表单中,默认的start_time值从不更改,因为它仅在中定义一次。 我尝试过通过强制进行状态更改,该更改确实有效,但给了我错误。 所以我的问
我有一个React应用程序,其中来自父组件的道具被传递到子组件,然后道具设置子组件的状态。 如何让它更新子组件上的状态? 我的精简代码:
在react组件中,通常不应在其中变异道具。此外,家长只能更改道具,不能直接更改状态。基于这两个事实,假设在任何componentDidUpdate调用中,例如。, 只读 这道具可能与prevProps不同,或者与此不同。状态可能与状态不同,但这两种情况不能同时发生?
问题内容: 我正在尝试将表示性组件与容器组件分开。我有一个和一个。容器负责触发redux操作,以根据当前用户获取适当的网站。 问题是在最初呈现容器组件之后,异步获取了当前用户。这意味着容器组件不知道它需要重新执行其函数中的代码,该代码将更新数据以发送到。我认为我需要在其props(user)之一更改时重新渲染容器组件。如何正确执行此操作? 问题答案: 您必须在方法中添加条件。 该示例用于比较对象。
问题内容: 我是Java的新手,但需要知道开发人员是否有可能,以便 他/她可以更改的形状JProgressBar。我的意思是假设 我想更改形状,使其看起来像圆形或 其他形状? 尽管我只是希望将其从条形更改为弧形,或者 可以说我想将条形更改为任何其他形状。我的进度条 可能看起来像条形以外的曲线。我想在其中添加一条曲线。 问题答案: a的外观JProgressBar由组件的UI委托控制,该委托通常从派
在基于类的React组件中,我们可以使用setState的函数形式定义处理函数,例如: 其中,两个参数表示传递给此组件的先前状态和更新的道具。 类似地,我们有一个函数形式,使用useState钩子在函数组件中设置状态,如下所示: 但正如我们所看到的,useState钩子中的函数形式缺少表示更新的道具的第二个参数 这是React开发团队故意留下的吗?在useState钩子中设置状态时,我们如何访问更