在 React Form 中更新 props 变化的状态

2024-03-08

我在使用 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 errors.

所以我的问题是,在这种情况下更新状态的正确方法是什么?我是否以某种方式思考这个错误?

当前代码:

@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

自 React 16 起,ComponentWillReceiveProps 已被弃用:使用从Props获取DerivedState https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops instead

如果我理解正确的话,你有一个正在传递的父组件start_time下降到ModalBody将其分配给自己的状态的组件?并且您希望从父组件而不是子组件更新该时间。

React 有一些处理这种情况的技巧。 https://web.archive.org/web/20170101062930/http://reactjs.cn/react/tips/props-in-getInitialState-as-anti-pattern.html(请注意,这是一篇旧文章,已从网络上删除。这是当前文章的链接组件 props 的文档 https://reactjs.org/docs/components-and-props.html).

使用 props 生成状态getInitialState通常会导致“事实来源”的重复,即真实数据的位置。这是因为getInitialState仅在首次创建组件时调用。

只要有可能,即时计算值,以确保它们以后不会不同步并导致维护麻烦。

基本上,每当你分配父母的props到一个孩子的staterender 方法并不总是在 prop 更新时调用。您必须使用以下命令手动调用它componentWillReceiveProps method.

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 });
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 React Form 中更新 props 变化的状态 的相关文章

  • Material UI - 更改主题中的按钮文本颜色

    我在直接在 Material UI 主题中更改按钮文本颜色时遇到问题 更改主色 按钮字体大小效果很好 因此问题不在于传递主题 这是我的代码 import React from react import MuiThemeProvider cr
  • Vue中有类似React.Fragment的东西吗?

    在 React 中我可以做这样的事情 parent component export default return div div 1 div div
  • React 中的 Reconciliation 详解

    我是 React JS 的新手 谁能准确解释和解是如何运作的 我尝试从 React 官方网站上理解它 但没有得到它 我是这样理解的 您会同意 React 使用组件使事情变得简单且更快 通过 JSX 我们可以让用户定义的组件变得更容易 一天结
  • ReactTransitionGroup 不适用于 React-redux 连接组件

    我正在开发一个更大的项目 但我创建了这个简短的示例来说明问题 如果我使用Box组件 它的工作原理 它在控制台中输出componentWillEnter and componentWillLeave当我们点击按钮时 如果我使用BoxConta
  • 使用 next.js 进行服务器端渲染与传统 SSR

    我非常习惯 SSR 意味着页面得到完全刷新并从服务器接收完整 HTML 的方法 其中根据后端堆栈使用 razor pub other 进行渲染 因此 每次用户单击导航链接时 它只会向服务器发送请求 整个页面将刷新 接收新的 HTML 这就是
  • React - 如何在不使用构造函数的情况下访问道具

    注意 我在使用 React Native 时遇到了这个特定问题 但我想这也适用于 React 我有一个使用 React Component 构建的反应组件 我不需要设置状态 但我确实有道具 我建议的语法如下 class Header ext
  • webpack 4 React loadable 不会根据卡盘点分割供应商

    我目前正在使用 webpack 4 和 React loadable 来创建块 它实际上分块取决于断点 然而 供应商规模保持不变 React loadable 还不支持 webpack 4 吗 或者我缺少一些设置 css 实际上似乎被分成了
  • 自定义rc-time-picker的样式

    我在用rc time picker我的项目的包 但我在自定义样式时遇到问题pop up of my time picker成分 这是我的组件的屏幕截图 首先 我需要更改时间的背景颜色item在当时li from light grey 在屏幕
  • 如何让 Django 和 ReactJS 协同工作?

    New to Django and even newer to ReactJS I have been looking into AngularJS and ReactJS but decided on ReactJS It seemed
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • Cypress 在 Create React App 中返回 .scss 文件的 webpack 编译错误

    我正在尝试将 Cypress 添加到非常基本的 CRA 但遇到了 Cypress 无法理解 scss 文件的问题 当我跑步时npm run cypress运行测试 我收到以下错误 Error Webpack Compilation Erro
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points
  • redux 和 React 中减速器的先前状态

    这是我的减速器的样子 export default function catalogReducer state initialState catalogItems action switch action type case types L
  • redux 是否会在对存储进行任何更新时评估存储的所有侦听器?

    据我所知 当商店中的任何内容发生变化时 redux 都会通知商店的所有订阅者 无论是对深层嵌套叶子的订阅还是对状态顶层的订阅 在您遵循指导原则的应用程序中 许多单独的组件应该连接到商店 而不是仅仅几个 docs https redux js
  • 如何从CDN注入外部JS到Jest单元测试?

    我有 npm 和 webpack 的反应应用程序 我正在尝试向其添加单元测试 我使用的是包含在我的index html 中的CDN 的jQuery 而不是使用节点模块 我在组件中使用 jQueryTest1我向其中添加了单元测试用例 现在
  • React:设置 State 或设置 Prop 而无需重新渲染

    Problem 目前 我有一个LoginForm具有 成功 处理函数的组件handleOnSuccess 然后将其链接到父组件onTokenUpdate由 令牌更新 处理函数定义的属性handleUpdateToken 问题是setStat
  • Typescript 和 React 使用空类型数组设置初始状态

    假设我有以下片段 interface State alarms Alarm export default class Alarms extends React Component lt State gt state alarms 因为我想设
  • 在 React 应用程序中简单连接到 mongodb

    我使用 create react app 创建了简单的反应应用程序 这个应用程序包含表单 验证和引导程序 没有什么花哨的东西能像魅力一样发挥作用 我还注册了 mongo 以获得免费集群 以便我可以发送一些数据 所以我有这个网址 mongod
  • React router.push 和 router.replace 之间的区别?

    有什么区别React 路由器推送 and 路由器 替换 路由器历史记录就像一个stack of routes 当您使用router replace 您将覆盖堆栈的顶部 当使用router push 它在顶部添加了一条新路线stack 路由器
  • Apollo 客户端延迟刷新

    In Apollo Client v3React 实现 我使用钩子来使用订阅 当我从订阅接收数据时 我想重新获取查询 但前提是查询之前已执行过并且位于缓存中 有办法实现这一点吗 我首先进行惰性查询 然后在收到订阅数据时手动检查缓存 然后尝试

