在React JSX中返回配对元素

stu*_*edy 12 javascript reactjs react-jsx

问题:

在React中,您希望通过映射数组来创建DOM结构,但数组中的每个项应返回2个元素.例如

import React from 'react'
import _ from 'lodash'

let { Component } = React

export default class DataList extends Component {
  render () {
    let array = [
      {def: 'item1', term: 'term1', obj1: 'rand'}, 
      {def: 'item2', term: 'term2'}
    ]
    return (
      <dl>
        {_.map(array, (item) => {
          return (
            <dt>{item.def}</dt>
            <dd>{item.term}</dd>
          )
        })}
      </dl>
    )
  }
}
Run Code Online (Sandbox Code Playgroud)

React不允许你渲染兄弟姐妹而不将它们包装在容器元素中,这会破坏DOM结构.

Rif*_*fat 13

你可以做这样简单的事情reduce:

import React, { Component } from 'react';

export default class DataList extends Component {
  render () {
    const array = [
      {def: 'item1', term: 'term1', obj1: 'rand'}, 
      {def: 'item2', term: 'term2'}
    ];

    return (
      <dl>
        {array.reduce((acc, item, idx) => {
            return acc.concat([
                <dt key={`def-${idx}`}>{item.def}</dt>,
                <dd key={`term-${idx}`}>{item.term}</dd>
            ]);
        }, [])}
      </dl>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

演示:: https://jsfiddle.net/rifat/caray95v/

  • 哈,非常好......我花了几秒钟才弄清楚它是如何工作的,这是唯一的缺点(即从代码可读性POV中稍微不易理解),但更优雅的解决方案,以及我的那个从现在开始使用. (2认同)
  • [`Fragment`](/sf/answers/3345575551/)将是现在解决此问题的推荐方法。 (2认同)

Or *_*uan 9

React 16.2增加了支持Fragments,你可以像这样使用它:

return (
  <dl>
    {_.map(array, (item) => {
      return (
        <Fragment>
          <dt>{item.def}</dt>
          <dd>{item.term}</dd>
        </Fragment>
      )
    })}
  </dl>
)
Run Code Online (Sandbox Code Playgroud)

您还可以将Fragment与空标记一起使用,如下所示:

return (
  <dl>
    {_.map(array, (item) => {
      return (
        <>
          <dt>{item.def}</dt>
          <dd>{item.term}</dd>
        </>
      )
    })}
  </dl>
)
Run Code Online (Sandbox Code Playgroud)

但请记住,如果要keyFragment标记上使用该属性,则必须使用其完整版本.有关 react博客的更多信息