一文搞定react性能优化(代码方向)

今天写一篇关于react性能优化的文章啦。我们知道react有个痛点,就是会频繁触发不必要的render渲染,只要触发了setState改变state,就会可能导致多次不必要的render(console.log就可以发现)。那么他本身也提供了对应的api方法来解决这个问题。
废话不多说,开搞,我将组件分为两个情况:
一、class组件
类组件有两种方法来解决:一个是生命周期中的shouldComponentUpdate方法
shouldComponentUpdate(nextProps, nextState)
通过下一个props和下一个state,分别对比当前的props和state,判断值是否相同,返回一个布尔值来确定是否更新组件,true时候更新组件重新render,false不更新。
例如:

shouldComponentUpdate(nextProps, nextState) {
return this.state.currentNumber !== nextState.currentNumber 
}

另一个更快的方法是使用React.PureComponent组件(推荐),它和React.Component普通组件没啥区别,但能自动使用shouldComponentUpdate做对比。相当于简单写法,可以这么理解~~~
但是这两个种都只能做浅对比,不完美,就是如果state的一个值是object或者arrary时候对比就有困难啦。那就放着吧 好好写你的业务代码去吧,类组件上已经够了
二、Hook组件
父组件用useEffect的第二个参数来控制组件是否需要更新。写法:

useEffect(()=>{
 // 只要参数变化我就变化做该做的事
  function(){
    console.log("敌动我不动,敌动我就跟着动")
 }
},[ 我是一个参数])

这里主要介绍子组件(因为通常父组件更新,它的子组件也会跟着更新,不讲武德):
这个就强大啦,react的亲手制造升级的儿子,它有三个方法用来做优化分别是:

 memo  //和PureComponent一样,做简单数据类型比较,比如是字符串、数字、布尔值
useMemo  //都说了它是升级的儿子,所以可以用来比较复杂数据类型,Object、Arrary
useCallback  //升级版,那肯定连传递函数时候是否要更新组件可以控制啦

使用方法:
memo给子组件包裹

// 子组件
const ChildComp = () => {
  console.log('ChildComp...');
  return (<div>ChildComp...</div>);
};

const MemoChildComp = memo(ChildComp);

useMemo给复杂数据类型使用

import React, { memo, useState } from 'react';

// 子组件
const ChildComp = (info:{info:{name: string, age: number}}) => {
  console.log('ChildComp...');
  return (<div>ChildComp...</div>);
};

const MemoChildComp = memo(ChildComp);

// 父组件
const Parent = () => {
  const [count, setCount] = useState(0);
  const [info] = useState({ name:'名字', age:35 });

  return (
    <div className="App">
      <div>hello world {count}</div>
      <div onClick={() => { setCount(count => count + 1); }}>点击增加</div>
      <MemoChildComp info={useMemo(()=> info,[info])}/>
    </div>
  );
};

export default Parent;

useCallback给传递函数时候使用

import React, { memo, useCallback, useMemo, useState } from 'react';

// 子组件
const ChildComp = (props) => {
  console.log('ChildComp...');
  return (<div>ChildComp...</div>);
};

const MemoChildComp = memo(ChildComp);

// 父组件
const Parent = () => {
  const [count, setCount] = useState(0);
  const [name] = useState('jack');
  const [age] = useState(11);
  const info = useMemo(() => ({ name, age }), [name, age]);
  const changeName = useCallback(() => {
    console.log('输出名称...');
  }, []);

  return (
    <div className="App">
      <div>hello world {count}</div>
      <div onClick={() => { setCount(count => count + 1); }}>点击增加</div>
      <MemoChildComp info={info} changeName={changeName}/>
    </div>
  );
};

export default Parent;

如上,我们就可以非常简洁明了地控制组件的渲染次数,保证了react性能造成不必要的多次渲染。

这里补充一个应用场景:
[hooks解决组件频繁刷新的问题]https://www.jianshu.com/p/822e061d960f

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这篇文章主要介绍了浅谈react性能优化的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过...
    880d91446f17阅读 3,589评论 0 3
  • 本文主要是针对性能优化做介绍,对应的React本身性能就比较不错!要介绍的点如下: 单个React组件的性能优化 ...
    井润阅读 346评论 0 0
  • 前言 关于React性能优化,有各种方法。今天,我们主要使用两个官方推出的组件模式来进行切入,优化点主要基于防止组...
    南宫__阅读 1,155评论 0 9
  • React对重排和重绘的提高雅虎性能优化比较重要的点,老司机自行忽略。如下图,HTML被浏览器解析为DOM树,CS...
    HT_Jonson阅读 1,707评论 0 49
  • 初学者对React可能满怀期待,觉得React可能完爆其它一切框架,甚至不切实际地认为React可能连原生的渲染都...
    梭子蟹_3984阅读 605评论 0 1