react性能优化措施有:
1.路由的懒加载,减少首屏渲染时间:
如果不对路由进行懒加载,那么,加载App.js组件时,会对所有路由对应的组件进行加载;
路由懒加载的作用:加载App.js组件时,不会对所有路由对应的组件进行加载,只会当前切换到 哪个组件,就加载哪个组件,减少了首屏加载时间,默认路径是'/',所以默认会切换到‘/’对应的组件;
路由懒加载的方法是:
1.React.lazy()+<Suspense fallback={}>;
2.const Home = React.lazy(() => import('./containers/Home'));
3. <Provider store={store}>
<Suspense fallback={<div>loading</div>}>
<Router>
<div>
<Switch>
<Route path='/home' component={props=><Home {...props}/>}/>
</Switch>
</div>
</Router>
</Suspense>
</Provider>
路由懒加载是直接将组件单独打包成一个分片,然后路由切换的时候去动态加载这个分片;
2.使用shouldComponentUpdate来优化子项目,缺点是每个组件都写这个函数很累,可以跳到第三项,所有的类组件都继承PureComponent,所有的函数组件都使用memo包裹:
背景:setState()之后,函数组件会重新调用/类组件会重新调用render方法,他们return的组件都会重新调用,dom-diff方法会比较不同的部分,不同的部分更改,相同的部分不更改,但是return的所有组件都是被调用的;
但是每一个类组件里,你都去写shouldComponentUpdate函数是一个很累的事情,同时,shouldComponentUpdate只能在类组件里写,不能在函数式组件里写;
不要在shouldComponentUpdate里使用深比较,性能差;
3.React.PureComponent使用在类组件,做性能优化;
作用是:内部自动做了shouldComponentUpdate(){...},会比较传入的属性有没有发生变化,和组件的state有没有发生变化,进行浅层比较,如果发生变化就重新渲染,如果不发生变化,就不会重新渲染;
使用方法:class A extends React.PureComponent{...}
4.React.memo(函数组件名)使用在函数组件,做性能优化;
作用是:只要父组件传入子函数组件的属性不发生变化,子函数组件就不会重新调用,跟PureComponent的作用一样,也是浅比较;
使用方法:const MemoFunctionTitle=React.memo(函数组件名);
React.PureComponent的特点是浅比较,浅比较只比较值,深比较比较引用地址+值,深比较好一点,但是深比较比较耗性能,要注意权衡;
建议:所有的类组件都继承PureComponent,所有的函数组件都使用memo包裹;他们都是使用了浅比较,会自动比较最新传入的props和组件内最新的状态有没有发生改变;
5.immer做不可变数据;
6.useCallBack:包裹传入子组件的方法;
7.shallowEqual:会做浅比较,决定是否重新渲染;
8.骨架屏等;