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;
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上流星&洒下星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值