自从我阅读React 0.14的发行说明(以及其他相关宣传)以来,这个问题一直在我的脑海中循环 - 我是React的忠实粉丝,我认为无状态组件(https://facebook.github. io/react/blog/2015/09/10/react-v0.14-rc1.html#stateless-function-components)是一个很好的想法,既方便编写这些组件,也用于在代码中表达这些组件的意图对于相同的道具数据,组件应该是一致的"纯粹".
现在的问题是:怎么会有可能发生反应,优化这些无国籍组件功能没有去整猪,并假设道具引用不仅是一成不变的,他们不应该在组件中进行操作,但也他们永远无法改变组件生命周期之外?之所以说"正规"的组件(也就是状态的组件-换句话说,通过整个生命周期中去的部件; componentWillMount,getInitialState,等..)有一个可选的"shouldComponentUpdate"功能是作出反应并不能假定所有的道具和状态引用完全不可变.在渲染组件之后,道具引用的某些属性可能会发生变化,因此相同的"道具"实例可能会在以后具有不同的内容.这就是为什么对使用完全不可变结构感到非常兴奋的原因以及为什么使用Om和React可以提供很好的性能提升; 因为那里使用的不可变结构保证任何对象的任何给定实例都不会被变异,所以shouldComponentUpdate可以对道具和状态执行非常便宜的引用相等性检查(http://swannodette.github.io/2013/12/17/the -future-of-javascript-mvcs /).
我一直试图找到更多有关这方面的信息,但没有任何地方.我无法想象可以在无状态组件周围进行哪些性能改进而不假设道具数据将由不可变类型组成.也许是对非不可变道具类型的一些初步分析,试图猜测"props"和"nextProps"是否代表相同的数据?
我只是想知道是否有人有任何内幕消息或其他一些有启发性的见解.如果React 确实开始要求道具类型"完全不可变"(允许引用相等比较以确认数据没有改变)那么我认为这将是一个很大的进步,但它也可能是一个很大的变化.
如果我理解正确的话,无状态功能组件将转换为常规组件。从源头来看:
function StatelessComponent(Component) {
}
StatelessComponent.prototype.render = function() {
var Component = ReactInstanceMap.get(this)._currentElement.type;
return Component(this.props, this.context, this.updater);
};
Run Code Online (Sandbox Code Playgroud)
当创建无状态组件的实例时,会分配一个新对象。这个新对象具有生命周期方法,例如componentWillMount和componentWillReceiveProps。我猜计划是根本不创建这些对象。不创建对象将避免不必要的分配。
实现生命周期方法需要进行许多检查,如下所示:
if (inst.componentWillUpdate) {
inst.componentWillUpdate(nextProps, nextState, nextContext);
}
Run Code Online (Sandbox Code Playgroud)
可以假设无状态功能组件没有这些生命周期方法。这可能是文档所指的内容,但我不确定。
删除了有关记忆的内容,这些内容没有回答问题或很好地解释了内容。
| 归档时间: |
|
| 查看次数: |
990 次 |
| 最近记录: |