React setState 从状态中擦除 getter 和 setter

2024-02-25

我正在尝试实现一个函数,使对象中的某些属性依赖于其他一些属性,或者,computed。这个想法很大程度上受到computed在 vue.js 中 https://v2.vuejs.org/v2/api/#computed。该函数如下所示:

// given `destPairs` is like `{destProp: computer}`,
// this function sets `host[srcProp]` to `value`, and re-compute `host[destProp]` using `computer` when `host[srcProp]` changes
function defineComputed(host, srcProp, value, destPairs) {
  Object.defineProperty(host, srcProp, {
    set(newVal) {
      this.__my_store = this.__my_store || {};
      this.__my_store[srcProp] = newVal;
      for(const destProp in destPairs) {
        const computer = destPairs[destProp];
        this[destProp] = computer(newVal);
      }
    },
    get() {
      return this.__my_store[srcProp];
    }
  });
  host[srcProp] = value;
}

该功能似乎工作正常,除非我使用setState,此函数在状态中定义的所有 getter/setter 都被清除,因此我无法实现我的目标。这是a fiddle https://jsfiddle.net/JJPandari/k8oxwqek/,检查控制台,你可以看到有 getters/setters,但是如果你取消注释setState,吸气剂/吸气剂消失了。

How setState完全有效可能会回答这个问题,所以我尝试阅读它,但是步入setState我只看到类似的东西this.updater.enqueueSetState但不是真正改变状态的代码,所以我无法找到反应如何改变状态。


关于为什么

来自官方反应文档 https://reactjs.org/docs/react-component.html#setstate:

您可以选择将对象作为第一个参数传递给 setState() 而不是函数:setState(stateChange[, callback])这执行一个浅合并state的改变变成新的state

请注意强调shallow。这会消除您可能拥有的任何 getter 和 setter。请参阅 MDN 文档对象.分配 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign描述。

避免您所看到的情况的建议

我不知道为什么你的州需要 getter 和 setter。官方和公认的建议是避免直接改变状态并使用setState方法。

但是,如果您出于某种原因必须拥有它们, 我建议看看从Props获取DerivedState https://reactjs.org/docs/react-component.html#static-getderivedstatefromprops并使用 getter 创建一个对象来设置它。我的假设是您需要根据某些道具的更改来设置状态。

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

React setState 从状态中擦除 getter 和 setter 的相关文章

