代码之家  ›  专栏  ›  技术社区  ›  A Mehmeto

我应该使用uuid()在React组件内动态提供id吗

  •  0
  • A Mehmeto  · 技术社区  · 3 年前

    众所周知,由于性能问题,我们不应该使用数组的索引作为React组件键,因为修改它会无故重新渲染太多组件。

    查阅 https://reactjs.org/docs/reconciliation.html#recursing-on-children

    所以我在想,为什么不在映射时使用UUID呢:

    import { v4 as uuidv4 } from 'uuid';
    
    function ListItem(props) {
      return <li key={props.id}>{props.value}</li>;
    }
    
    function MyList(props) {
      const listItems = props.items.map(item =>
        <ListItem key={uuidv4()} value={item.value} />
      );
      return (
        <ul>
          {listItems}
        </ul>
      );
    }
    
    const items = [{ value: 'item 1' }, { value: 'item 2' }, { value: 'item 3' }];
    
    ReactDOM.render(
      <MyList items={items} />,
      document.getElementById('root')
    );
    

    但我认为这是同样的问题,因为每次MyList组件重新发布时,它都会为每个项目重新生成一个新的密钥,然后这种技术就没有任何好处了。

    因此,医生建议: “如果不是这样,您可以向模型中添加一个新的ID属性,或者对内容的某些部分进行哈希处理以生成密钥。密钥只需要在其兄弟项中是唯一的,而不是全局唯一的。” 因为哈希每次都是相同的id,前提是我们不添加盐。

    最后,我对这个问题有正确的理解吗?

    1 回复  |  直到 3 年前
        1
  •  2
  •   Slava Knyazev    3 年前

    You must generate your keys based on your data. 每次你打电话 uuidv4() 它将生成一个新的随机值,该值将与以前的渲染不一致。

    你的话省略了前面的一句重要话:

    “如果不是这样,你可以在模型中添加一个新的ID属性,或者对内容的某些部分进行哈希处理以生成密钥。密钥只需要是唯一的 [且稳定] 在其兄弟姐妹中,并非全球独一无二。"

    来自测试版文档:

    同样,不要动态生成密钥,例如使用key={Math.random()} (生成的uuid也是如此) 。这将导致键在渲染之间永远不会匹配,导致每次都重新创建所有组件和DOM。这不仅速度慢,而且还会丢失列表项中的任何用户输入。相反,使用基于数据的稳定ID。

    推荐文章