2017-01-16 80 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