我有一个包含对象的数组。我正在创建此数组的映射,以使用span
组件呈现名称。
let data = [{"id": "01", "name": "Hi"}, {"id": "02", "name": "Hello"}];
我一直在使用以下两种不同的功能来迭代该对象数组,并使用map呈现JSX元素。
import React, { Component } from 'react';
class App extends Component {
render() {
let data = [{"id": "01", "name": "Hi"}, {"id": "02", "name": "Hello"}];
const items = data.map((key, i) => {
return <span key={key.id}>{key.name}</span>;
});
return (
<div>
{items}
</div>
);
}
}
export default App;
import React, { Component } from 'react';
class App extends Component {
render() {
let data = [{"id": "01", "name": "Hi"}, {"id": "02", "name": "Hello"}];
let rows = [];
data.map((key, i) => {
rows.push(<span key={key.id}>{key.name}</span>);
});
return (
<div>
{rows}
</div>
);
}
}
export default App;
我知道以上两种使用map
和呈现JSX元素的方式。除了这两种以外,还有其他方法可以做到吗?如果是这样,推荐哪个?
通常,我遵循以下规则:
创建一个渲染项目的组件
// 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>
才可以将其用作别名。由于我们在其上使用键属性,因此不使用它。React.Fragment
。使用示例<></>
:
<>{d.name}</>
这将d.name
在html中呈现为,而没有任何标签。当我们专门转换现有设计以响应应用程序时,这被认为是最好的。或者,可能还有其他情况。就像,我们将显示一个定义列表:
<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规则。该组件将无法正确渲染。在做出反应时,它将引发错误。
另外,如果您的道具清单很长,如下所示:
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>
怎么办?然后,您也可以同意我的偏好。
我正在尝试创建可以在本质上重用的表组件。根据从父组件通过道具传递给它的数据,它可以包含任意数量的列。 为了实现这一点,我创建了如下单独的函数来填充JSX元素。 :它将列名传递作为父字符串数组的道具。 :这将填充每行的body和TableRow。它将调用函数,该函数将返回要推入方法中的JSX元素数组。 :此方法使用中迭代行对象的每个属性,创建TableCell元素,并将其推送到数组中,返回理想情况下
问题内容: 我是React JS的新手,问题是我需要在这段代码中显示数据库中的所有字段。我已经能够在浏览器控制台中将所有数据作为对象获取,并且能够在浏览器中查看数组中的最后一条数据,但无法查看它们。请原谅我代码中的格式错误,这是我的新知识。在此先感谢..... 输出和代码 浏览器视图:Lands of Toys Inc.是名称131是ID JSON数据: 这些数据是通过以插件形式编写的PHP代码获
我正在使用一个使用React框架的JavaScript遗留项目。我们定义了一些React组件,我想在一个完全不同的TypeScript React项目中重新使用。 JS React组件在controls.jsx文件中定义,如下所示: 在我的TypeScript React项目中,我试图这样使用它: 错误消息显示: JSX元素类型MyComponent不是JSX元素的构造函数。类型'MyCompon
我怎样才能以更聪明的方式做到这一点?是否有一些库可以使用反射或类似的方法返回给定JavaBean的元素集合?
我在中有一个带有几个元素的,我正在做的是迭代并显示Array中与null不同的所有元素。 这是: 我的问题:是否可以在一行中迭代null以外的元素?