2015-06-20 35 views
1

爲了更好地理解我的問題組件的狀態,看看我的組件圖:https://app.box.com/s/rkq9bhyzs00971x6xgpq8exmvu4zzjlt改變不直接處理事件ReactJs

通過查看圖像,你可以看到我基本上是有一個組件結構

Browse Widget 
    -Main Menu 
    -Display 
    -SubMenu 
     -SubCategory 
     -SearchBar 
    -Video Display 

我的顯示組件包含從API中提取的所有組件。但是他們依賴於瞭解MainMenu組件具有活動的選項卡以進行正確的查詢。每次點擊一個Tab時,我想更新Display的狀態(使用來自API的新調用)。這可能嗎?

我對於如何改變組件上的狀態並不直接處理事件本身有點遺憾?

我需要改變我的組件結構,或者是否有更好的方法來做到這一點?您可以指向/製作的任何示例?

+0

我想你可以創建一個JavaScript自定義事件來觸發標籤變化,並在顯示組件,該事件 –

+0

反應你能提供一個例子添加監聽? – ApathyBear

+0

請查看https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events –

回答

1

我建議跟蹤活動選項卡並管理DisplayController組件中的所有API調用。使用下面的結構應該足以讓你開始。數據獲取函數存在於Display組件中,並通過道具中的回調傳遞給其他組件。

var DisplayController = React.createClass({ 
    getInitialState: function(){ 
     return { 
      active_tab: 0, display_data: [], 
      tabs: [{name: 'Tab 0', tab_id: 0}, {name: 'Tab 1', tab_id: 1}, {name: 'Tab 2', tab_id: 2}] 
     }; 
    } 
    changeTab: function(tab_id){ 
     this.setState({active_tab: tab_id}, apiCall); 
    } 
    apiCall: function(){ 
     //make api call based off of this.state.active_tab 
     //this.setState({display_data: whatever you get back from api}) 
    } 
    render: function(){ 
     dprops = { 
      tabs: this.state.tabs. 
      changeTab: this.changeTab, 
      active_tab: this.state.active_tab, 
      display_data: this.state.display_data 
     }; 
     return (<MainMenu {...dprops}/>); 
    } 
}); 

var MainMenu = React.createClass({ 
    changeTab: function(tab_id){ 
     this.props.changeTab(tab_id); 
    }, 
    render: function(){ 
     tabs = this.props.tabs.map(function(tab){ 
      return <Tab onClick={this.changeTab.bind(tab.tab_id)} name={tab.name} key={tab.tab_id}/> 
     }.bind(this)); 
     return(
      <div> 
       {tabs} 
       <Display {...this.props} /> 
      </div> 
     ); 

    } 
}); 

var Tab = React.createClass({ 
    render: function(){ 
     // make your tab component here from this.props.name 
    } 
}); 
var Display = React.createClass({ 
    render: function(){ 
     // make your display component here using data from this.props 
    } 
}); 
+0

我注意到你使用了SubMenu,你的意思是使用MainMenu(就像我的組件?)。也不會假定父母/子女關係。我正在尋找顯示器以瞭解主菜單(其兄弟)的情況。 – ApathyBear

+0

我試圖澄清我編輯中的命名。有一個父組件(DisplayController)管理其狀態的數據是很好的,然後它的子組件可以通過道具對狀態的變化作出反應。這可以保持您的組件的一致性,同時只需要在一個地方更新數據。 – Mark

+0

謝謝。抱歉打擾另一個問題,但你會在哪裏聽changeTab事件?你在標籤本身上放置onClicks嗎?如果是這樣,那麼DisplayController中的changeTab如何運行? – ApathyBear