# React中的性能优化

# 1- 使用Fragment

  • Fragment 可以让你聚合一个子元素列表,并且不在DOM中增加额外节点
  • Fragment 看起来像空的 JSX 标签

# 举例说明

# 1.1 index.js

import React from 'react';
import ReactDOM from 'react-dom';
import Table from './components/Table';
let data = [
  {id:1,name:'louis',age:10},
  {id:2,name:'carry',age:10}
]
ReactDOM.render(<Table data={data} />, document.getElementById('root'));
1
2
3
4
5
6
7
8

# 1.2 Table.js

src\components\Table.js

import React from "react";
class Columns extends React.Component {
  render() {
    let data = this.props.data;  
    //Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>
    return (
        <><td>{data.id}</td><td>{data.name}</td><td>{data.age}</td></>
    )
  }
}
export default class Table extends React.Component {
  render() {
    return (
      <table>
        <thead>
          <tr>
            <td>ID</td>
            <td>Name</td>
            <td>Age</td>
          </tr>
        </thead>
        <tbody>
          {
            this.props.data.map((item, index) => (
             <tr key={index}>
              <Columns data={item} />
             </tr>
            ))
          }
        </tbody>
      </table>
    );
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

从上面代码中可以看出,Columns 组件中return出来的多个元素,如果没有外层的包裹,就会报错,这个时候就可以使用Fragment。

# 2- 在类组件中使用 PureComponent

当一个组件的props或state变更,React会将最新返回的元素与之前渲染的元素进行对比,以此决定是否有必要更新真实的 DOM,当它们不相同时 React 会更新该 DOM。

如果渲染的组件非常多时可以通过覆盖生命周期方法 shouldComponentUpdate 来进行优化。

shouldComponentUpdate 方法会在重新渲染前被触发。其默认实现是返回 true,如果组件不需要更新,可以在shouldComponentUpdate中返回 false 来跳过整个渲染过程。其包括该组件的 render 调用以及之后的操作。

# 举例说明

import React, { Component } from 'react';
import ReactDOM from 'react-dom';

class App extends Component {
  state = {counter:{number:0}}
  add = () => { 
    let oldState = this.state;
    let amount = parseInt(this.amount.value);
    let newState = {
      ...oldState,counter : amount===0 ? oldState.counter : {number : oldState.counter.number + amount}
    };
    this.setState(newState);
  }
  render(){
    console.log('App render');
    return (
      <div>
        <Counter counter={this.state.counter}/>
        <input ref={inst=>this.amount = inst}/>
        <button onClick={this.add}>+</button>
      </div>
    )
  }
}

class Counter extends React.Component{
  render(){
    console.log('Counter render');
    return (
      <p>{this.props.counter.number}</p>
    )
  }
}

ReactDOM.render(
  <App />,
  document.getElementById('root')
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

Counter 组件在接收的props不变的时候,我们并不希望它触发重新渲染。这个时候就可以使用 PureComponent 进行组件包裹。

// ... 
class Counter extends React.PureComponent {
  render(){
    console.log('Counter render');
    return (
      <p>{this.props.counter.number}</p>
    )
  }
}
// ... 
1
2
3
4
5
6
7
8
9
10
最后更新时间: 12/8/2022, 8:29:25 AM