当前位置: 首页 > 知识库问答 >
问题:

通过赋值设置状态

黄成荫
2023-03-14

在react中,是否有人希望通过赋值而不是调用setState(…)来设置变量的状态的原因

例子:

// accessing state var directly
this.state.myVar = 'changed state'
// instead of calling setState
this.setState({myVar: 'changed state'})

在我看来,这似乎是一种反模式。但也许有一个很好的解释为什么有时候这是必要的?

共有2个答案

潘修为
2023-03-14

在这种情况下,直接设置(改变)状态将起作用:this.state.myVar='changed state'
但是,根据以下说明,应该避免:

切勿直接对该状态进行变异,因为之后调用setState()可能会替换您进行的变异。将此.state视为是不可变的。

改变状态的主要问题是它会阻止某些React生命周期方法工作。例如,React的shouldComponentUpdate()方法通常用于在处理大量组件时加速应用程序。如果状态已更新,该方法允许您跳过重新渲染组件:

// Return false if you want to skip the `render()` method
shouldComponentUpdate: function(nextProps, nextState) {
  return this.state.myVar === nextState.myVar;
}

如果您正在改变状态,上述操作将不起作用this.state.myVarnextState.myVar引用是相同的,因此上述引用将始终返回true

臧正平
2023-03-14

这是必要的,因为React必须知道这个状态是否发生了变异。没有肮脏的登记手续。调用this.setState时,状态对象被认为是脏的,并且不会与以前的状态进行进一步比较。这个答案可能有助于更详细地解释这一点:为什么React的虚拟DOM概念被认为比脏模型检查更有效?

 类似资料:
  • 通过函数构造函数创建变量时它们似乎被声明为VAL。由于VAL不能重新赋值(出于某些原因,我需要这样做),我想知道是否有办法在函数之前的一行代码中将变量声明为var,然后通过函数赋值。 请记住,我昨天才开始学习静态编程语言。我对所有替代方案都持开放态度。 公共趣味单打(enemyhealth:Int,enemyattack:Int,enemyname:String) 当我尝试重新分配敌人的健康时,我

  • 我在表中为某些列设置了默认值。例如,create_time我已经设置了CURRENT_TIMESTAMP。当我通过JPA插入一个对象时,我没有得到该列的默认值。是否有任何命令可以执行此操作?

  • 问题内容: 我无法使用Java反射将值设置为字段。字段数据类型为。但是,如果数据类型是基本类型,即I,我就可以设置该值。 这是带有类型和原始类型的简单VO : 这是我的java反射代码: 输出为: 我试图设定与价值,,等什么作品。 问题答案: 根据此,被调用以设置一个字段,该字段是用原语类型的值的参考布尔类型。在非反射等效项中,编译器会将原始类型’true’转换(或装箱)为引用类型,以便其类型检查

  • 问题内容: 是否可以通过if条件执行多个分配,如以下代码? 问题答案: 否。根据规范,在if语句的开头仅允许一个“简单语句” 。 该建议的方法是这可能会返回一个错误,所以我想你想是多重考验:

  • 主要内容:实例,实例,实例,实例关键词:阻塞赋值,非阻塞赋值,并行 过程性赋值是在 initial 或 always 语句块里的赋值,赋值对象是寄存器、整数、实数等类型。 这些变量在被赋值后,其值将保持不变,直到重新被赋予新值。 连续性赋值总是处于激活状态,任何操作数的改变都会影响表达式的结果;过程赋值只有在语句执行的时候,才会起作用。这是连续性赋值与过程性赋值的区别。 Verilog 过程赋值包括 2 种语句:阻塞赋值与非阻塞

  • 问题内容: 我想通过值而不是索引在JComboBox中设置选定的索引。怎么做?例 好的,我已经稍微修改了我的问题。我忘了我在JComboBox中有一个自定义项目,这使其变得更加困难。我不能做setSelectedItem,因为我在每个项目中都有一个ComboItem。因此,我该如何完成呢? 问题答案: 。您只需阅读javadoc即可找到它。 编辑:由于您更改了问题,我将更改答案。 如果要选择带有“