返回

如何在React 16中从setState()返回null来优化组件更新

前端

在React 16中,为了防止不必要的DOM更新,允许你决定是否让.setState()来更新状态。在调用.setState()时返回null将不再触发更新。本文将通过重构一个mocktail(一种不含酒精的鸡尾酒)选择程序来探索它是如何工作的,即使我们选择相同的mocktail,也可以避免不必要的DOM更新。

背景

在React中,当组件的状态发生变化时,组件将重新渲染。然而,并非所有的状态变化都应该导致重新渲染。例如,如果你有一个包含一组复选框的组件,当用户点击一个复选框时,你可能只想更新该复选框的状态,而不想重新渲染整个组件。

为了防止不必要的重新渲染,React 16引入了.setState()方法。.setState()方法允许你更新组件的状态,而无需触发重新渲染。要做到这一点,只需在调用.setState()时返回null即可。

示例

为了演示如何使用.setState()来防止不必要的重新渲染,我们将重构一个mocktail选择程序。这个程序允许用户从一系列mocktail中进行选择。当用户选择一个mocktail时,程序将显示该mocktail的详细信息。

在重构之前,我们的程序如下所示:

class MocktailSelector extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      selectedMocktail: null
    };
  }

  handleMocktailSelect = (mocktail) => {
    this.setState({
      selectedMocktail: mocktail
    });
  };

  render() {
    const { mocktails } = this.props;
    const { selectedMocktail } = this.state;

    return (
      <div>
        <h1>Mocktail Selector</h1>
        <ul>
          {mocktails.map((mocktail) => (
            <li key={mocktail.id}>
              <button onClick={() => this.handleMocktailSelect(mocktail)}>{mocktail.name}</button>
            </li>
          ))}
        </ul>

        {selectedMocktail && (
          <div>
            <h2>{selectedMocktail.name}</h2>
            <p>{selectedMocktail.description}</p>
          </div>
        )}
      </div>
    );
  }
}

在这个程序中,当用户点击一个mocktail时,handleMocktailSelect()方法被调用。这个方法更新组件的状态,将selectedMocktail设置为选定的mocktail。这会导致组件重新渲染,即使选定的mocktail没有改变。

为了防止不必要的重新渲染,我们可以修改handleMocktailSelect()方法,使其在选定的mocktail没有改变时返回null。

handleMocktailSelect = (mocktail) => {
  const { selectedMocktail } = this.state;

  if (selectedMocktail === mocktail) {
    return null;
  }

  this.setState({
    selectedMocktail: mocktail
  });
};

现在,当用户点击一个mocktail时,handleMocktailSelect()方法会检查选定的mocktail是否与选定的mocktail相同。如果相同,则该方法将返回null,这将防止组件重新渲染。

结论

.setState()方法允许你更新组件的状态,而无需触发重新渲染。这可以防止不必要的DOM更新,并提高组件的性能。在本文中,我们演示了如何使用.setState()来防止不必要的重新渲染。