随机推荐

  • 完全忽略Gnuplot中的某些数据行

    我想使用 Gnuplot 绘制一种数据透视图 所以我需要忽略文件中的一些数据行 我尝试了以下方法 unset key set xtics font Times Roman 5 set ytics font Times Roman 5 set
  • 从文件中读取行并将其存储在数组中

    我无法从文件中逐行读取文本并将每一行存储到数组中 然后我需要打印出我得到的数组 我不确定是否为该数组正确分配了空间 我收到来自以下位置的分段错误fgets in my read one line 功能 My code include
  • 实体框架未声明 datetime.now 为 null

    这是我的代码 UVCUpdate update new UVCUpdate update CurrentDate DateTime Now context UVCUpdates Add update context SaveChanges
  • 本体验证的耶拿规则

    我想验证本体并在有任何不正确的情况下抛出错误 我要做的最多的验证如下所示 我有一堂这样的课
  • 如何在 SQL Server Reporting Services 中最好地显示复选框?

    我们遇到的 Reporting Services 的众多怪癖之一是完全缺乏 CheckBox 控件 甚至完全缺乏类似的东西 我们有一个表格 应该根据从数据库中提取的信息自动填写 我们有几个位数据类型字段 打印出 True 或 False 看
  • Rest API附件错误

    我在使用机器人框架 REST API 通过 Skype 通道发送附件时遇到问题 我能够使用这样的 json 消息正确发送图像 type message timestamp 2017 05 22T11 31 36 2281894Z from
  • MySQL `BEFORE INSERT TRIGGER` 如何在条件下跳过数据插入? [复制]

    这个问题在这里已经有答案了 可能的重复 MySQL触发器在某些条件下阻止INSERT https stackoverflow com questions 2981930 mysql trigger to prevent insert und
  • 更新到 Mac OS X Lion 后,我的笔记本电脑无法识别“make”命令

    请帮忙 有人遇到这个问题吗 bash make command not found make与大多数开发人员工具一样 它随 Xcode 一起提供 当我升级时 OSX 保留了这些工具 但如果您不是这种情况 只需下载并安装 Lion 版本的 X
  • Java ImageIcon/Icon 和 JLabel 不工作

    为什么我的代码没有显示我插入的图像 没有编译错误或语法错误 但为什么会这样呢 import java awt FlowLayout import javax swing JFrame import javax swing JLabel im
  • 21 之前的 api 级别的 setClipToOutline 的替代方案

    我需要在非线性的边框图像后面剪辑图像 为此 我已成功测试了 setClipToOutline 但由于 setClipToOutline 是在 api 级别 21 中引入的 应用程序会在 api 级别 21 之前的设备上崩溃 请为此提出任何替
  • 无法在后面的 set 语句中引用 Hive 日期变量

    我正在尝试将日期存储到配置单元变量中 但稍后无法使用它 hive gt select to date date sub last day FROM UNIXTIME UNIX TIMESTAMP yyyy MM dd 1 OK 2019 0
  • schema 中的方法和属性:Scheme 中是否可以实现 OOP?

    我将用一个简单的例子来说明我的问题 在 Java C 或任何其他 OOP 语言中 我可以创建一个pie类的方式类似于 class Apple public String flavor public int pieces private in
  • 短信 url 方案不适用于 IOS5

    在我的针对 iphone 和 android 的网络应用程序中 我有一个 发短信给我 按钮 单击该按钮后 用户会收到预先填写了号码和正文的短信 这在 ios 5 之前的 iphone 中运行良好 在IOS 5中 点击按钮不会导致短信应用 I
  • C++ 默认构造函数缺失,我无法编译

    我有这个非常简单的课程 class myclass public int id double x y z myclass default If I omit this line I get an error myclass int ID d
  • iPhone - 时区便利方法之间的差异

    我看到NSTimeZone有这些方法 defaultTimeZone localTimeZone systemTimeZone 有人可以简单地向我解释一下这些调用之间有什么区别 以及何时应该使用其中一个而不是另一个 我不明白苹果文档中关于此
  • 如何在使用 STS (WIF) 进行身份验证的 MVC 应用程序中设置滑动过期

    我们正在使用 STS 开发一个 MVC 应用程序 我们使用 WIF 工具创建了一个简单的 STS 应用程序进行开发 我希望能够在我的令牌 在 RP 中 中设置滑动到期时间 我看到代码像这儿 http social msdn microsof
  • Spark 流自定义指标

    我正在开发一个 Spark Streaming 程序 它检索 Kafka 流 对流进行非常基本的转换 然后将数据插入到数据库 如果相关 则为 voltdb 我正在尝试测量向数据库插入行的速率 我认为metrics http metrics
  • 通过配置强制在 WCF 客户端 C# 中使用 tls 1.0

    我们有一个 Web 应用程序 其中有一个使用 WCF 实现的客户端 该客户端使用 SSL LVL3 与外部服务进行握手 原来该服务只是禁用了SSL LVL3 所以我们需要将其更改为TLS 1 0 有一种方法可以在 C 中强制使用 TLS 安
  • 为什么 `myfloat in myset` 变得超级慢?

    当我重新插入相同的float值进入我的设置几次 x in s本来应该花费恒定时间的检查变得非常慢 为什么 定时输出x in s 0 06 microseconds 0 09 microseconds 0 16 microseconds 0
  • 在 React Form 中更新 props 变化的状态

    我在使用 React 表单和正确管理状态时遇到问题 我在表单 模态 中有一个时间输入字段 初始值设置为状态变量getInitialState 并从父组件传入 这本身就很好用 当我想通过父组件更新默认的 start time 值时 问题就出现