2016-05-26 14 views
1

私はユーザーのリストを使ってビルドしているアプリケーションを持っています。私はユーザーArrayを介してマップし、クリックすることができるように各ユーザーの名前を表示することができます。私は、そのコンポーネントがユーザの情報をレンダリングするはずの "UserCard"コンポーネントに小道具を渡します。1人のユーザーの代わりに1人のユーザー情報のリストで4つのコンポーネントを表示する

import React, {Component} from 'react'; 
import User from './User.jsx'; 

class UserList extends Component{  
render(){ 
    return(
     <ul className='nav nav-tabs nav-justified'> 
      {this.props.People.map(person => { 
       return <User 
        users={person} 
        key={person.Id} 
        {...this.props} 
       /> 
      })} 
     </ul> 
    ) 
} 
} 

export default UserList; 

:これは一意に起こっとうまく働いている、しかし、ユーザーが

import React, {Component} from 'react'; 
import UserCard from './UserCard.jsx'; 

class User extends Component{ 
onClick(e){ 
    e.preventDefault(); 
    const {updateUserId, user} = this.props; 
    updateUserId(user); 
} 
render(){ 
const {user, activeUser, userIdToShow} = this.props; 
const active = user === activeUser ? 'active' : ''; 

return(
    <li className={active} role='presentation'> 
     <a onClick={() => this.props.updateUserId(this.props.users.Id)}> 
      {this.props.users.Name} 
     </a> 
     {userIdToShow ? <UserCard 
      key={this.props.users.Id} 
      user={this.props.People[userIdToShow-1]}/> : null} 
    </li> 
    ) 
    } 
} 

export default User; 

とユーザーリスト(親compenent)は次のようになります(な長さの配列の)4回表示されていますどんなフィードバックも高く評価されます。私はJSBinやFiddleで自分のアプリを手に入れようとします。前もって感謝します!あなたはこの試みることができる

+0

UserCardでキー属性を使用します。 Keyは反応の 'キーワード'属性であり、子コレクションの外部でそれを使用すると問題が発生する可能性があります。 –

答えて

1

class User extends Component{ 
     // 1. use a state to show/hide user 
     constructor(props){ 
      super(props); 
      this.state = {show:false}; 
     } 
     // 2. add a show user that will be called in on-click 
     showUser(){ 
      this.setState({show:true}); 
     } 

     return(
     <li className={active} role='presentation'> 
     // 3. update the state of show in on-click 
     <a onClick={() => this.props.updateUserId(this.props.users.Id);this.showUser();}> 
      {this.props.users.Name} 
     </a> 
     // 4. use state to display the user card 
     {this.state.show ? <UserCard 
     key={this.props.users.Id} 
     user={this.props.People[userIdToShow-1]}/> : null} 
    </li> 
    ) 
    } 
} 
+0

本質的には、私が "updateUserId"でやっていることと同じことです。その関数は、最も外側の親レベルでStateで定義され、設定されています。ユーザーがクリックされたユーザーIDを選択し、そのユーザーの情報を表示します。問題は、それを4回(配列の長さ)表示することです。これは素晴らしいアイデアでしたが、私がすでに持っているものと同様のものを試して実装することができました。また、1つの「クリックイベント」で2つの関数呼び出しを行うことができますか?それは奇妙に思える。 –

+0

全体の構成がどのように構成されているかを知りたい場合は、https://github.com/ryanhca/react-challenge-usersでフルアプリをアップしてください。 –

+0

2つの関数呼び出しを1つの関数に抽出し、その関数を呼び出すことができます。特定のユーザーのために状態を分離し、その特定のユーザーのみが表示されます。親コンポーネントの状態が変更されると、すべてのユーザーコンポーネントに同じ状態(true)が送信され、すべてのユーザーが表示されます。この場合、特定のユーザーを表示する必要があるため、状態はユーザーコンポーネント内にある必要があります。 –

0

を私は単に私のコードに次のようにして、これを解決:

return(
    <li className={active} role='presentation'> 
    <a onClick={() => this.props.updateUserId(this.props.users.Id)}> 
     {this.props.users.Name} 
    </a> 
    {userIdToShow ((I had no check against the "Clicked on User's ID here))? <UserCard 
     key={this.props.users.Id} 
     user={this.props.People[userIdToShow-1]}/> : null} 
    </li> 
) 

を私は何のチェックがなかったので、それはしてカードを4回レンダリングしますそれと同じプロパティ。私はこれをする必要があった

return(
    <li className={active} role='presentation'> 
    <a onClick={() => this.props.updateUserId(this.props.users.Id)}> 
     {this.props.users.Name} 
    </a> 
    {userIdToShow === this.users.props.Id ? <UserCard 
     key={this.props.users.Id} 
     user={this.props.People[userIdToShow-1]}/> : null} 
    </li> 
) 

それは魅力的なように働いた。

関連する問題