2017-06-14 54 views
0

我試圖通過重建代理網站來實踐React。我正在製作一個有員工圖像的部分,點擊其中一張圖像可以打開相關的員工生物模型。圖像和BIOS是分開的包含div。React - 一個事件處理程序來切換多個相似元素之一

感覺就像我應該能夠編寫一個事件處理程序,根據點擊哪個圖像來查找並打開相關生物(可能使用類似data屬性的東西?),但我無法弄清楚我的「 d需要添加。

目前我只是有一個點擊處理程序切換一個'活躍'狀態。然後將該狀態添加爲className以切換模式是否顯示。問題的關鍵在於它不區分BIOS,所以無論點擊哪個生物,它們都會顯示。

在情況下,它是非常有用的,這是我的員工生物「組件:

const StaffBio = (props) => { 
return (
    <div className={`teamMemberOverlay ${props.active}`} onClick={props.onClick}> 
     <div className="teamMemberExpanded"> 
      <h6>{props.name}</h6> 
      <div className="seperator"></div> 
      <p className="title">{props.title}</p> 
     </div> 
    </div> 
); 
} 

正在使用這樣的:

<StaffBio name="NAME HERE" title="TITLE HERE" active={this.state.active} onClick={this.showBio} /> 

到目前爲止,我已經有了設置爲圖像如下:

<img src={PaulIllustration} className="staffPhoto" onClick={this.showBio} /> 

最後,我的事件處理程序:

showBio() { 
    let toggle = this.state.active === 'is-active' ? '' : 'is-active'; 
    this.setState({active: toggle}); 
} 
+0

你可以發佈,其中定義了'showBio'方法的組件? – BravoZulu

回答

1
class AboutUsSlider extends Component { 
    constructor(props) { 
    super(props); 
    this.showBio = this.showBio.bind(this) 
    this.next = this.next.bind(this) 

    this.state = { active: null } 
} 

next() { 
    this.refs.slider.slickNext() 
} 

showBio(id) { 
    this.setState({active: id}); 
} 
hideBio(){ 
    this.setState({active: null}); 
} 

render() { 
    var settings = {...} 
    const people = [{name: 'Paul', title: 'some title'}, {name: 'Ben', title: 'other'}, ...]; 

return (
    <div> 
    <Slider ref="slider" {...settings}> 
    <div className="sliderPage"> 
     <h2>Meet our team</h2> 
     <div className="seperator"></div> 
     <div className="teamPhotos"> 
     { // When setting the index, you should use something unique, I'll use the name here. 
     people.map((p, index) => 
      <img key={p.name} src={`${p.name} + 'Illustration'`} className="staffPhoto" onClick={() => this.showBio(index)}) /> 
     } 
     </div> 
     <Button BGColor="#009ECC" text="Our process" onClick={this.next} /> 
    </div> 
    </Slider> 
    { this.state.active && <StaffBio name={people[this.state.active]} title={people[this.state.active].title} onClick={this.hideBio}/> 
    </div> 
) 
} 

EDITED

有一對夫婦的事情可以做。

每個人可能都有一個ID來標識它。所以,你可以修改你的showBio看起來像這樣:

showBio(id) { 
    this.setState({ active: id }) 
} 

這樣一來,你這人是目前在您的狀態活躍。

你還需要改變你的img

<img src={PaulIllustration} className="staffPhoto" onClick={() => this.showBio(PaulId)} /> 

PaulId將是每個人不同。

而且你StaffBio

<StaffBio name="NAME HERE" title="TITLE HERE" active={this.state.active == personId} onClick={this.showBio} /> 


const StaffBio = (props) => { 
    return (
    <div className={`teamMemberOverlay ${props.active ? 'is-active' : ''}`} onClick={props.onClick}> 
    <div className="teamMemberExpanded"> 
     <h6>{props.name}</h6> 
     <div className="seperator"></div> 
     <p className="title">{props.title}</p> 
    </div> 
    </div> 
); 
} 
+0

感謝您的幫助。當實現這個時,我得到'PaulId'沒有被定義,'personId'沒有被定義。可能錯過了一些非常明顯的事情,因爲我的頭腦有點亂!以下是showBio中定義的組件:https://jsfiddle.net/nannyro5/1/ – Robkwood

+0

你從哪裏獲取數據?或者它只是靜態的?如果它是靜態的,你可以使用索引作爲ID。我會用ShowBio組件更新我的答案 – BravoZulu

+0

現在只是靜態的 - 謝謝!如果將它從其他地方引入,我認爲最好映射數據並以這種方式分配密鑰?雖然這是一個單獨的問題,我知道..! – Robkwood

相關問題