React函数式组件的优化

Words
558
Reading
3 min
Listen
Play
5y

使用React做开发的时候,当组件数目多的时候,不可避免的就需要多组件做出优化,以提高性能。对于类式组件,非常简单,只需要继承PureComponent就可以了,剩余的事情React就会帮你做好。那么,自从有了Hooks之后,在开发中更为常用的函数式组件该怎样做优化呢?

image
Source: Pixabay

为了把问题说清楚,先通过一个简单的例子演示一下为什么需要优化。

首先,实现了一个如下图所示的函数式组件,其中包含了父子两个组件:

image

其源代码很简单:

import React from 'react'
import './index.css'

export default function Parent() {

    const [name, changeName] = React.useState("Jack")

    const change = () => {
        changeName('Luke')
    }

    console.log('render parent')

    return (
        <div className="parent">
            <h4>Parent component</h4>
            <h4>My name is: {name}</h4>
            <button onClick={change}>Change name</button>
            <hr/>
            <Child/>
        </div>
    )
}

const Child = () => {

    console.log('render child')

    return (
        <div className="child">
            <h4>Child component</h4>
        </div>
    )
}

接下来,当我们单击”Change name”这个按钮的时候,会更新父组件的状态,因此会导致父组件的重新渲染。而子组件中没有任何更新,因此是不需要进行重新渲染的。

可实际情况确是:当我们单击按钮的时候,子组件也会被重新渲染:
image

当页面中组件数目较多时,可以想象这对效率的影响。那么,怎样才能对React的函数式组件进行优化呢?答案是使用memo。其实它最早的名字不叫memo,而是叫做pure,只不过这很容易和函数式编程中的概念混淆,因此最终被改成了memo。

首先是要引入memo:
import React,{memo} from 'react'

然后用memo把组件包裹起来,说白了就是一个高阶函数:

export default memo(function Parent() {

...

})

const Child = memo(() => {

...

})

再单击”Change name”按钮,可以看到,子组件不会再被重新渲染了。

image

我想之所以叫做memo,就是把函数式组件的返回值给记住了,如果下次和这次的返回值一样,就不用渲染了。

参考资料:https://blog.logrocket.com/react-pure-components-functional/

React函数式组件的优化 | Ecency