当前位置: 首页 > 知识库问答 >
问题:

以React形式更新道具更改的状态

葛霄
2023-03-14

我有问题的反应形式和管理的状态适当。我在一个表单中有一个时间输入字段(在一个模态中)。初始值在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

共有2个答案

郏景澄
2023-03-14

显然事情正在发生变化....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
  }
}
徐丰茂
2023-03-14

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钩子中设置状态时,我们如何访问更