如何在 React 中渲染对象数组?

问题描述 投票:0回答:7

你能告诉我如何在 React js 中渲染列表吗? 我很喜欢这个

https://plnkr.co/edit/X9Ov5roJtTSk9YhqYUdp?p=preview

class First extends React.Component {
  constructor (props){
    super(props);

  }

  render() {
     const data =[{"name":"test1"},{"name":"test2"}];
    const listItems = data.map((d) => <li key={d.name}>{d.name}</li>;
    
    return (
      <div>
      hello
      </div>
    );
  }
} 
javascript reactjs react-router
7个回答
188
投票

您可以通过两种方式完成:

第一:

render() {
    const data =[{"name":"test1"},{"name":"test2"}];
    const listItems = data.map((d) => <li key={d.name}>{d.name}</li>);

    return (
      <div>
      {listItems }
      </div>
    );
  }

第二:直接将map函数写在return中

render() {
    const data =[{"name":"test1"},{"name":"test2"}];
    return (
      <div>
      {data.map(function(d, idx){
         return (<li key={idx}>{d.name}</li>)
       })}
      </div>
    );
  }

21
投票

https://facebook.github.io/react/docs/jsx-in-deep.html#javascript-expressions

您可以将任何 JavaScript 表达式作为子表达式传递,只需将其括在 {} 内即可。例如,这些表达式是等效的:

<MyComponent>foo</MyComponent>

<MyComponent>{'foo'}</MyComponent>

这对于渲染任意长度的 JSX 表达式列表通常很有用。例如,这会呈现一个 HTML 列表:

function Item(props) {
  return <li>{props.message}</li>;
}

function TodoList() {
  const todos = ['finish doc', 'submit pr', 'nag dan to review'];
  return (
    <ul>
      {todos.map((message) => <Item key={message} message={message} />)}
    </ul>
  );
}

class First extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      data: [{name: 'bob'}, {name: 'chris'}],
    };
  }
  
  render() {
    return (
      <ul>
        {this.state.data.map(d => <li key={d.name}>{d.name}</li>)}
      </ul>
    );
  }
}

ReactDOM.render(
  <First />,
  document.getElementById('root')
);
  
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>


9
投票

Shubham 的回答解释得很好。这个答案是为了避免一些陷阱并重构为更易读的语法

陷阱:在渲染对象数组时存在常见的误解,特别是在对数据执行更新或删除操作时。用例就像从表行中删除一个项目。有时,当预期要删除的行没有被删除,而是其他行被删除时。

为了避免这种情况,请在根元素中使用 key

 属性,该元素在 
.map()
 的 JSX 树中循环。另外,添加 React 的 
Fragment
 将避免在通过调用方法渲染时在 
ul
li
 之间添加另一个元素。

state = { userData: [ { id: '1', name: 'Joe', user_type: 'Developer' }, { id: '2', name: 'Hill', user_type: 'Designer' } ] }; deleteUser = id => { // delete operation to remove item }; renderItems = () => { const data = this.state.userData; const mapRows = data.map((item, index) => ( <Fragment key={item.id}> <li> {/* Passing unique value to 'key' prop, eases process for virtual DOM to remove specific element and update HTML tree */} <span>Name : {item.name}</span> <span>User Type: {item.user_type}</span> <button onClick={() => this.deleteUser(item.id)}> Delete User </button> </li> </Fragment> )); return mapRows; }; render() { return <ul>{this.renderItems()}</ul>; }

重要:决定使用哪个值传递给 key

 属性也很重要,因为常见的方法是使用 
index
 提供的 
.map()
 参数。 

TLDR;但它有一个缺点,请尽可能避免它,并使用正在迭代的数据中的任何唯一的

id

,例如 
item.id
。有一篇关于此的好文章 - 
https://medium.com/@robinpokorny/index-as-a-key-is-an-anti-pattern-e0349aece318


4
投票
在 app.js 文件中尝试下面的代码,很容易理解

function List({}) { var nameList = [ { id: "01", firstname: "Rahul", lastname: "Gulati" }, { id: "02", firstname: "Ronak", lastname: "Gupta" }, { id: "03", firstname: "Vaishali", lastname: "Kohli" }, { id: "04", firstname: "Peter", lastname: "Sharma" } ]; const itemList = nameList.map((item) => ( <li> {item.firstname} {item.lastname} </li> )); return ( <div> <ol style={{ listStyleType: "none" }}>{itemList}</ol> </div> ); } export default function App() { return ( <div className="App"> <List /> </div> ); }
    

2
投票
import React from 'react'; class RentalHome extends React.Component{ constructor(){ super(); this.state = { rentals:[{ _id: 1, title: "Nice Shahghouse Biryani", city: "Hyderabad", category: "condo", image: "http://via.placeholder.com/350x250", numOfRooms: 4, shared: true, description: "Very nice apartment in center of the city.", dailyPrice: 43 }, { _id: 2, title: "Modern apartment in center", city: "Bangalore", category: "apartment", image: "http://via.placeholder.com/350x250", numOfRooms: 1, shared: false, description: "Very nice apartment in center of the city.", dailyPrice: 11 }, { _id: 3, title: "Old house in nature", city: "Patna", category: "house", image: "http://via.placeholder.com/350x250", numOfRooms: 5, shared: true, description: "Very nice apartment in center of the city.", dailyPrice: 23 }] } } render(){ const {rentals} = this.state; return( <div className="card-list"> <div className="container"> <h1 className="page-title">Your Home All Around the World</h1> <div className="row"> { rentals.map((rental)=>{ return( <div key={rental._id} className="col-md-3"> <div className="card bwm-card"> <img className="card-img-top" src={rental.image} alt={rental.title} /> <div className="card-body"> <h6 className="card-subtitle mb-0 text-muted"> {rental.shared} {rental.category} {rental.city} </h6> <h5 className="card-title big-font"> {rental.title} </h5> <p className="card-text"> ${rental.dailyPrice} per Night &#183; Free Cancelation </p> </div> </div> </div> ) }) } </div> </div> </div> ) } } export default RentalHome;
    

1
投票
试试这个:

class First extends React.Component { constructor (props){ super(props); } render() { const data =[{"name":"test1"},{"name":"test2"}]; const listItems = data.map((d) => <li key={d.name}>{d.name}</li>; return ( <div> {listItems} </div> ); } }


0
投票
此代码会将您的列表返回到屏幕。但这是呈现列表的最简单方法。

const people = [ 'Creola Katherine Johnson: mathematician', 'Mario José Molina-Pasquel Henríquez: chemist', 'Mohammad Abdus Salam: physicist', 'Percy Lavon Julian: chemist', 'Subrahmanyan Chandrasekhar: astrophysicist' ]; export default function List() { const listItems = people.map(person => <li>{person}</li> ); return <ul>{listItems}</ul>; }
    
© www.soinside.com 2019 - 2024. All rights reserved.