zoukankan      html  css  js  c++  java
  • React 等框架使用 index 做 key 的问题

    React 等框架使用 index 做 key 的问题

    假如有两个树,一个是之前,一个是更变之后,我们抽象成两种可能性。

    1. 插入内容在最后
    2. 插入内容在最前

    关于插在中间,原理一样,就不阐述。

    使用 ul 代表树,并且使用了 index 做 key:

    <ul>
        <li key="{0}">00000</li>
        <li key="{1}">11111</li>
    </ul>
    

    先说原理

    diff 树的时候,是一句一句往下的,所以是:ul -> li -> li -> ... 这样的过程,注意是对比。

    插在最后

    则变成这样:

    <ul>
        <li key="{0}">00000</li>
        <li key="{1}">11111</li>
        <li key="{2}">22222</li>
    </ul>
    

    对比原来的,是这样的场景:

    1. ul 一样,不用重新搞
    2. li 的 key 是 0,一样,不用重新搞
    3. li 的 key 是 1,一样,不用重新搞
    4. 恩,多了一个 li,key 是 2,加上去

    简单理解来说,可以当做做了一步。

    插在最前面

    则应该变成这样:

    <ul>
        <li key="{0}">22222</li>
        <li key="{1}">00000</li>
        <li key="{2}">11111</li>
    </ul>
    

    对比原来的,是这样的场景:

    1. ul 一样,不用重新搞
    2. li 的 key 是 0,一样,不用重新搞
    3. li 的 key 是 1,一样,不用重新搞
    4. 恩,多了一个 li,key 是 2,加上去

    最后就可能出现这样的结果:

    <ul>
        <li key="{0}">00000</li>
        <li key="{1}">11111</li>
        <li key="{2}">11111</li>
    </ul>
    

    差不多就这个意思,所以还是使用独立标记,比如:id 这种靠谱。

  • 相关阅读:
    BZOJ 1907: 树的路径覆盖
    BZOJ 1295: [SCOI2009]最长距离
    BZOJ 1303: [CQOI2009]中位数图
    BZOJ 1468: Tree
    BZOJ 3784: 树上的路径
    BZOJ 2006: [NOI2010]超级钢琴
    BZOJ 1831: [AHOI2008]逆序对
    BZOJ 2521: [Shoi2010]最小生成树
    HDU 6685 Rikka with Coin (枚举 思维)
    HDU 6659 Acesrc and Good Numbers (数学 思维)
  • 原文地址:https://www.cnblogs.com/ZweiZhao/p/9820103.html
Copyright © 2011-2022 走看看