如何阻止 Grommet 组件在 Safari 中循环

How to stop Grommet component from looping in Safari

我在页眉和页脚选项卡中使用索环创建了一个动态编辑器组件。在 safari 浏览器中查看网站时,当我更改字体大小等数据时,每个编辑器都会更改其位置。这仅在 safari 中是一个问题:它在 Chrome 和 Firefox on Macintosh、windows 和 Linux 中正常工作。 它也不会出现在 safari Big Sur 中,但会出现在以前的 mac 版本中,例如 Catalina 和 High Sierra。

这是我的代码和组件的屏幕截图:

{toPairs(footerTexts).map(
  ([key, text]) =>
    text !== undefined && (
      <Box
        id={text.id}
        key={text.id}
        style={{
          height: 132,
          width: 500,
          paddingTop: 20,
        }}
      >

尝试看看是否用实际的索环道具替换样式是否有效,并且在它之上,只是为了将其密封更多一点,看看添加 flex={false} 是否有效,如下所示:

{toPairs(footerTexts).map(
  ([key, text]) =>
    text !== undefined && (
      <Box
        id={text.id}
        key={text.id}
        height="132px"
        width="500px"
        pad={{top: "20px"}}
        flex={false}
      >

我通过添加一个排序器来修复它,这样排序器函数会在对象创建时对其进行排序,基本上,问题出在我更新状态的地方

{toPairs(headerTexts)
    .map(([, text]) => text)
    .sort(sorter)
    .map(
      (text) =>
        text !== undefined && (
            <Box
              key={text.id}
              style={{
                width: 500,
                marginTop: 20,
              }}
            >

更新状态会将更新的对象推到对象的末尾,因此现在更新的编辑器将转到对象的底部,这就是循环的原因。

const updateTextFooter = (text, key) => {
    if (key !== "") {
      setFooterTexts({
        ...footerTexts,
        [key]: {
          ...footerTexts[key],
          text,
        },
      });
    }
  };

为了解决这个问题,这是我添加的分拣机

const sorter = (a, b) => {
    const first = a.createdAt;
    const second = b.createdAt;
    let comparison = 0;
    if (first > second) {
      comparison = 1;
    } else if (first < second) {
      comparison = -1;
    }
    return comparison;
  };

谢谢大家的帮助,来到这里感觉很好。