2017-08-31 52 views
2

我想在React中使用Material-UI中的列表,其中列表也具有嵌套項目。我有這樣的代碼:如何使Material UI List只打開一個List Item?

<List> 
    {this.state.categories.map(category => { 
     return (
      <ListItem key={category.categoryID} 
         primaryText={category.name} 
         nestedItems={[ 
          category.subcategories.map(subcat => { 
           return (
            <ListItem key={subcat.subcatID} 
              primaryText={subcat.name} /> 
          ) 
          }) 
         ]} /> 
     ) 
    })} 
</List> 

雖然,在它的工作原理目前的形式,它具有列表的默認設置,這意味着我可以擴展多個ListItems看到自己nestedItems。但是,我想要有類似手風琴的行爲。用戶每次只能擴展一個ListItem以查看其nestedItems。所以,如果一個已經擴展,並且用戶點擊擴展另一個,那麼已經擴展的第一個應該被關閉,並且應該擴展新按下的那個。任何想法如何使用Material UI中的List元素來實現此目的?

回答

1

而不是使用列表,使用SelectableList並以相同的方式定義ListItems。要控制SelectableList的打開/關閉行爲,請將屬性open與每個主列表項目一起使用。

查看本文的最後一個例子DOC page。

代碼:

定義在狀態變量的值:

value: ''; //no list will be in open state initially 

與SelectableList的定義值屬性:

<SelectableList value={this.state.value}> 
    <ListItem 

     value = {1} 
     open = {this.state.value == 1? true: false} 
     onClick = {() => this._click(1)} 

     primaryText="Brendan Lim" 
     primaryTogglesNestedList={true} 

     nestedItems={[ 
      <ListItem 
       value='a' 
       primaryText="Grace Ng" 
      />, 
     ]} 
    /> 
    <ListItem 

     value = {2} 
     open = {this.state.value == 2? true: false} 
     onClick = {() => this._click(2)} 

     primaryText="Brendan Lim" 
     primaryTogglesNestedList={true} 
     nestedItems={[ 
      <ListItem 
       value='b' 
       primaryText="Grace Ng" 
      />, 
     ]} 
    /> 
</SelectableList> 


_click(value){ 
    this.setState({value}); 
} 

進出口點數:

1-僅在主ListItems上定義onClick,而不在子項上定義。

2-內部_onClick傳遞與您使用主ListItem定義的值相同的值。

3-僅在主列表項上定義打開屬性,而不在子項上定義打開屬性。

4-如果狀態值與該列表項的值相同,則將條件置於打開屬性中,然後打開該列表並關閉所有其他列表。

+0

但是,這仍然可以擴展儘可能多的項目,我想要的。 – typos

+0

雅,默認情況下,我們可以打開任何項目但沒有列表項「open」的屬性,我們可以使用它來控制打開和關閉行爲,使用它並一次只打開一個項目,它將起作用。 –

+0

@typos檢查更新的答案,本地工作正常,讓我知道你是否有任何疑問:) –

0

一種方法是跟蹤selectedItem,然後只渲染其嵌套項目。例如:

<List> 
    {this.state.categories.map(category => 
    <ListItem 
     key={category.categoryID} 
     primaryText={category.name} 
     nestedItems={ 
     category.categoryID === selectedItem ? [ 
      category.subcategories.map(subcat => 
      <ListItem key={subcat.subcatID} primaryText={subcat.name} /> 
     ), 
     ] : [] 
     } 
    /> 
)} 
</List> 
+0

'selectedItem'在哪裏?我相信它不是'List'的屬性? – typos

+0

您需要創建它。無論是作爲組件的「道具」還是「狀態」道具。所以每次點擊某個項目時,都會更新'selectedItem'值。 – mersocarlin

+0

謝謝。但是,我收到一條錯誤消息,提供了'nestedItems'中的布爾值。 – typos