Reactでリストをフィルタリングする
うーん、私の脱字は見当たりませんが、コンソールエラーで真っ白なページが表示されます:
Users.js:9 Uncaught TypeError: Cannot read property 'filter' of undefined
at Users.render (Users.js:9)
どうやら 'filter()' の使い方が間違っているようです。というコンソールエラーが出ます。どなたか教えてください。ここにファイルがあります:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import Users from './Users';
ReactDOM.render(
<Users list={[
{ name: 'Tyler', friend: true },
{ name: 'Ryan', friend: true },
{ name: 'Michael', friend: false },
{ name: 'Mikenzie', friend: false },
{ name: 'Jessica', friend: true },
{ name: 'Dan', friend: false }
]}
/>,
document.getElementById('root')
);
ユーザー
import React from 'react';
class Users extends React.Component {
render() {
return (
<div>
<h1>Friends:</h1>
<ul>
{this.props.list.friend.filter(function (friend) {
return <li>{friend[0] === 'true'}</li>
})}
</ul>
<hr />
<h1>Non Friends:</h1>
<ul>
{this.props.list.friend.filter(function (nonFriend) {
return <li>{nonFriend[0] === 'false'}</li>
})}
</ul>
</div>
);
}
}
export default Users;
7
4
さて、「Users.js」は次のようになります。
またはこれ:
.friend
は配列の各オブジェクトのプロパティであるにもかかわらず、リスト自体に対して
.friendを呼び出しています。また、
.filterを使用していますが、ここでは正しく使用しているとは思えません。filter
は、渡された関数が真理値を返す特定の要素を持つ配列を返します。filter`の使い方は以下の通り:また、配列が大きい場合は
.forEach
で配列を1回通過させることもできます:リストではなく、属性をフィルタリングしようとしているのだと思います。これを変更してみてください:
をこのように変更してみてください:
その代わりに、私なら次のようにする。
1.リスト内のアイテムではなく、リストそのものを繰り返し処理しているため、
this.props.list.friend.filter
が動作しませんでした。 2.2.この場合、実際にリストをフィルタリングしているわけではないので、私ならmapを使います。もしそうしたいのであれば、リストをあらかじめ友人とそうでないものにフィルタリングしておき、それらのアイテムをマップすることができます。 3.Reactは、繰り返し作成されるアイテムのマークアップに「キー」を求めている。これは、Reactがステートツリー内のコンポーネント間の関係を作成する方法です。