大多数情况下,我遵循以下规则:
创建一个呈现项目的组件
// in some file
export const RenderItems = ({data}) => {
return data && data.map((d, i) => <span key={d.id}>{d.name}</span>) || null
}
钩住 RenderItems
import { RenderItems } from 'some-file'
class App extends Component {
render() {
// you may also define data here instead of getting data from props
const { data } = this.props
return (
<div>
<RenderItems data={data} />
</div>
)
}
}
在组件中附加数据
const data = [{"id": "01", "name": "Hi"}, {"id": "02", "name": "Hello"}]
<App data={data} />
即使使用您的第二个代码示例,遵循此规则也不会影响性能。推送数组中的项目并呈现项目。因为,您不是直接在渲染挂钩内工作。始终注意渲染钩子不会直接在其中实现任何逻辑。
此外,我不会id
仅仅为了使用密钥而创建:
const data = [{"name": "Hi"}, {"name": "Hello"}]
//... and when using index as key
.map((d, i) => <span key={'item-'+i}>
// or,
.map((d, i) => <span key={'item-'+i+'-'+d.name}>
请参阅这篇文章,为什么我在使用索引作为键时遵循此语法。
更新:
如果你想避免使用不必要的 html 标签,你可以使用React.Fragment
export const RenderItems = ({data}) => {
return data &&
data.map(
(d, i) => <React.Fragment key={d.id}>{d.name}</React.Fragment>
) || null
}
// and when rendering, you just return the component
return <RenderItems data={data} />
笔记:
- 仅当您没有任何其他属性时
<></>
,<React.Fragment></React.Fragment>
才可以将其用作别名。由于我们在其上使用 key 属性,而不是使用它。
- 看看这个以支持
React.Fragment
.
使用示例<></>
:
<>{d.name}</>
这将d.name
在没有任何标记的情况下在 html 中呈现的值。当我们专门将现有设计转换为 React 应用程序时,这被认为是最好的。或者,可能还有其他情况。比如,我们将显示一个定义列表:
<dl>
<dt></dt>
<dd></dd>
<dt></dt>
<dd></dd>
<dt></dd>
</dl>
并且我们不想附加不必要的 html 标签,那么使用 Fragment 会让我们的生活更轻松:
例子:
<>
<dt>{d.term}</dt>
<dd>{d.definition}</dd>
</>
最重要的情况是td
在tr
(TR 组件)中渲染元素。如果我们不这样做,那么我们就违反了 HTML 规则。该组件将无法正确呈现。在react中,它会给你一个错误。
更新2:
另外,如果你有很长的props列表,如下所示:
const {
items,
id,
imdbID,
title,
poster,
getMovieInfo,
addToFavorites,
isOpen,
toggleModal,
closeModal,
modalData,
} = props
你可以考虑像这样的解构:
const { items, ...other } = props
// and in your component you can use like:
<div modalData={other.modalData}>
但是,我个人更喜欢使用第一个示例代码。这是因为在开发过程中,我不需要每次都回头查看其他组件或寻找控制台。在给定的示例中,modalData={}
我们很容易维护modalData={other.modalData}
. 但是如果需要像这样编码<div>{modalData}</div>
呢?那么,你可能也同意我的偏好。