Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I am having a problem where I am trying to use array of data to render a <ul> element. In the code below the console logs are working fine, but the list items aren't appearing.

var Main = React.createClass({
  getInitialState: function(){
    return {
      data: dataRecent
  render: function(){
    return (
           this.state.data.map(function(item, i){
             console.log('test');
             <li>Test</li>
ReactDOM.render(<Main />, document.getElementById('app')); 

What am I doing wrong? Please feel free to point out anything that isn't best practice.

Gosha Arinich is right, you should return your <li> element. But, nevertheless, you should get nasty red warning in the browser console in this case

Each child in an array or iterator should have a unique "key" prop.

so, you need to add "key" to your list:

this.state.data.map(function(item, i){
  console.log('test');
  return <li key={i}>Test</li>

or drop the console.log() and do a beautiful oneliner, using es6 arrow functions:

this.state.data.map((item,i) => <li key={i}>Test</li>)

IMPORTANT UPDATE:

The answer above is solving the current problem, but as Sergey mentioned in the comments: using the key depending on the map index is BAD if you want to do some filtering and sorting. In that case use the item.id if id already there, or just generate unique ids for it.

When I add this set of <li> into <ul>. I still get the same Red nasty Warning in the console. How to get rid of the same ? – informer Aug 28, 2017 at 10:53 Hey! Do you still need help? Is it the same 'Each child in an array or iterator should have a unique "key" prop' nasty message? – Dmitry Birin Sep 8, 2017 at 21:17 key has to be unique. Your code will cause a bug after sorting this.state.data, as key always depends on an index in the array – Sergey Podgornyy Jan 28, 2019 at 10:34 @SergeyPodgornyy totally agree, wrote this long time ago. Updated the answer. Thanks for the follow up! – Dmitry Birin Jan 29, 2019 at 16:57 Welcome to Stack Overflow! Thank you for this code snippet, which might provide some limited, immediate help. A proper explanation would greatly improve its long-term value by showing why this is a good solution to the problem, and would make it more useful to future readers with other, similar questions. Please edit your answer to add some explanation, including the assumptions you've made. – Suraj Rao Jan 28, 2019 at 10:31

Using Stateless Functional Component We will not be using this.state. Like this

 {data1.map((item,key)=>
               { return
                <tr key={key}>
                <td>{item.heading}</td>
                <td>{item.date}</td>
                <td>{item.status}</td>

You are implicitly returning undefined. You need to return the element.

this.state.data.map(function(item, i){
  console.log('test');
  return <li>Test</li>
  // Array of objects containing our fruit data
  let fruits = [
    { label: "Apple", value: "🍎" },
    { label: "Banana", value: "🍌" },
    { label: "Orange", value: "🍊" }
  // Using state to keep track of what the selected fruit is
  let [fruit, setFruit] = useState("⬇️ Select a fruit ⬇️")
  // Using this function to update the state of fruit
  // whenever a new option is selected from the dropdown
  let handleFruitChange = (e) => {
    setFruit(e.target.value)
  return (
    <div className="App">
      {/* Displaying the value of fruit */}
      {fruit}
      <select onChange={handleFruitChange}>
        fruits.map((fruit) => <option value={fruit.value}>{fruit.label}</option>)
      </select>
export default App;

Add up to Dmitry's answer, if you don't want to handle unique key IDs manually, you can use React.Children.toArray as proposed in the React documentation

React.Children.toArray

Returns the children opaque data structure as a flat array with keys assigned to each child. Useful if you want to manipulate collections of children in your render methods, especially if you want to reorder or slice this.props.children before passing it down.

Note:

React.Children.toArray() changes keys to preserve the semantics of nested arrays when flattening lists of children. That is, toArray prefixes each key in the returned array so that each element’s key is scoped to the input array containing it.

React.Children.toArray( this.state.data.map((item, i) => <li>Test</li>)

I've come cross an issue with the implementation of this solution.

If you have a custom component you want to iterate through and you want to share the state it will not be available as the .map() scope does not recognize the general state() scope. I've come to this solution:

class RootComponent extends Component() {
    constructor(props) {
        this.customFunction.bind(this);
        this.state = {thisWorks: false}
        this.that = this;
    componentDidMount() {
    render() {
       let array = this.thatstate.map(() => { 
           <CustomComponent that={this.that} customFunction={this.customFunction}/>
    customFunction() {
        this.that.setState({thisWorks: true})
class CustomComponent extend Component {
    render() {
        return <Button onClick={() => {this.props.customFunction()}}

In constructor bind without this.that Every use of any function/method inside the root component should be used with this.that

Dmitry Brin's answer worked for me, with one caveat. In my case, I needed to run a function between the list tags, which requires nested JSX braces. Example JSX below, which worked for me:

{this.props.data().map(function (object, i) { return <li>{JSON.stringify(object)}</li> })}

If you don't use nested JSX braces, for example:

{this.props.data().map(function (object, i) { return <li>JSON.stringify(object)</li>})}

then you get a list of "JSON.stringify(object)" in your HTML output, which probably isn't what you want.

if(this.props.resultsfood.status=='found'){ var foodlist = this.props.resultsfood.items.map(name=>{ return ( <div className="row" key={name.id} > <div className="list-group"> <a href="#" className="list-group-item list-group-item-action disabled"> <span className="badge badge-info"><h6> {name.item}</h6></span> <span className="badge badge-danger"><h6> Rs.{name.price}/=</h6></span> <a href="#" className="list-group-item list-group-item-action disabled"> <div className="alert alert-dismissible alert-secondary"> <strong>{name.description}</strong> <div className="form-group"> <label className="col-form-label col-form-label-sm" htmlFor="inputSmall">Quantitiy</label> <input className="form-control form-control-sm" placeholder="unit/kg" type="text" ref="qty"/> <div> <button type="button" className="btn btn-success" onClick={()=>{this.props.savelist(name.item,name.price); this.props.pricelist(name.price); this.props.quntylist(this.refs.qty.value); }>ADD Cart</button> return ( {foodlist} export default Result;