在 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 变化的状态 的相关文章

  • 有什么办法可以避免使用 React 的 SSR 中的“文本内容不匹配”警告?

    我已经用 webpack 和 HMR 设置了 SSR 环境 有一个静态呈现的标记 服务器传递给客户端和client js捆绑与ReactDOM hydrate 方法 如果我更改源代码 HMR 可以正常工作 但会在控制台中发出警告 指出客户端
  • 与 useEffect 一起使用时如何防止 useCallback 触发(并遵守 eslint-plugin-react-hooks)?

    我有一个用例 页面必须在第一次渲染和单击按钮时调用相同的获取函数 代码类似于以下内容 参考 https stackblitz com edit stackoverflow question bink 62951987 file index
  • MUI 组件上的渐变边框

    我没能找到相当于border image source css 我的目标是在按钮组件上渲染边框渐变 这是添加渐变边框的方法button成分 V5 const options shouldForwardProp prop gt prop gr
  • Facebook 登录无法在移动浏览器中使用

    我使用 react facebook login 在我的网站中实现了 facebook 登录module https github com keppelen react facebook login 我在 ComponentDidMount
  • Hooks setState 总是落后一步

    我使用了 useState 钩子 应该在每次下拉按钮的值发生变化时触发设置状态方法 在钩子中 但设置状态总是落后一步 我已经看到了使用基于类的组件的传统 setState 方法的解决方案 但是如何使用钩子解决此问题useState
  • 退出动画在下一个 js 帧器运动中不起作用?

    我在我的应用程序中使用 next js 在我的动画中使用成帧器运动 我可以设置介绍动画 但退出动画根本不起作用 我已将代码包装在动画效果下 但它没有执行任何操作 我在这里缺少什么 下面是我的示例代码
  • 在nextjs中获取URL路径名

    我有一个登录页面和布局组件 布局组件有标题 我不想在登录中显示标题 为此 我想获取 url 路径名 基于路径名显示标题 import as constlocalStorage from helpers localstorage import
  • 如何编写具有依赖状态的 redux 减速器

    我正在开发一个 React Redux 应用程序 它允许将 小部件 添加到页面并在 2D 空间中进行操作 要求可以同时选择和操作多个小部件 我当前状态树的简化版本如下所示 widgets widget 1 x 100 y 200 widge
  • 从 git repo 拉取后出现白屏死机(React JS、Nginx)

    每当我从 master 分支执行 git pull 到服务器上时 我所有的 React 文件似乎都消失了 屏幕变成白色 我发现的临时解决方法是 删除浏览器 cookie 缓存和站点历史记录 然后关闭浏览器并重试 删除node modules
  • 有条件地使用 Node.js 提供两个 React 构建

    我有两个基于设备向客户端提供服务的 React 应用程序 我使用 Node js 和 Express 来实现这一点 我借了static资产处理部分来自这个问题在这里 https stackoverflow com questions 644
  • React 函数组件与返回 React 元素的普通 JS 函数

    假设我定义了一个简单的 React 功能组件 如下所示 const Greeter1 name gt h1 Hello name h1 我还可以定义一个等效的普通 JS 函数 它返回一个 React 元素 如下所示 const Greete
  • TinyMCE 输入以相反顺序写入

    我面临这个问题 每当我输入 TinyMCE 时 我的光标会自动向左移动 最终从右向左写入文本 它只发生在我部署的应用程序中 但如果我在我的机器上本地运行代码 同样可以正常工作 发生这种情况的任何可能原因 相同的屏幕截图 https i st
  • React.js this.props.data.map() 不是一个函数

    我正在搞乱反应并尝试解析和渲染 json 对象 现在 我只是使用硬编码对象设置它以进行测试 而不是从 ajax 调用中获取它
  • 发送404状态并重定向到react-router中的404组件

    我有一个 React router 3 0 0 设置 其中包含一个 NotFound 组件 我将其显示为后备
  • 等待在 nextjs 页面中加载 paypal 脚本

    我有这段代码应该呈现 PayPal 按钮 我在 componentDidMount 方法中加载 PayPal 按钮 componentDidMount paypal Buttons createOrder data actions gt r
  • ReactJS 服务器端渲染与客户端渲染

    我刚刚开始研究ReactJS 发现它提供了两种渲染页面的方式 服务器端和客户端 但是 我不明白如何一起使用它 构建应用程序是两种不同的方法 还是可以一起使用 如果我们可以一起使用它 该怎么做 我们需要在服务器端和客户端复制相同的元素吗 或者
  • 选择单选按钮来更改状态

    我如何设置input type radio 这样状态值就会根据用户的选择而改变 在这种情况下 我想要按钮name 1 成为默认选择的按钮 但如果按钮name 2 由用户选择 某些状态值应该改变 div div
  • 如何在 React 类组件中使用 React-query?

    我意识到 如果我想使用钩子import useQuery from react query 我只能在 React 函数组件中做到这一点 我是否必须用 React 函数语法重写旧的类组件 或者是否有一种简单的方法可以将 React query
  • 尽管我正在更改状态,但 React ui 没有更新

    import React useState from react const App gt const anecdotes If it hurts do it more often Adding manpower to a late sof
  • Antd datepicker (date.clone/date.load 不是函数)

    我有一个反应应用程序 有一个复选框可以禁用日期选择器 但当我使用复选框禁用它时 我无法选择任何日期 如果我删除复选框及其功能 则不会出现错误 目前 我得到 date clone 不是函数 error const dateFormat YYY

随机推荐

  • 完全忽略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 值时 问题就出现