随机推荐

  • 调整画布图像大小

    我正在尝试上传图像并将它们放入不同大小的盒子中 为了让您了解该应用程序的功能 人们上传图像并将它们打印到海报上 例如 我们的海报尺寸为 8 x 10 活动区域 完整尺寸为 9 5 x 11 5 由于最小 DPI 为 100 我们通常将 8x
  • MTKView - 调整纹理大小以填充视图

    我对 Metal 很陌生 但正在努力遵循 Apple 的规定AVCam滤镜 https developer apple com documentation avfoundation cameras and media capture avc
  • React Native:如何正确输入嵌套导航器?

    情况 正如您可能知道的那样 我目前正在构建一个有声读物播放器 多么有创意 这是我第一个针对反应原生和打字稿的更大项目 在正确输入导航方面我有点挣扎 首先 这是一个快速概述 疑问 问题 感觉我使用了太多嵌套导航器 但由于我没有任何经验 所以很
  • Eclipse 无法运行,JVM 终止退出代码-13 [重复]

    这个问题在这里已经有答案了 大家好 无法运行 Eclipse JVM 终止 退出代码 13 我有一个问题 如图所示 当我在我的电脑中打开 Ecllipse 时出现 任何人遇到这个问题并有解决方案吗 请帮助我 提前致谢 看看这里 无法运行 E
  • Firebase 身份验证 Web:如何验证电子邮件地址

    我是 Firebase 网络身份验证新手 我设法使注册表单正常工作 但在发送电子邮件以验证用户的电子邮件地址时遇到问题 用户已正常创建并显示在我的控制台中 但未发送验证电子邮件 并且 我在 Chrome 中收到以下错误 未捕获的类型错误 无
  • 如何使用 pysftp 将字符串写入 ftp 文件?

    我有一个大的 xml 文件存储在变量中 我想使用 pysftp 将其直接写入 ftp 我相信我需要使用 pysftp putfo 这需要一个类似文件的对象 这是一个最小的例子 from io import StringIO from pys
  • Azure Functions - 使用 appsettings.json

    是否可以在 Azure Functions 中使用 appsettings json 文件 这里有环境变量的文档 https learn microsoft com en us azure azure functions functions
  • DOMDocument 简单的 GetElementsByTagName 不起作用?

    xml
  • Pandas groupby 和 qcut

    有没有一种方法可以构造 Pandas groupby 和 qcut 命令以返回具有嵌套图块的一列 具体来说 假设我有 2 组数据 并且我希望将 qcut 应用于每组 然后将输出返回到一列 这类似于允许 Partition by 的 MS S
  • 如何在部分回发时保留脚本块?

    这是我目前正在开发的网络应用程序中遇到的问题 因此 我没有用不相关的代码来混淆问题 而是在一个孤立的 简化的 Web 应用程序中重新创建了该问题 该应用程序仅演示了此问题 希望这有助于找到解决方案 我有一个网络用户控件 其内容如下
  • 从xcode中的其他目录导入文件

    我有以下目录结构 A B C D E F G 我有 A 目录 其下有 B 和 E 在 B 中 我有 C 和 D 文件 在 E 中我有 F 和 G 文件 我正在处理 G 文件 我需要导入 D 文件 我怎么做 如果我直接写 import G h
  • Rails 中的范围/named_scope 是什么?

    我最近开始实习了 我的雇主在 Rails 上使用 ruby 我经常遇到需要查找才能理解的新语法 我在谷歌上搜索了named scope的一个很好的解释 但到目前为止我发现的大部分是对它给予高度赞扬的博客文章 而不是直接的定义或介绍 ruby
  • 如何替换java字符串中的字符?

    我喜欢以有效的方式用相应的替换字符替换字符串中的某些字符 例如 String sourceCharacters String targetCharacters sdccSDCCzZ String result replaceChars Gr
  • 导入 scipy.stats 后 Ctrl-C 使 Python 崩溃

    我在 Win7 64 位上运行 64 位 Python 2 7 3 我可以通过这样做可靠地使 Python 解释器崩溃 gt gt gt from scipy import stats gt gt gt import time gt gt
  • Sitecore - 将网址中的“”重写为“-”,但仍然允许破折号作为合法的项目名称

    我读过六本关于在 Sitecore 中将空间重写为更友好的内容的指南 但所有这些指南都依赖于 Sitecore
  • 有什么方法可以防止水平滚动触发 OS X Lion Safari 上的向后滑动手势?

    我正在开发一个使用水平滚动的用户界面div元素 使用overflow scroll 我无法向左滚动 因为它会启动动画以返回历史 同样 当有一个网站可供前进时 我无法向右滚动 它在其他浏览器上运行良好 包括 OS X Lion 上的 Chro
  • 如何为使用 Powershell 的每个人设置文件夹的写入权限

    我试图与所有人共享一个文件夹并使用以下命令 但它不起作用 NET SHARE Movies C foldername GRANT Everyone FULL 运行此命令后 会出现一条消息 电影共享成功 但当我检查文件夹权限时 它不会显示相同
  • 如何排除积极回顾后发生的情况?

    假设我有以下内容markdown列出项目 x Example of a completed task x Example of a completed task x Example of a completed task 我有兴趣使用解析该
  • 导出 mupdf 和 android studio 0.5.4

    第一 我想在我的 Android 应用程序中查看 pdf 文件 我用谷歌搜索并分析并决定使用mupdf http www mupdf com 首先我使用本指南 http mupdf blogspot ru 2013 01 compile m
  • React setState 从状态中擦除 getter 和 setter

    我正在尝试实现一个函数 使对象中的某些属性依赖于其他一些属性 或者 computed 这个想法很大程度上受到computed在 vue js 中 https v2 vuejs org v2 api computed 该函数如下所示 give