componentWillReceiveProps 与 getDerivedStateFromProps

2024-02-16

componentWillReceiveProps 和 getDerivedStateFromProps 到底是什么对我来说是个微妙的问题。因为,我在使用 getDerivedStateFromProps 时遇到了一个问题:

// Component 
state = {
  myState: []
}

// Using this method works fine:

componentWillReceiveProps(nextProps) {
  this.setState({
    myState: nextProps.myPropsState
  })
}

// But using this method will cause the checkboxes to be readonly:

static getDerivedStateFromProps(nextProps,prevProps) {
  const { myPropsState: myState } = nextProps
  return {
    myState
  }
}

// And here's checkbox
<input type="checkbox" id={`someid`} 
 onChange={(e) => this.handleMethod(e, comp.myState)} 
 checked={myState.indexOf(comp.myState) > -1} />

反应版本:16.4.1


getDerivedStateFromProps不是直接替代componentWillReceiveProps,纯粹是因为它在每次更新后调用,无论是状态更改、道具更改还是父级的重新渲染。

然而无论如何,只需从返回状态getDerivedStateFromProps这不是正确的方法,您需要在返回值之前比较状态和道具。否则,每次更新时状态都会重置为 props 并且循环继续

根据docs https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops

getDerivedStateFromProps在调用渲染之前调用 方法,无论是在初始安装还是后续更新上。它应该 返回一个对象来更新状态,或者null不更新任何内容。

此方法适用于状态取决于的罕见用例 道具随时间变化。例如,它可能很方便 实施一个<Transition>比较其之前和之前的组件 下一个孩子来决定让哪些孩子进入和退出动画。

派生状态会导致冗长的代码并使您的组件 很难思考。确保您熟悉更简单的 备择方案:

如果你需要产生副作用(例如,数据获取 或动画)响应道具的变化,使用componentDidUpdate相反,生命周期。

如果你想仅当 prop 更改时重新计算一些数据, 使用 Amemoization代替帮手。

如果你想当 prop 改变时“重置”某些状态, 考虑 要么制作一个组件fully controlled or fully uncontrolled with a key instead.

P.S.请注意, getDerivedStateFromProps 的参数是props and state并不是nextProps and prevProps

要了解更多详细信息,

为了根据 props 更改进行更改,我们需要将 prevPropsState 存储在状态中,以便检测更改。典型的实现如下所示

