在调用 setState() 之前直接改变状态可以吗?

2024-03-15

我正在使用轻量级 ORM 将我的 React 应用程序与外部服务连接...此包返回模型的对象并允许您直接对它们执行操作。虽然这真的很棒,但我很难弄清楚如何将这些对象包含在state并仍然遵循 React 的“永远不要直接修改状态”租户。

如果我有一个更新帐户名的组件,这样做可以接受吗?

interface IAppState {
  account: Account
}

class App extends React.Component<{}, IAppState> {
  constructor(props) {
    super(props);
    this.state = {
      account: new Account()
    }
  }

  //set the new name and update the external service
  public updateAccount = (newName: string)=>{
    account.name = newName; //REDFLAG!!!
    acc.update().then(()=>{
        this.setState({ account: this.state.account })
    })
  }

  //retrieve our account object from external service
  public componentDidMount() {
    const qParams = queryString.parse(window.location.search);
    Account.get(qParams.externalId).then((acc)=>{
        this.setState({account: acc})
    })
  }

  render() {
    return <NameEditor handleClick={this.updateAccount} account={a} />
    }
 }

我想我可以通过启动一个空白的 ORM 对象、复制属性、发送更新然后设置状态来避免改变状态,但这似乎是一个很大的痛苦。特别是因为这些 ORM 对象可以包含我想要的子 ORM 对象也希望能够修改。

我改变状态的方式是否高于“危险”或“不良形式”???

Update

做了一些阅读,这绝对看起来可能是一种不好的形式,并且可以使用react/addons... 但是,如果 ORM 调用对对象有副作用怎么办??例如,调用insert设置对象的外部 id 字段。


public updateAccount = (newName: string)=>{
    //account.name = newName; //REDFLAG!!!
    // You can use the below code to update name after it is updated
    // on server.
    // This will work because the object being passed here
    // will be merged with Component state.
    acc.update().then(()=>{
        this.setState({account: {name : newName}})
    })
}

不建议直接修改状态,因为 React 不会知道更改,也不会导致重新渲染。

所有的差异都发生在虚拟 DOM 上,并且 React 只更新浏览器 DOM 的更改属性。您可以阅读更多有关反应差异算法 https://facebook.github.io/react/docs/reconciliation.html here.

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

在调用 setState() 之前直接改变状态可以吗? 的相关文章

随机推荐

  • 检测点数组中的形状

    我有一系列的点 我想知道这个点数组是否代表圆形 正方形或三角形 我应该从哪里开始 我使用C 谢谢 乔恩 根据您的问题 解决此问题的一个好方法可能是使用霍夫变换 http en wikipedia org wiki Hough transfo
  • 如果第一个字符是 SQL 中的特定字符,如何删除它

    我目前有一张桌子Telephone它有如下条目 9073456789101 773456789101 0773456789101 我想要做的是只删除所有有 9 的条目开头的 9 但保留其他条目不变 任何帮助将不胜感激 虽然所有其他答案可能也
  • 仅使用代码保存networkD3桑基图

    我在 R 中创建了一个桑基图 使用networkD3包 我想使用代码保存为静态图像 而不是单击 导出 gt 另存为图像 我尝试过的当前代码 使用this https christophergandrud github io networkD
  • 您什么时候开始使用 HTML 5?

    所以 HTML 5 正如预期的那样被广泛宣传2022年准备就绪 http ishtml5readyyet com 这是一个很长的等待时间 而对准备情况的考验是 至少有两个浏览器能够完全通过 HTML 5 测试套件 显然 浏览器要通过此测试
  • Android 中的 Dom xml 解析

    我是android开发新手 我不知道如何从xml解析数据 所以请帮忙 这是我必须解析的 Xml
  • PerformFiltering() 期间发生 Android Realm 异常!

    当我使用 Spinner 时 该应用程序运行良好 但是 当我尝试使用 AutoComplete Textview 而不是 Spinner 时 我在其上键入内容时不会显示任何内容 任何帮助表示赞赏 Logcat 警告 08 23 14 01
  • 带有字符串的 String.raw 仅适用于不带括号的情况

    我知道您可以使用模板文字来提供方法的第一个参数 例如 const f x gt hello x f world returns hello world 所以我可以以某种方式理解为什么这段代码有效 String raw bla bla 但是
  • 创建无限循环

    我正在尝试创建一个无限循环 其中代码块将永远执行 我发现的所有循环文档都警告不要创建无限循环 但没有有效循环的示例 如果我有一段代码 puts foo puts bar sleep 300 我将如何永远运行这个块 loop do puts
  • Ruby on Rails,一种形式的两种模型

    我有两个非常相似的模型预处理和诊断 属于模型患者 class Pretreatment lt ActiveRecord Base belongs to patient attr accessible content end class Di
  • 设置 Asp:Chart 控件的动态大小

    我试图使我的图表宽度和高度动态化 但我无法让它工作 到目前为止我已经尝试过 我已将图表设置在 Asp Panel 内 并为面板提供了所需的百分比值
  • 在org-mode下,如何让代码块默认折叠?

    在 Emacs org mode 中 我如何指示 org mode 让 HTML 代码块默认折叠 那么当我打开一个 org 文件时它们会被折叠吗 org mode 提供了开箱即用的此功能 您可以通过自定义变量来全局设置它org hide b
  • ViewPagerIndicator中拦截触摸事件

    我正在使用杰克 沃顿的查看寻呼指示器 http viewpagerindicator com在我的 FragmentActivity 上 其中包含一个 viewpager 我在拦截 onTouch 事件时遇到困难 我知道 ViewPager
  • 如何向现有 Win32 C++ 项目添加 MFC 支持?

    我正在创建一个 C 应用程序 它使用 Qt 创建 GUI 但是 我需要使用依赖于 MFC 的第三方库 用于 CString 等 无论如何 是否可以将 MFC 添加到我的应用程序中以允许我使用这个库 或者我需要自己重写它 I saw 这个问题
  • C/C++ 中嵌套结构的尾随填充 - 有必要吗?

    这更多的是一个理论问题 我熟悉填充和尾随填充的工作原理 struct myStruct uint32 t x char p char c myStruct layout will compile to x 4 Bytes padding 4
  • Android 底部关闭全屏视图被分流到屏幕外

    我有一个屏幕 其底部工具栏使用以下样式对齐
  • 在 React 中导入新库时,Jest 遇到意外标记

    screenshot of error 1 screenshot of error 2 应用程序 test js import React from react import ReactDOM from react dom import A
  • C# 中数组的子集

    如果我有一个包含 12 个元素的数组 并且我想要一个新数组 其中删除第一个和第 12 个元素 例如 如果我的数组如下所示 a b c d e f g h i j k l 我想对其进行转换或创建一个如下所示的新数组 b c d e f g h
  • Java UDP中如何获取实际数据包大小`byte[]`数组

    这是我上一个问题的后续问题 Java UDP发送 接收数据包一一接收 https stackoverflow com questions 21866382 java udp send receive packet one by one 正如
  • Python SKLearn:逻辑回归概率

    我正在使用 Python SKLearn 模块来执行逻辑回归 我有一个因变量向量Y 从 M 类中的 1 个中获取值 和自变量矩阵X 有 N 个特征 我的代码是 LR LogisticRegression LR fit X np resize
  • 在调用 setState() 之前直接改变状态可以吗?

    我正在使用轻量级 ORM 将我的 React 应用程序与外部服务连接 此包返回模型的对象并允许您直接对它们执行操作 虽然这真的很棒 但我很难弄清楚如何将这些对象包含在state并仍然遵循 React 的 永远不要直接修改状态 租户 如果我有