【问题标题】:React rendering mapped elements with key [duplicate]用键反应渲染映射元素[重复]
【发布时间】:2023-03-25 10:02:02
【问题描述】:

我想渲染一个消息数组:

此代码有效:

render() {
    return this.props.messages.map((message) => (
        <Message
          key={message.id}
          message={message}
        />
    ));
}

但是如果我写这样的代码有什么区别:

render() {
    return this.props.messages.map((message) => (
        <Message
          key={generateRandomNum()}
          message={message}
        />
    ));
}

这里,key 在渲染时总是生成一个随机数。这两个版本都适用于我的应用程序。

另外,如果我有 1000 条消息,如果将其他消息添加到消息数组 - this.props.messages,是否会重新呈现所有消息? ---- 当component 收到新的props 时,始终重新呈现每条消息似乎对应用程序来说是一个沉重的负担。

【问题讨论】:

    标签: javascript reactjs dom render


    【解决方案1】:

    它会在第二种情况下重新渲染,因为 React 会检查组件的 id,然后检查它们的 state/props 是否发生了变化。所以你最好使用第一种情况,因为 id 是一样的。

    【讨论】:

      【解决方案2】:

      试试这个:

      render() {
          const messages = this.props.messages.map((message, index) => (
              <Message
                key={`message-${index}`}
                message={message}
              />
          ));
      
          return (<div>{messages}</div>);
      }
      

      React 组件必须呈现单个顶级元素(在本例中为 div)。使用map 索引还可以在数据更改时使您的键保持一致,以防止它重新渲染所有内容。

      【讨论】:

      • 不建议使用索引作为key medium.com/@robinpokorny/…
      • 正确,但这不仅仅使用index,它还在索引前面加上Message 组件唯一的标识符。避免使用索引的原因是为了防止多个组件具有相同的键,只要这是您在键前添加 message 的唯一位置,就可以了。
      • 不,要小心,真正的原因是数组可以被修改。从我链接的文章中:“让我解释一下,键是 React 用来识别 DOM 元素的唯一东西。如果你将一个项目推送到列表或删除中间的东西会发生什么?如果键与 React 假设之前相同DOM 元素代表与以前相同的组件。但这不再是真的。”。前置“message-”不会改变这个问题。
      • 啊...所以需要将 ID 添加到 props.messages 中的每条消息中,然后才能将它们作为道具传递以保持一致。每次运行 map 方法时唯一地生成一个 ID 将保证它们总是不同的,而这里的目标是确保只有新的不同。
      • 仅供参考(a)"The key only has to be unique among its siblings, not globally unique." 和(b)它仍然只是一个索引键,恰好前面有一个字符串。
      猜你喜欢
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2017-04-20
      • 2020-12-09
      • 2020-03-13
      相关资源
      最近更新 更多