static getDerivedStateFromProps(props, state) {
    // Note we need to store prevPropsState to detect changes.
    if (
      props.myPropsState !== state.prevPropsState
    ) {
      return {
        prevPropsState: state.myState,
        myState: props.myPropsState
      };
    }
    return null;
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

componentWillReceiveProps 与 getDerivedStateFromProps 的相关文章

  • AJAX 加载 WordPress 内容

    我一直在遵循 AJAX 教程来尝试将我的 WordPress 帖子内容加载到我网站的主页上 而无需重新加载页面 我不知道为什么 但是当单击链接时 它仍然导航到页面 而不是将内容加载到我指定的 div 中 不管怎样 这对我来说有点太多了 我希
  • JSON.stringify / 解析带有引号的奇怪内容

    我在解析一些包含引号的 JSON 时遇到了一个奇怪的小问题 我正在使用本机 JSON stringify 和 JSON parse 函数来执行此操作 如果我将一个对象 其中有引号的对象 字符串化 它们就会像人们所期望的那样被转义 如果我然后
  • 如何在两个动画画布元素之间进行通信?

    我想在两个动画画布元素之间进行通信 我使用 Adob e Animate CC 制作了两个 html5 canvas js 动画 我已将这两个元素放入一个 html 页面中 我可以成功地从这些动画中调用函数 在下面的代码中成功触发了警报 我
  • 单击单选按钮时事件触发的顺序是什么?

    我知道这在浏览器之间是不同的 例如如果我将一个函数附加到单选按钮的 onclick 和 onchange 事件 然后单击它 Chrome 会触发 onchange 然后触发 onclick 而 Firefox 则会执行相反的操作 是否有任何
  • onclick 和 href="javascript:函数名 之间有什么区别?

    有什么区别吗 1 a href Link1 a and 2 a href Link2 a 会以某种方式影响页面性能吗 如果您的元素实际上不应该将用户链接到某个地方 不要将其设为锚元素 如果您正在使用 a 标签只是为了改变下划线 光标 不要
  • 我在 signalr javascript 客户端中收到未定义的连接 ID

    根据我遇到的所有文档 我应该能够在连接启动后调用 connection hub id 这是我的代码 var handshake connection handshakeHub connection hub start done functi
  • 全局注册vue组件

    我有一个使用 vue cli 创建的 vue 应用程序 我正在创建一些组件 我想像这样使用它们
  • 检查变量/键是否存在

    我有一位价值不同的客户 如果客户 是 则分数 10 如果客户 否 则得分 5 如果客户为空 则分数 0 对于第一个和第二个条件 我的 json 结构如下 json fields customer 1 0 3 self aaa value y
  • 当用户输入时将输入值转换为货币格式

    我无法将输入值转换为货币格式 我想在用户键入数字 5 000 00 125 000 00 时自动添加千位和小数分隔符 这是我的代码 input CurrencyInput on blur focus keyup function this
  • getUserMedia 在 chrome 版本 48.0.2560.0 中无法工作,而在 46.0 中工作

    我的困惑是 我在我的页面中使用了 gerUSerMedia 该页面无法在我们的服务器上工作 而在某些机器上 在那些 chrome 浏览器中具有版本为 48 0 2560 0 的 chrome 时 它 将给出以下警告 getUserMedia
  • RegEx 从 CSS 背景样式中提取 URL

    我有一个这种形式的字符串 url http www example com imgs backgrounds bg80 jpg repeat scroll 10 0 transparent 这是来自某个元素的 CSS 样式 该元素目前在页面
  • 延迟加载使用 document.write 的双击广告的最佳方法是什么?

    通过 doubleclick 请求的广告通常由广告提供商网络提供服务 该网络返回 javascript 进而执行 document write 以将广告放置在页面中 使用 document write 要求文档处于打开状态 这意味着页面尚未
  • Twitter Bootstrap 2 模式表单对话框

    我有以下对话框 div class modal div class modal header a class close a h3 Add Tags h3 div div class modal body div div
  • Discord JS - DiscordAPIError:缺少访问权限

    所以我按照磨损钥匙教程来不和谐机器人 我不知道问题是什么 这是错误 home container node modules discord js src rest RequestHandler js 349 throw new Discor
  • Parse JS SDK:无法使用主密钥,尚未提供

    我需要在我的 angular2 应用程序中使用 masterKey 但我无法将其传递给initialize功能 我无法用谷歌搜索出原因 从package json parse 1 9 2 初始化 import Parse from node
  • 使用Javascript自动将光标移动到下一个表单字段[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 是否可以使用Javascipt自动将
  • 自动滚动的实时行情(如 Twitter 的“热门推文”)

    是否有一个好的 Javascript 库可以生成自动滚动列表 例如 Twitter 主页上的 热门推文 最好作为 jQuery 插件 它还应该支持 AJAX 功能 动态添加新列表项 由于我们对现有的解决方案并不满意 因此我们从头开始实施了一
  • 如何使我的滚动到顶部按钮动画流畅

    我的页面上有一个滚动到顶部按钮 但是当我单击它时 它不会滚动到顶部 它只是直接带我到顶部 就像我加载了一个新页面一样 但我需要的是滚动动画 javascript window onscroll function scrollFunction
  • JavaScript 节点列表

    有没有办法连接 2 个 document getElementsByTagName 调用返回的 2 个 NodeList 比如说 我有以下代码 var inputs documentElement getElementsByTagName
  • 类型“CombinedVueInstance>>”上不存在属性“XXX”

    我使用 TypeScript 创建了一个 vue 组件 并且在以下位置收到此错误data and in methods Property xxx does not exist on type CombinedVueInstance

随机推荐

  • Haproxy 性能调整?

    我们正在尝试为来自客户端 而不是浏览网络交易类型的用户 的 get 和 post 请求找到 haproxy 的最佳调整选项 使用 30k 线程运行 jmeter 测试 其中包括 5 个对服务器的调用 1 个用户注册和一些更新调用 这些通过管
  • 使用awk解析

    如何使用 awk 根据另一个文件的数据解析文件 我做了一个脚本 BEGIN FS t OFS t while getline lt headfpkm gt 0 a id a 1 fpkm a 2 print id a fpkm a last
  • Sass::SyntaxError:未定义的 mixin 'mixin_name'

    我正在开发一个 Rails 4 项目 其中使用 Sass 和 Sass 的 import 将多个 css 合并为一个 它工作正常 但如果我使用新的混入部分则不行 mixins css scss 和 import这个main css scss
  • 如何以编程方式获取 SVN 修订号?

    喜欢这个问题 https stackoverflow com questions 681770 how to programmatically get svn revision description and author in c 但不需
  • 当 transactionManager 未命名为“transactionManager”时

    我正在尝试 Spring 3 0 2 RELEASE 和 JPA2 和 Hibernate 3 5 1 Final 令我不安的一件事是 spring 似乎只接受名为 transactionManager 的事务管理器 如果我不将其命名为 t
  • 如何在 MacOS X 上以编程方式打开控制台窗口

    我想知道 是否可以在 MacOS X 上以编程方式打开控制台窗口并将 IO 重定向到它 类似于AllocConsole GetStdHandle Windows 上的 API 我打算在 xxx app 应用程序中使用它 该应用程序默认情况下
  • gdb在检查内存时如何同时显示hex和ascii?

    使用 x 100c 时 输出显示 ascii 和十进制 0x111111 40 40 gdb如何同时显示ascii和hex like 0x111111 0x28 C 0x28 C 这种格式更好 0x111111 0x28 0x28 CC 您
  • WooCommerce 可变产品通知问题 - 请选择产品选项

    我正在建立一个电子商务网站 我在使用 WooCommerce 时遇到一些问题可变产品 添加到购物车 按钮适用于简单产品 但不适用于可变产品 它给出了一个 Please choose product options notice 我到处寻找并
  • 如何在.NET中为SmtpClient对象设置用户名和密码?

    我看到不同版本的构造函数 一种使用 web config 中的信息 一种指定主机 一种指定主机和端口 但是如何将用户名和密码设置为与 web config 不同的内容呢 我们遇到的问题是我们的内部 smtp 被一些高安全性客户端阻止 并且我
  • 电子标题栏“无拖动”和“拖动”不起作用

    我有一个 topleft红色标题栏包含多个 选项卡 按钮 应填充所有可用空间except a topright蓝色块 可以通过单击并拖动来移动 Electron 主窗口 topleft的红色背景 感谢 webkit app region d
  • 如何在集群外部访问/公开 kubernetes-dashboard 服务?

    我有以下服务 ubuntu master kubectl get services all namespaces NAMESPACE NAME CLUSTER IP EXTERNAL IP PORT S AGE default kubern
  • 堆上数组的初始化

    如何手动初始化堆上数组中的值 如果数组是局部变量 在堆栈中 则可以以非常优雅且简单的方式完成 如下所示 int myArray 3 1 2 3 不幸的是 下面的代码 int myArray new int 3 myArray 1 2 3 编
  • 如何注入模拟程序集以与 Moq 一起使用

    我的控制器中有一个方法 它将属性数据从当前执行的程序集返回到分部视图中 在这个例子中 我只是拉动标题 但我需要用它做更多的事情 控制器 var title var asm Assembly GetExecutingAssembly var
  • jQuery - 通过文本描述设置选择控件的选定值

    我有一个选择控件 在 JavaScript 变量中我有一个文本字符串 使用 jQuery 我想将选择控件的选定元素设置为具有我拥有的文本描述的项目 而不是我没有的值 我知道按值设置它非常简单 例如 my select val myVal 但
  • 获取那些有子子 ul 的 li

    如何获得那些li有孩子的ul 我想将 CSS 设置为那些li 我无法设置班级 因为li是动态打印的 当我如下设置 CSS 时 它设置了所有父级li来加 ul width 200px position relative ul li posit
  • 贝塞尔曲线和画布

    如何在画布上绘制贝塞尔曲线 我只有起点和终点 我想从起点到终点画一条线 我怎样才能做到这一点 您可以使用Path quadTo or Path cubicTo 为了那个原因 示例可以在 SDK 示例 FingerPaint 中找到 在你的情
  • backbone.js 解析 1 个元素(Id)

    对于骨干模型上的 id 来说 它只是id并且全部小写 如果我在服务器上的Id被调用怎么办UserId 在主干的解析方法中 我该如何更改UserId to id并对所有其他属性使用相同的名称 For eg window User Backbo
  • JTable 的页脚

    JTable 不支持显示包含每列聚合数据的页脚 受到建议解决方案的启发Oracle Suns 错误数据库 https bugs java com bugdatabase view bug bug id 4242646看起来很有希望 我从用滚
  • Python + 正则表达式:如何在Python中提取两个下划线之间的值?

    我正在尝试提取两个下划线之间的值 为此我写了这段代码 patient ids for file in files print file patient id re findall file patient ids append patien
  • componentWillReceiveProps 与 getDerivedStateFromProps

    componentWillReceiveProps 和 getDerivedStateFromProps 到底是什么对我来说是个微妙的问题 因为 我在使用 getDerivedStateFromProps 时遇到了一个问题 Componen