在 React JSX 中返回配对元素
returning paired elements in React JSX
问题:
在 React 中,您想通过映射数组来创建一个 DOM 结构,但是数组中的每一项都应该 return 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>
)
}
}
React 不允许您在不将兄弟姐妹包装在容器元素中的情况下渲染它们,这会破坏此处的 DOM 结构。
我发现实现此目的的最简单方法是为数组的每个项目映射对象键(lodash 支持此)并有条件地呈现每种类型的元素。
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 _.map(item, (elem, key) => {
if (key === 'def') {
return <dt>{elem}</dt>
} else if (key === 'term') {
return <dd>{elem}</dd>
}
})
})}
</dl>
)
}
}
您可以像这样使用 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>
);
}
}
React 16.2 添加了对 Fragments
的支持,你可以这样使用它:
return (
<dl>
{_.map(array, (item) => {
return (
<Fragment>
<dt>{item.def}</dt>
<dd>{item.term}</dd>
</Fragment>
)
})}
</dl>
)
您也可以像这样使用带空标签的片段:
return (
<dl>
{_.map(array, (item) => {
return (
<>
<dt>{item.def}</dt>
<dd>{item.term}</dd>
</>
)
})}
</dl>
)
但请记住,如果您想在 Fragment
标签上使用 key
属性,则必须使用它的完整版本。有关 this React 博客
的更多信息
问题:
在 React 中,您想通过映射数组来创建一个 DOM 结构,但是数组中的每一项都应该 return 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>
)
}
}
React 不允许您在不将兄弟姐妹包装在容器元素中的情况下渲染它们,这会破坏此处的 DOM 结构。
我发现实现此目的的最简单方法是为数组的每个项目映射对象键(lodash 支持此)并有条件地呈现每种类型的元素。
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 _.map(item, (elem, key) => {
if (key === 'def') {
return <dt>{elem}</dt>
} else if (key === 'term') {
return <dd>{elem}</dd>
}
})
})}
</dl>
)
}
}
您可以像这样使用 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>
);
}
}
React 16.2 添加了对 Fragments
的支持,你可以这样使用它:
return (
<dl>
{_.map(array, (item) => {
return (
<Fragment>
<dt>{item.def}</dt>
<dd>{item.term}</dd>
</Fragment>
)
})}
</dl>
)
您也可以像这样使用带空标签的片段:
return (
<dl>
{_.map(array, (item) => {
return (
<>
<dt>{item.def}</dt>
<dd>{item.term}</dd>
</>
)
})}
</dl>
)
但请记住,如果您想在 Fragment
标签上使用 key
属性,则必须使用它的完整版本。有关 this React 博客