React源码阅读-10ReactBaseClasses这个文件是从Component导出的,PureComponentexport{Component,PureComponent};源代码+评论/***版权所有(c)Facebook,Inc.及其附属公司。**此源代码根据MIT许可证获得许可,该许可证位于此源树根目录中的*LICENSE文件中。*///生产环境使用,为了抛出错误信息importinvariantfrom'shared/invariant';//只有在开发环境才有效,使用console.warn(message);importlowPriorityWarningfrom'shared/lowPriorityWarning';//参数updater参数没有传入时,this.updater的值为ReactNoopUpdateQueue//可以忽略警告importReactNoopUpdateQueuefrom'./ReactNoopUpdateQueue';constemptyObject={};if(__DEV__){Object.freeze(emptyObject);//Object.freeze()方法可以冻结一个对象。无法再修改冻结的对象;当对象被冻结时,对象不能添加新的属性,不能删除已有的属性,也不能修改对象已有属性的可枚举性、可配置性和可写性。属性,并且不能修改现有属性的值。此外,对象的原型在冻结后无法修改。freeze()返回与传递的参数相同的对象}/***用于更新组件状态的基类助手。*///基类用于更新组件的状态。\//Component()本质上是一个类:functionComponent(props,context,updater){this.props=props;this.context=上下文;//如果一个组件有字符串引用,我们稍后会分配一个不同的对象。//如果组件ref有一个字符串引用,稍后会分配一个不同的对象this.refs=emptyObject;//我们初始化默认更新器,但真正的更新器由渲染器注入。//我们初始化了默认的updater程序,但是真正的updater会被渲染this.updater=updater||ReactNoopUpdateQueue;}Component.prototype.isReactComponent={};/***无法保证`this.state`会立即更新,因此*在调用此方法后访问`this.state`可能会返回旧值。**不能保证对setState的调用会同步运行,*因为它们最终可能会被一起批处理。您可以提供一个可选的*回调,当setState实际被调用*完成时将执行该回调。**当一个函数被提供给setState时,它??将在*未来的某个时间点被调用(不同步)。它将使用最新的*组件参数(state、props、context)调用。这些值可以不同于*fromthis。*因为你的函数可能在receiveProps之后但在*shouldComponentUpdate之前被调用,这个新的状态、道具和上下文还没有*分配给这个**@param{object|function}partialState下一个部分状态或函数*产生下一个部分状态与当前状态合并。*@param{?function}callback在状态更新后调用。*@final*@protected*/Component.prototype.setState=function(partialState,callback){invariant(typeofpartialState==='object'||typeofpartialState==='function'||partialState==null,'setState(...):采用状态变量的对象进行更新或返回状态变量对象的'+'函数。',);this.updater.enqueueSetState(this,partialState,callback,'setState');};/**强制性升级。仅当已知*我们不在DOM事务中时才应调用此方法**。**如果您知道*组件的状态已更改,但未调用`setState`。**这不会调用`shouldComponentUpdate`,但会调用*componentWillUpdate和componentDidUpdate。**@param{?function}callback更新完成后调用。*@final*@protected*/Component.prototype.forceUpdate=function(callback){this.updater.enqueueForceUpdate(this,callback,'forceUpdate');};/**弃用的API。这些API曾经存在于经典的React类之上,但由于*我们弃用它们,我们不会将它们移动到这个*现代基础层。相反,我们定义了一个getter,如果访问它会发出警告Deprecated*/if(__DEV__){constdeprecatedAPIs={isMounted:['isMounted','相反,请确保清理订阅和挂起的请求'+'componentWillUnmountto防止内存泄漏。',],replaceState:['replaceState','重构代码以改用setState(参见'+'https://github.com/facebook/react/issues/3236)。',],};constdefineDeprecationWarning=function(methodName,info){Object.defineProperty(Component.prototype,methodName,{get:function(){lowPriorityWarning(false,'%s(...)在纯JavaScriptReact类中被弃用。%s',信息[0],信息[1],);返回未定义;},});};for(constfnNameindeprecatedAPIs){if(deprecatedAPIs.hasOwnProperty(fnName)){defineDeprecationWarning(fnName,deprecatedAPIs[fnName]);}}}//虚组件函数ComponentDummy(){}ComponentDummy.prototype=Component.prototype;//具有默认浅层相等性检查的便利组件/***具有默认浅层相等性检查的sCU便利组件。*///PureComponent最好的情况是presentationComponentfunctionPureComponent(props,context,updater){this.props=props;this.context=上下文;//如果一个组件有字符串引用,我们稍后会分配一个不同的对象。this.refs=emptyObject;this.updater=更新程序||ReactNoopUpdateQueue;}constpureComponentPrototype=(PureComponent.prototype=newComponentDummy());//等于ComponentDummy的PureComponent.prototype实例只继承了Component的原型,不包括构造函数,以节省内存。pureComponentPrototype.constructor=PureComponent;//原型的构造函数等于自身,覆盖Component.prototype(Component)的构造函数//避免对这些方法进行额外的原型跳转//对于这些方法,请避免进行额外的原型跳转为了减少A原型链搜索Object.assign(pureComponentPrototype,Component.prototype);pureComponentPrototype.isPureReactComponent=true;//PureComponent自带一个简单的shouldComponentUpdate来优化更新机制export{Component,PureComponent};https://juejin.im/post/5b614d…https://segmentfault.com/a/11…
