如何在条件渲染中只渲染一次元素?

Posted

技术标签:

【中文标题】如何在条件渲染中只渲染一次元素?【英文标题】:How to render element only once in conditional rendering? 【发布时间】:2021-11-20 05:05:15 【问题描述】:
<ol className=classes.ol>
      props.data.definitions
        .sort((a, b) => a.partOfSpeech.localeCompare(b.partOfSpeech))
        .map((definition, index) => 
          return (
            <>
              <h3>definition.partOfSpeech</h3>
              <li key=index className=classes.list>
                definition.definition.charAt(0).toUpperCase() +
                  definition.definition.slice(1)" "
                (definition.partOfSpeech)
              </li>
            </>
          );
        )
    </ol>

上面是按字母顺序对“partofSpeech”进行排序并输出带有单词定义的词性的代码。如果词性相同,我试图只显示一次词性。当前输出如下所示。

是否可以在顶部仅显示一次词性并根据该词性呈现列表?我尝试使用 reduce 并比较对象的 partOfSpeech 仍然无法达到我想要的效果。

我想要达到的目标:

【问题讨论】:

您可以使用 _.groupBy(props.data.definitions, def => def.partofSpeech) 对基于“partofSpeech”的数据进行分组; "groupBy" 是一个 lodash 函数,否则你也可以使用 reduce 来分组。您可以查看以下答案:***.com/questions/40774697/… 【参考方案1】:

是的,这是可能的,但您必须更改您尝试映射的对象。目前定义的结构为

[
  "definition": "located at or near the back of an animal",
  "partOfSpeech": "adjective"
]

您想要的案例结构类似于:

[
  "partOfSpeech": "adjective",
  "definitions": ["located at or near the back of an animal", "..."],  
]
// or
[
  "adjective": ["located at or near the back of an animal", "..."], 
  "adverb": ["in or to or toward a past time", "..."], 
]

“定义” 也可以是数组中的对象,但关键是您需要先按属性分组,然后有两个迭代器。一个跨 partOfSpeech 和一个跨 “定义”

您可以使用Array 函数自己构建分组逻辑或使用lodash groubBy

// groups by property length
_.groupBy(['one', 'two', 'three'], 'length');
// =>  '3': ['one', 'two'], '5': ['three'] 

有关如何分组的更多选项,您还可以查看How to group an array of objects by key

【讨论】:

很遗憾,我无法更改结构,因为我是从外部 API 获取的。 您仍然可以更改它,因为您在某处调用了 API。然后,您可以在获取响应后以任何您喜欢的方式转换/更改响应。 您可以在将响应分配给反应组件的props之前转换响应

以上是关于如何在条件渲染中只渲染一次元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 map 函数有条件地使用 React 和 Firebase 渲染元素?

React Native:如何隐藏条件渲染以外的元素?

单行条件渲染是不是可行?

有没有办法让屏幕阅读器在渲染元素时只宣布一次?

Vue的条件渲染详解

如何有条件地渲染 <f:facet>?