Advertisement

react(27)——diff算法;key有什么作用,为什么遍历列表时,key最好不要用index;

阅读量:

1.虚拟DOM中key的作用

新数据

新数据

新虚拟DOM

新数据

如果虚拟DOM中发现了与新虚拟DOM一致的key,则对比其具体内容;
若具体内容无变化,则可直接采用之前的实际DOM;
当具体内容发生变化时,则需生成一个新的实际DOM,并将其取代页面中原有的实际DOM。

如果虚拟DOM中未发现与新虚拟DOM相同的key,则无需另设真实DOM即可渲染到页面

2.用index(数组的索引)作为key可能会引发的问题:

  1. 如果在操作过程中对数据进行逆序添加或删除等破坏顺序的操作,则可能导致不必要的DOM更新。这种情况下虽然不会影响用户体验(界面效果没问题),但性能优化空间有限。
  2. 如果在结构中存在输入类的DOM元素,则可能会导致界面显示异常。
  3. 即使避免了所有可能导致性能问题的操作(如逆序添加或删除),当仅用于展示列表时使用索引作为键也不会出现问题。

3.开发中如何选择key

通常建议使用每条数据的唯一标识来作为键。如果确定是简单的展示数据的话,也可以使用索引。

4.案例代码

复制代码
    <body>
    <div id="test"></div>
    
    <script type="text/babel">
      "use strict";
    
      class Person extends React.Component {
        state = {
          persons: [
            { id: 1, name: "小李", age: 18 },
            { id: 2, name: "小张", age: 20 },
          ],
        };
    
        addXiaoWang = () => {
          let { persons } = this.state;
          persons = [{ id: 3, name: "小王", age: 30 }, ...persons];
          this.setState({ persons });
        };
    
        render() {
          return (
            <div>
              <h2>展示人员信息</h2>
              <button onClick={this.addXiaoWang}>添加一个小王</button>
              <hr />
              <hr />
              <h3>使用index作为key</h3>
              <ul>
                {this.state.persons.map((personObj, index) => {
                  return (
                    <li key={index}>
                      {personObj.name}----{personObj.age}
                      <input type="text" />
                    </li>
                  );
                })}
              </ul>
              <hr />
              <h3>使用id作为key</h3>
              <ul>
                {this.state.persons.map((personObj) => {
                  return (
                    <li key={personObj.id}>
                      {personObj.name}----{personObj.age}
                      <input type="text" />
                    </li>
                  );
                })}
              </ul>
            </div>
          );
        }
      }
    
      ReactDOM.render(<Person />, document.getElementById("test"));
    </script>
      </body>

5.运行结果

初始界面

在这里插入图片描述

填写数据后界面

在这里插入图片描述

添加小王界面

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~