我知道React优化的一个关键点是使用shouldComponentUpdate()
生命周期钩子来检查当前状态/道具与下一个/州道具。
如果我正在构建一个使用大多数功能组件的React应用程序,而不是基于类的有状态组件(可以访问生命周期钩子),我是否会放弃这种特殊优化?我可以在功能组件内部执行类似的检查吗?
答案 0 :(得分:10)
无状态组件是未来优化的候选组件,文档暗示它不需要详细说明:
在理想情况下,大多数组件都是无状态函数,因为将来我们还可以通过避免不必要的检查和内存分配来对这些组件进行性能优化。如果可能,这是推荐的模式。
目前,如果道具未更改,则无状态组件不会通过跳过渲染过程来优化性能。反应小组成员证实了这一点:
对于复杂组件,定义
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.app"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <uses-permission android:name="com.example.localmarket.permission.C2D_MESSAGE" /> <application android:name="com.example.app" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" <activity android:name=".SplashActivity" android:theme="@style/Theme.Transparent" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- GCM Receiver --> <receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <!--<category android:name="com.gnirt69.gcmexample" />--> </intent-filter> </receiver> <!-- GCM Receiver Service --> <service android:name=".GCMPushReceiverService" android:exported="false"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </service> <!-- GCM Registration Intent Service --> <service android:name=".GCMRegistrationIntentService" android:exported="false"> <intent-filter> <action android:name="com.google.android.gms.iid.InstanceID" /> </intent-filter> </service> </application> </manifest>
(例如纯渲染)通常会超出无状态组件的性能优势。文档中的句子暗示了我们计划的一些未来优化,因此我们不会为无状态功能组件分配内部实例(我们将只调用该函数)。我们也可能不会继续持有道具等。微小的优化。我们不讨论文档中的详细信息,因为优化还没有实际实现(无状态组件为这些优化打开了大门)。[...]
有关于您可以在函数上设置
shouldComponentUpdate
标记或允许它参与shouldUpdate生命周期的讨论,但目前尚未实现。目前,无状态函数不能是纯渲染。值得记住的是,有时人们滥用/过度使用纯渲染;它有时可能比再次运行渲染更昂贵,因为你重复遍历道具数组并可能做类似字符串比较的事情,这对于最终返回true然后继续渲染的组件来说只是额外的工作无论如何。 PureRender /
pureRender
实际上被认为是性能的逃避方法,并不一定应该盲目地应用于每个组件。
我从这次讨论中得出的结论是,在某些情况下,对于复杂组件,与无状态组件相比,通过实现shouldComponentUpdate
可以提高性能。另一方面,我会强烈考虑性能优势是否足以超过组件的额外复杂性和更大的占用空间。