当前位置: 首页 > 面试题库 >

在没有shouldComponentUpdate的情况下,React 0.14的无状态组件将如何提高性能?

井学
2023-03-14
问题内容

自从我阅读了有关React
0.14的发行说明(以及其他相关炒作)以来,这个问题一直困扰着我-我是React的忠实拥护者,我认为无状态组件(https://facebook.github。 io / react / blog /
2015/09/10 / react-v0.14-rc1.html#stateless-function-
components
)是一个极好的主意,既便于编写此类组件,又可以在代码中表达这些意图就相同道具数据的一致渲染而言,组件应该是“纯”的。

现在的问题是:怎么会有可能发生反应,优化这些无国籍组件功能没有去整猪,并假设道具引用这不仅表现在他们不应该在组件内操纵一成不变的,但 也是
他们永远无法改变在组件生命周期之外?“常规”组件(又称有状态组件,即贯穿整个生命周期的组件;
componentWillMount,getInitialState等)具有可选的“ shouldComponentUpdate”功能的原因是,React
不会
假设所有道具和状态引用都是完全不变的。渲染组件后,道具引用的某些属性可能会更改,因此相同的“道具”实例稍后可能会具有不同的内容。这部分是为什么对完全不可变结构的使用感到非常兴奋,以及为什么有人说将Om与React一起使用可以带来巨大的性能提升的原因;因为在那里使用的不可变结构保证了任何对象的任何给定实例都不会被突变,所以ComponentUpdate应该可以对props和state执行非常便宜的引用相等性检查(http://swannodette.github.io/2013/12/17/the
-future-of-javascript-mvcs /)。

我一直在尝试寻找有关此的更多信息,但是却一无所获。我无法设想什么性能的提升 可以 进行围绕无状态组件
假定该道具的数据将包括不变类型的..也许非一成不变的道具类型的一些初步的分析,试图猜测是否“道具”和“nextProps”代表相同的数据?

我只是想知道是否有人对此有任何内部信息或其他启发性的见解。如果React 确实
开始要求props类型是“完全不可变的”(允许进行引用相等性比较以确认数据没有更改),那么我认为这将是向前迈出的一大步,但这也可能是一个巨大的变化。


问题答案:

避免不必要的分配

如果我理解正确,无状态功能组件将转换为常规组件。从来源:

function StatelessComponent(Component) {
}
StatelessComponent.prototype.render = function() {
  var Component = ReactInstanceMap.get(this)._currentElement.type;
  return Component(this.props, this.context, this.updater);
};

创建无状态组件的实例时,将分配一个新对象。这个新对象具有生命周期方法,例如componentWillMountcomponentWillReceiveProps。我猜想该计划根本
创建这些对象。 不创建对象将避免不必要的分配。

避免不必要的检查

实现生命周期方法需要进行如下检查:

if (inst.componentWillUpdate) {
  inst.componentWillUpdate(nextProps, nextState, nextContext);
}

可以假定无状态功能组件没有这些生命周期方法。那可能就是文档所指的,但我不确定。

编辑

删除了记忆中的内容,这些内容无法回答问题或无法很好地解释内容。



 类似资料:
  • 所以我有一个扩展JPanel的“GameCourt”类。这个类覆盖paintComponent代码,以便绘制一些组件(迷宫、字符和一些硬币)。这个JPanel是扩展JLayeredPane的类的一部分,它有两层,一层用于绘制背景(使用扩展JPanel的BackgroundPanel类),另一层用于绘制我想要的所有元素(一个重置按钮,一个标签..) 所以我想要的是JLayeredPane中背景上方的

  • 第二:这不是重复的。如在没有HTTPS的情况下,如何使用Javascript通过HTTP安全地发送密码?描述其他方法的问题,但不是具体的,当加密用于教育目的时,可以作为次要的东西。 作为课外一些Internet安全研究的一部分,我想创建一个使用用户配置文件并允许用户通过密码登录的网站。该网站不采取信用卡信息,不会持有敏感的个人信息,并不会,一般情况下,是一个值得去窃取个人信息的网站。为了这个问题的

  • 问题内容: 我想在Centos7上使用shell脚本自动生成一对ssh密钥,我已经尝试过 所有这些命令都不起作用,仅输入一个“ enter”,然后在“ Enter passphrase(空无密码)为空”时停止shell脚本,我只想知道如何在shell中连续模拟多个“ enter”。 非常感谢任何人的帮助! 问题答案: 只需 使用一个空白通 使用标志: 要覆盖密钥文件 (在此示例中): 从 手册 页

  • 我刚刚意识到,在Lollipop下面的Android版本上,不可能通过appcompat改变状态栏的颜色。我目前正在运行Android Kitkat 4.4.2,并收到了一个应用程序的更新,以下是截图 我的问题是,他们是如何在运行比Lollipop低版本的设备上不使用appcompat而改变状态栏颜色的? 怎么可能改变颜色?

  • 我在React组件中添加了生命周期方法 我的问题是,即使nextProps和nextState与当前props和状态完全相同,也会在组件上调用此方法。当我比较nextProps和this.props的console.log语句时,它们完全相同。国家也是如此。 那么为什么应该调用ComponentUpdate呢? 每当我更改父组件的状态时,就会调用它。但是没有任何道具或状态在实际组件上发生变化。那么

  • 问题内容: 我想知道在不提示输入密码的情况下执行数据库mysqldump的命令。 原因:我想运行一个cron作业,该作业每天执行一次mysqldump数据库的转储。因此,出现提示时,我将无法插入密码。 我该如何解决? 问题答案: 由于您正在使用Ubuntu,因此您所要做的只是在主目录中添加一个文件,这将禁用mysqldump密码提示。这是通过创建文件来完成的(权限需要为600)。 将此添加到.my