首页 > 解决方案 > 扩展 React.Component 的组件中 Key 的效果

问题描述

我创建了一个非常基本的应用程序,并尝试了解 key 在扩展PureComponentComponent.

但是从我发现的情况来看,似乎在扩展 PureComponent 时,这就是我正在寻找的,使用 key 只是跳过更新 b 和 c,并且显然有性能提升。但是在扩展组件时,使用 key 似乎没有性能提升[我不知道如何衡量性能,在这里,在我看来,当方法被调用时,它的性能至少应该差一点更多代码已运行]。

这是我用于测试的代码:

import React, { Component, PureComponent } from "react";

class Child extends PureComponent {
  render() {
    return <div>{this.props.name}</div>;
  }

  componentDidMount() {
    console.log("mount", this.props.name);
  }

  componentDidUpdate() {
    console.log("update", this.props.name);
  }

  componentWillUnmount() {
    console.log("unmount", this.props.name);
  }
}

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      list: ["a", "b", "c"],
    };
  }

  render() {
    return (
      <div>
        {this.state.list.map(name => {
          return <Child key={name} name={name} />;
        })}
      </div>
    );
  }

  componentDidMount() {
      setTimeout(() => {
        this.setState({
            list: ["b", "c", "d"]
          });
      }, 1000)

  }
}

这是扩展 PureComponent 的日志:

unmount a
mount d

这是扩展组件的日志:

unmount a
update b
update c
mount d

所以我的问题是

与 Component extended 一起使用时React.Component,指定键的目的是什么?当我们在这种情况下使用 key 时,它可以有任何性能提升吗?

标签: reactjsreact-component

解决方案


Key 主要用于通过唯一 id 来标识 React 中的元素,因为可以优化渲染。正如您仅在示例中看到的那样,React 确定其他两个元素不需要更改。如果没有密钥,它将卸载所有元素,然后在未优化的屏幕上重新渲染它们。


推荐阅读