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

IT技术 javascript reactjs react-router
2021-01-27 14:36:01

你能告诉我如何在 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>
    );
  }
} 
6个回答

你可以通过两种方式做到这一点:

第一的:

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

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

第二种:直接在return里写map函数

render() {
    const data =[{"name":"test1"},{"name":"test2"}];
    return (
      <div>
      {data.map(function(d, idx){
         return (<li key={idx}>{d.name}</li>)
       })}
      </div>
    );
  }
请让我知道如何在 plunker 中包含 babel
2021-03-13 14:36:01
这是一个有效的 plnkr plnkr.co/edit/kFKBi8qUAC02eeHOYUB3?p=preview 似乎不需要在 plnkr 中包含 babel
2021-03-27 14:36:01
请分享plunker
2021-03-29 14:36:01
不要使用 idx(循环索引)作为 JSX 元素的关键属性以避免出现问题。阅读这个reactjs.org/docs/lists-and-keys.html#keys相反 idx 使用 some d.id.
2021-03-29 14:36:01
是的,正在努力,你的 plunker 中没有包含 babel
2021-03-30 14:36:01

https://facebook.github.io/react/docs/jsx-in-depth.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>

Shubham 的回答很好地解释了。这个答案是对它的补充,以避免一些陷阱和重构为更易读的语法

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

避免这种情况,请key在根元素中使用prop,该元素在 .js 的 JSX 树中循环.map()还加入阵营的Fragment将避免在之间添加其他元件ulli当通过呼叫方法呈现。

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

为什么不将密钥放在 <li> 元素中而不是包裹在 <fragment> 中?
2021-03-12 14:36:01
你也可以这样做。我添加了 Fragment 是因为它就像我的实践,并且 Fragment 很好地合并了 DOM 元素,确保在通过映射数据渲染时不会放置其他元素。
2021-04-02 14:36:01
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;

在 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>
  );
}