反应相当于 ng-repeat

React equivalent for ng-repeat

我是 React.js 的新手。我正在尝试绑定数据数组。我正在寻找 ng-repeat 的等效项,但我无法在文档中找到它。

例如:

var data =  ['red', 'green', 'blue']

使用 angular 我会在我的 html 中做这样的事情:

<div ng-repeat="i in data">{{i}}</div>

我想知道 React 的标记可以做到这一点

应该只是:

{data.map(i => <div>{i}</div>)}

在反应组件内的 render 函数中,您可以这样做:

var data =  ['red', 'green', 'blue'];
var dataComponent = [];
data.forEach(function (dataValue) {
    dataComponent.push(<div> {dataValue} </div>);
});

现在您可以return dataComponent。

在 React 中,您只需编写必要的 JavaScript(并有可能将其构建为可重用控件,如您所见)。一旦您学习了基本模式(以及它们与 AngularJS 的不同之处),它就非常规范且易于操作。

因此,在 render 函数中,您需要遍历列表。在下面的示例中,我使用了 map,但您可以根据需要使用其他迭代器。

var List = React.createClass({
    render: function() {
        return (<div>
        { this.props.data.map(function(item) {
                return <div>{item}</div>
            })
        }
        </div>);
    }
});

var data =  ['red', 'green', 'blue'];

React.render(<List data={ data }  />, document.body);

Here正在使用中

而且,如您所见,您可以快速构建一个可以 "repeat" 通过列表的可重用组件。

要在 React 中执行与 ng-repeat 相同的任务,您只需要本机思考。在引擎盖下 ng-repeat 只是使用原生的 Javascript 迭代器。你可以直接在 React 中使用相同类型的原生迭代器。例如,我将使用 Array.map:

var RepeatModule = React.createClass({
  getInitialState: 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 (
      <div> 
        <ul> 
          {listItems} 
        </ul> 
      </div> 
    ); 
  } 
});

我从 http://angulartoreact.com/ng-repeat-react-equivalent 得到了上面的例子。该站点有更多与 Angular 指令等效的 React 示例。

这是一个使用 ES6 和无状态组件的示例。

下面的代码演示了通过遍历菜单项列表来创建菜单。

import React from 'react';
import Menu from 'material-ui/lib/menus/menu';
import MenuItem from 'material-ui/lib/menus/menu-item';


const menuItems = [
    {route: '/questions', text: 'Questions'},
    {route: '/jobs', text: 'Jobs'},
    {route: '/tags', text: 'Tags'},
    {route: '/users', text: 'Users'},
    {route: '/badges', text: 'Badges'}
    {route: '/questions/new', text: 'Ask Question'}

].map((item, index) => <MenuItem key={index} primaryText={item.text} value={item.route} />);


const Sidebar = ({history}) => (
    <Menu
        autoWidth={false}
        onItemTouchTap={(e, child) => history.push(child.props.value)}
    >
        {menuItems}
    </Menu>
);


export default Sidebar;

基本上我们所做的只是利用 Array.map.

的纯 javascript 迭代