【问题标题】:Safari renders element of array in different order on each renderSafari 在每次渲染时以不同的顺序渲染数组元素
【发布时间】:2020-12-02 15:18:33
【问题描述】:

我有以下代码:

Object.values(data).map((user) => {
  <div>
    <User key={user.id} user={user} />
  <div>
})

并且用户可以通过 UI 添加新用户,这些新用户会添加到 data 对象并因此触发渲染。

它在除 Safari 之外的所有浏览器(Chrome、Edge、IE)上都运行良好。 (版本 13.1.2) 在 Safari 上,几乎每次重新呈现该用户列表都会更改这些用户在 UI 中的显示顺序。

为什么会这样?

【问题讨论】:

    标签: reactjs safari


    【解决方案1】:

    没有 JavaScript 标准规定从对象获取键或值应按特定顺序进行:

    根据mdnObject.values

    Object.values() 方法返回给定对象自己的可枚举属性值的数组,其顺序与 for...in 循环提供的顺序相同

    for...in link 后面写着:

    for...in 循环以任意顺序迭代对象的属性(请参阅 delete 运算符以了解更多关于为什么不能依赖迭代的看似有序性,至少在跨浏览器设置中)。

    之所以不能保证按特定顺序是因为 IE,但由于 Safari 是新的 IE,它已经接管了不可预测的火炬。

    如果项目顺序很重要,您应该将它们存储在数组、Set 或 Map 中。

    【讨论】:

    • Object.values 在其他浏览器中维护顺序是否有原因? (我提到的那些正在工作)
    • @Gambit2007 它在大多数情况下都会“工作”,但浏览器创建者没有义务以特定顺序从对象中获取键、值或条目。我尝试使用 safari 13.1.1 并且每次都以相同的顺序获得条目。不确定是否可以将其报告为错误,因为没有规范说明它需要按特定顺序排列。
    • 有趣.. 好的,我会尝试使用其他东西!最后一个问题 - 为什么说“Safari 是新的 IE”?
    • 不能代表@HMR,但我会​​尽力而为:就像过去的IE一样,今天的Safari在标准方面拒绝与其他浏览器保持一致;它处理 CSS 和 JS 的方式是高度不可预测的,在其他浏览器上进行测试往往会给出不同的结果;苹果的一些做法似乎纯粹是anti-competition, anti-webanti-developers。在今天部署应用程序时,Safari 往往是开发人员最大的恐惧。
    • @Gambit2007 是的,没错。我认为 MDN 需要更新文档。
    猜你喜欢
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 2022-11-08
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多