Is There a React Equivalent for Angular’s ng-repeat?


This post originally appeared on my Angular to React site where you’ll find more resources like this to help Angular Developers get up to speed quickly on React.

Is There a React Equivalent for Angular’s ng-repeat?

Yes. React doesn’t use a proprietary construct to iterate over a collection of data. Instead, it relies on native Javascript iterators to generate repeating blocks of UI. Keep reading below for code samples and further explanation.

If you’ve been developing Angular applications for any amount of time, you’ve likely used the ng-repeat directive. Generating repeating blocks of UI from a data structure is a cornerstone of web development regardless of language or framework.

The AngularJS team wrapped up a really convenient and powerful piece of iterative magic in the ng-repeat directive. With very little code, you can create dynamic lists that stay in sync with a collection of data. Just so we’re on the same page, here’s what the Angular code looks like:

AngularJS Code Sample for ng-repeat

Assume you have an array like this:

var items = [
  { name: "Matthew", link: "https://bible.com/1/mat.1" },
  { name: "Mark", link: "https://bible.com/1/mrk.1" },
  { name: "Luke", link: "https://bible.com/1/luk.1" },
  { name: "John", link: "https://bible.com/1/jhn.1" }
];

In Angular 1.x, to create a ul with an li for each item in the array you would put the following code in your controller:

.controller("NgRepeatDemoCtrl", function($scope) {
  $scope.items = items;
});

Then, in your view, you could use the ng-repeat directive like this:

<ul>
  <li ng-repeat="item in items">
    <a ng-href=""></a>
  </li>
</ul>
React Alternative to ng-repeat

To perform the same task in React you just need to think natively. Under the hood ng-repeat is just using a native Javascript iterator. You can use the same sort of native iterator directly in React. For just example, I’ll use Array.map. Here’s an example:

var RepeatModule = React.createClass({
  getDefaultProps: function() {
    return { items: [] }
  },
  render: function() {

    var listItems = this.props.items.map(function(item) {
      return (
        <li key="{item.name}">
          <a href="{item.link}">{item.name}</a>
        </li>
      );
    });

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

In this example, Array.map iterates through every item contained in items and executes a function that returns a DOM element. (Technically, it’s a virtual DOM element, but that’s a different discussion.)   Every li that is returned from inside of the map function gets added to a new array and finally returned as the value of the Array.map() function. The result of that function is stored in the listItems variable. When React calls the render method on our component, we generate an array of list items and then insert them into our ul using a single pair of enclosing curly braces.

Try It Out Yourself Using This JSFiddle