Javascript 在React中迭代数据数组时呈现JSX元素的最有效方法
我有一个包含对象的数组。我正在创建此数组的映射,以使用Javascript 在React中迭代数据数组时呈现JSX元素的最有效方法,javascript,reactjs,jsx,array.prototype.map,Javascript,Reactjs,Jsx,Array.prototype.map,我有一个包含对象的数组。我正在创建此数组的映射,以使用span组件渲染名称 let data = [{"id": "01", "name": "Hi"}, {"id": "02", "name": "Hello"}]; 我一直在使用下面两种不同的功能来迭代对象数组,并使用map来渲染JSX元素 功能1: import React,{Component}来自'React'; 类应用程序扩展组件{ render(){ let data=[{“id”:“01”,“name”:“Hi”},{“id”:
span
组件渲染名称
let data = [{"id": "01", "name": "Hi"}, {"id": "02", "name": "Hello"}];
我一直在使用下面两种不同的功能来迭代对象数组,并使用map来渲染JSX元素
功能1:
import React,{Component}来自'React';
类应用程序扩展组件{
render(){
let data=[{“id”:“01”,“name”:“Hi”},{“id”:“02”,“name”:“Hello”}];
const items=data.map((键,i)=>{
返回{key.name};
});
返回(
{items}
);
}
}
导出默认应用程序;
功能2:
import React,{Component}来自'React';
类应用程序扩展组件{
render(){
let data=[{“id”:“01”,“name”:“Hi”},{“id”:“02”,“name”:“Hello”}];
让行=[];
data.map((键,i)=>{
rows.push({key.name});
});
返回(
{rows}
);
}
}
导出默认应用程序;
我知道上面两种使用
map
和呈现JSX元素的不同方法。除了这两种方法之外,还有其他的方法吗?如果是,推荐哪种方法?第一种方法更好
Array.prototype.map
在幕后创建一个数组,并在对每个元素应用修改后返回该数组Functionality-1创建两个数组,而Functionality-2创建三个数组const data = [{id: 1, name: 'a'}, {id: 2, name: 'b'}];
export default class App extends PureComponent {
render() {
return (
<div>
{data.map(({ id, name }) => <span key={id}>{name}</span>)}
</div>
);
}
}
const data=[{id:1,名称:'a'},{id:2,名称:'b'}];
导出默认类应用程序扩展PureComponent{
render(){
返回(
{data.map(({id,name})=>{name})
);
}
}
现在,您的
数据不会在每次渲染时重新实例化,您也不必垃圾收集任何不必要的变量声明。为了更好地理解,您可以使用它
const data = [{id: 1, name: 'a'}, {id: 2, name: 'b'}];
export default class App extends React.Component {
render() {
return (
<div>
{data.map((data, dataIndex ) => <span key={dataIndex}>{data.name}</span>)}
</div>
);
}
}
const data=[{id:1,名称:'a'},{id:2,名称:'b'}];
导出默认类App扩展React.Component{
render(){
返回(
{data.map((数据,数据索引)=>{data.name})
);
}
}
在这里您可以理解名称属于with attribute。我主要遵循以下规则:
创建一个呈现项目的组件
// in some file
export const RenderItems = ({data}) => {
return data && data.map((d, i) => <span key={d.id}>{d.name}</span>) || null
}
了解为什么在使用索引作为键时遵循此语法
更新:
如果希望避免使用不必要的html标记,可以使用
这将以html格式呈现d.name
的值,不带任何标记。当我们专门将现有设计转换为react应用程序时,这被认为是最好的。或者,可能还有其他情况。例如,我们将显示一个定义列表:
<dl>
<dt></dt>
<dd></dd>
<dt></dt>
<dd></dd>
<dt></dd>
</dl>
可以考虑破坏:
const { items, ...other } = props
// and in your component you can use like:
<div modalData={other.modalData}>
const{items,…other}=props
//在您的组件中,您可以使用:
但是,就个人而言,我更喜欢使用第一个示例代码。这是因为在开发过程中,我不需要每次都回顾其他组件或寻找控制台。在给定的示例中,有一个类似modalData={}
的键,因此我们可以轻松地维护modalData={other.modalData}
。但是如果需要像{modalData}
那样编码,该怎么办?那么,您也可以同意我的偏好。一般来说,for
或while
语句是迭代数组最有效的方法。在非关键位置处理小阵列的方式可被视为微优化
map
的使用在React组件中是惯用的,因为它足够快,可以作为表达式的一部分返回值
虽然这是一个反模式:
let rows = [];
data.map((key, i) => {
rows.push(<span key={key.id}>{key.name}</span>);
});
第一种方法是正确的。使用map函数遍历数组
导出默认类App扩展React.Component{
建造师(道具){
超级(道具);
此.state={
数据:[{“id”:“01”,“name”:“Hi”},{“id”:“02”,“name”:“Hello”}];
};
}
render(){
返回(
{this.state.data.map((数据,索引)=>
{data.name}
)}
);
}
}
我将使用返回(…)
中的映射,因为映射返回一个数组。它更清晰易读,这是我个人努力追求的
为了补充答案,如果数组数据
可能会发生变化,我会创建一个新的无状态转储组件:
const Spanner = props => { return <span key={ props.data.id }>{ props.data.name }</span> };
class App extends Component {
render() {
let data = [{"id": "01", "name": "Hi"}, {"id": "02", "name": "Hello"}];
return (
<div>
{
data.map( (item, ind) => {
return (<Spanner key={item.id} data={item.name} />);
})
}
</div>
);
}
}
}
这样,您就不会重复自己的操作,即使现在新的数据
数组具有新的键用户类型
,您的应用程序组件仍然具有预期的行为。
这也是我应该做的。可以重用函数toSpan
class App extends React.Component {
render() {
const data = [{id: `01`, name: `Hi`}, {id: `02`, name: `Hello`}]
const toSpan = ({id, name}) => <span key={id}>{name}</span>
return (
<div>{data.map(toSpan)}</div>
)
}
}
类应用程序扩展了React.Component{
render(){
const data=[{id:`01`,name:`Hi`},{id:`02`,name:`Hello`}]
常量toSpan=({id,name})=>{name}
返回(
{data.map(toSpan)}
)
}
}
“functional2”在调用从未使用过的.map
时创建数组。切换到data.forEach
,这样就不会创建不必要的数组。但这仅在分配给引用权限时有效?like const array=data.map(如果我错了,请纠正我否,数组是创建的,无论您是否将其分配给变量。在上面的代码中,数组是创建的,然后立即符合垃圾收集的条件,因为没有引用指向它。如果切换到,则不会创建额外的数组。确定了解。谢谢。您还可以帮助我使用其他呈现方式吗当我们在迭代中呈现jsx元素时,除了我提到的和下面提到的其他元素之外
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} />
<>{d.name}</>
<dl>
<dt></dt>
<dd></dd>
<dt></dt>
<dd></dd>
<dt></dd>
</dl>
<>
<dt>{d.term}</dt>
<dd>{d.definition}</dd>
</>
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}>
let rows = [];
data.map((key, i) => {
rows.push(<span key={key.id}>{key.name}</span>);
});
const data = [{"id": "01", "name": "Hi"}, {"id": "02", "name": "Hello"}];
const App = props => <div>
{data.map(({ id, name }) => <span key={id}>{name}</span>)}
</div>;
const Spanner = props => { return <span key={ props.data.id }>{ props.data.name }</span> };
class App extends Component {
render() {
let data = [{"id": "01", "name": "Hi"}, {"id": "02", "name": "Hello"}];
return (
<div>
{
data.map( (item, ind) => {
return (<Spanner key={item.id} data={item.name} />);
})
}
</div>
);
}
}
}
const UserWidget = (props) => {
return (
<div>
<h4>{ props.type }</h4>
<Spanner key={ props.key } data={ props.name }/>
</div>
);
}
// now both the UserWidget and the Spanner Components can be used wherever required
// say a dashboard Component wants to use the UserWidget
class Dashboard extends Component {
render() {
let data = [{"id": "01", "name": "Hi", "userType": "Admin"}, {"id": "02", "name": "Hello", "userType": "Client"}];
return (
<div>
{
data.map( (item, ind) => {
return (<UserWidget type={ item.userType } key={item.id} data={item.name} />);
})
}
</div>
);
}
}
}
class App extends React.Component {
render() {
const data = [{id: `01`, name: `Hi`}, {id: `02`, name: `Hello`}]
const toSpan = ({id, name}) => <span key={id}>{name}</span>
return (
<div>{data.map(toSpan)}</div>
)
}
}