diffing算法以及key值的作用

Posted 老张在线敲代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了diffing算法以及key值的作用相关的知识,希望对你有一定的参考价值。

在react/vue中key有什么作用?内部原理是什么?

一.虚拟dom中key的作用

简单的来说key就是虚拟dom对象中的标识,在更新显示时key有很重要的作用

原理:当状态中的数据发生改变的时候,react会根据【新数据】生成新的虚拟dom,随后react会将旧虚拟dom与新虚拟dom进行diff对比

二.对比规则的俩种场景:

1.旧的虚拟dom中找到了跟新的虚拟dom中一样的key:

(1)如果虚拟dom中的内容没变,则直接使用之前的真实dom
(2)如果虚拟dom中内容发生改变了,则生成新的真实dom,随后替换掉页面
中之前的真实dom

2.旧的虚拟dom中没有找到与新的虚拟dom一样的key 根据数据创建新的虚拟dom,随后渲染生成到页面上

三.用index作为key值会引发的问题:

1.如果数据进行逆序添加等破环顺序的操作会产生没有必要的真实dom更新,虽然页面效果没问题但是效率降低

2.如果结构中还包含输入类的dom,则会产生错误的dom更新

3.如果只是用于渲染列表,页面展示key使用index是没有任何问题的

四.下面是一个小栗子:

import React, { Component } from "react";

class Diff extends Component {
  state = {
    person: [
      { id: 1, name: "小张", age: 22 },
      { id: 2, name: "小袁", age: 21 },
    ],
  };
  add = () => {
    const { person } = this.state;
    if (person.length === 2) {
      var p = { id: person.length + 1, name: "小王", age: "19" };
    } else {
      return false;
    }
    this.setState({
      person: [p, ...person],
    });
  };
  render() {
    return (
      <div>
        <h2>人员信息展示:</h2>
        <button onClick={this.add}>添加一个小王</button>
        <ul>
          {this.state.person.map((item) => {
            return (
              <li key={item.id}>
                {item.name}---{item.age}
              </li>
            );
          })}
        </ul>
      </div>
    );
  }
}

export default Diff;

以上是关于diffing算法以及key值的作用的主要内容,如果未能解决你的问题,请参考以下文章

React的diffing算法(面试题)

React的diffing算法(面试题)

React组件的生命周期 - 虚拟DOM - DOM Diffing算法

Vue中的v-for中的key值的作用

DOM的diffing算法

React diffing算法的简化版实现