React.jsは初めてです。データ配列をバインドしようとしています。 ng-repeatに相当するものを探していますが、ドキュメント内で見つけることができません。
例えば:
var data = ['red', 'green', 'blue']
angularを使用すると、私のhtmlで次のようなことができます。
<div ng-repeat="i in data">{{i}}</div>
これを行うためのReactのマークアップが不思議です
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);
ここ 使用中です。
そして、ご覧のとおり、リストを「繰り返し」できる再利用可能なコンポーネントをすばやく作成できます。
ちょうどする必要があります:
{data.map(i => <div>{i}</div>)}
次に、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の繰り返しです。
反応コンポーネント内のrender関数で、これを行うことができます:
var data = ['red', 'green', 'blue'];
var dataComponent = [];
data.forEach(function (dataValue) {
dataComponent.Push(<div> {dataValue} </div>);
});
これで、dataComponentを返すことができます。
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 から上記の例を取得しました。このサイトには、Reactディレクティブに相当するAngularの例がさらにあります。
Reactのより近いng-repeatの同等物を探しているなら、Angularのng-ifとng-repeatの機能をReactで提供するために作成したモジュールです。 = JSX式とES6を混合せずに、これは実際にはるかに優れています。
したがって、React=で繰り返しを行う典型的な方法は次のようになります。
<div>
{list.map(i => (
<button
id="gotoA"
className="link"
onClick={clicking}
/>
)}
</div>
Tersus-jsx.macroが使用されている場合、AngularJSのng-repeatのようにtj-for propを簡単に定義できます。
<div>
<button
tj-for={list}
id="gotoA"
className="link"
onClick={clicking}
/>
</div>
Create-react-appの最新バージョンはデフォルトでBabel-Macroをサポートしているため、このモジュールをnpmインストールし、レンダリングリターンを「tersus」でラップして、小道具の割り当てを開始するだけです。また、ng-ifサポート(tj-if)が付属しており、tj-forと組み合わせて使用できます。
以下からインストールできます: https://www.npmjs.com/package/tersus-jsx.macro