2017-01-16 17 views
2

私はこの特定のコードを持っており、それぞれの質問とボタンのリストを示しています。ボタンをクリックすると、質問に対する特定の回答が表示されます。私の問題は、私はたくさんの質問があります。ボタンをクリックすると、その質問に対する特定の回答ではなく、すべての回答が表示されます。ここで特定の要素に表示/非表示を切り替えます

はコード

class App extends React.Component { 
constructor(){ 
    super() 
    this.state = { 
        answer: [], 
        isHidden: true 
       } 
    this.toggleHidden = this.toggleHidden.bind(this) 
} 

componentWillMount(){ 
    fetch('http://www.reddit.com/r/DrunkOrAKid/hot.json?sort=hot') 
    .then(res => res.json()) 
    .then((data) => { 
     const answer = data.data.children.map(obj => obj.data); 
     this.setState({answer}); 
    }) 
} 

toggleHidden(){ 
    this.setState({isHidden: !this.state.isHidden}) 
} 

render(){ 
    const answer = this.state.answer.slice(2) 
    return <div> 
      <h1>Drunk or Kid</h1> 
      {answer.map(answer => 
       <div key={answer.id}> 
       <p className="title">{answer.title}</p> 
       <button onClick={this.toggleHidden}>Answer</button> 
       {!this.state.isHidden && <Show>{answer.selftext}</Show>} 
       </div> 
      )} 
      </div> 
    } 
} 
const Show = (props) => <p className="answer">{props.children}</p> 

そしてここにあるここcodepen

+1

すべての回答が同じisHidden状態を共有しています。だから、あなたがその状態ブール値をトグルすると、それらのすべてが表示されます。独立して切り替えるには、各回答のisHidden状態を分離する必要があります。 Reactはコンポーネントに基づいて設計されているので、各質問/回答の組み合わせごとに 'isHidden'状態のコンポーネントを作成し、そのデータをマップしてインスタンスを作成することをお勧めします。 –

答えて

1

へのリンクが私の提案に基づいてCodepenです:

子コンポーネントの基本は次のようになります。

class Question extends React.Component { 
    // Set initial state of isHidden to false 
    constructor() { 
    super(); 
    this.state = { 
     isHidden: false 
    } 
    } 
    // Toggle the visibility 
    toggleHidden() { 
    this.setState({ 
     isHidden: !this.state.isHidden 
    }); 
    } 
    // Render the component 
    render() { 
    const { answer } = this.props; 
    return (
     <div key={answer.id}> 
     <p className="title">{answer.title}</p> 
     <button onClick={() => this.toggleHidden() }>Answer</button> 
     {this.state.isHidden && <Show>{answer.selftext}</Show>} 
     </div> 
    ); 
    } 
} 

次に、親コンポーネント内で次のように表示されます。

answer.map(answer => 
    <Question answer={answer} key={answer.id} /> 
) 
+0

''なぜ 'onClick = this.toggleHidden'の代わりにコールバックを置いていますか?私の元のコードでは、 'onClick = this.toggleHidden'トグルが機能しますが、コードの中に貼り付けようとしたときに、setStateを未定義に設定できないと言いますか?しかし、答えをありがとう。 – Irsyad14

+0

@ Irsyad14コンストラクタにバインディングを追加する必要があります。私はすぐに解決策を書いていました。 'this.toggleHidden = this.toggleHidden.bind(this)' –

+0

これで私はそれを手に入れました。愚かな私。私はちょっと反応して新鮮です。再度、感謝します – Irsyad14

関連する問題