2017-10-09 13 views
0

アイコン付きのサイドメニューを作成しました。各アイコンをクリックすると、対応するアイテムがメニューに表示されます。 同じアイテムをクリックするとメニューが閉じますが、別のアイテムはメニューを開いたままにします

const handleCloseWhenOpen = menuOpen ? { onClick: this.closeMenu } : null; 

を使用することにより、私はメニューをICON1をクリックすると、これが開き、再びICON1をクリックすると、メニューが閉じるので、それを作る...小道具として

{...handleCloseWhenOpen} 

を置きます。 icon1をクリックすると、メニューが開き、メニューデータを切り替えるのではなく、icon2をクリックすると、メニューが閉じ、icon2のデータでメニューを再び表示するためにicon2を再度クリックする必要があります。 同じアイコンをクリックして開くと、メニューを閉じるだけです。もう一度クリックします。

ご協力いただければ幸いです。 SidebarNav

export default class SidebarNav extends Component { 
 
    static propTypes = { 
 
    children: PropTypes.any, 
 
    }; 
 
    constructor() { 
 
    super(); 
 
    this.state = { 
 
     menuOpen: false, 
 
     sideBarItems: new List(), 
 
     isSelected: false, 
 
    }; 
 
    } 
 

 
    openMenu = (value) => { 
 
    let menuData = []; 
 
    switch (value) { 
 
     case 'icon1': 
 
     menuData = Data.icon1Data; 
 
     break; 
 
     case 'icon2': 
 
     menuData = Data.icon2Data; 
 
    } 
 
    this.setState({ 
 
     menuOpen: true, 
 
     sideBarItems: menuData, 
 
     selectedIcon: value, 
 
    }); 
 
    } 
 

 
    closeMenu = (value) => { 
 
    this.setState({ 
 
     menuOpen: false, 
 
     selectedIcon: value, 
 
    }); 
 
    } 
 

 
    render() { 
 
    const { 
 
      menuOpen, 
 
      sideBarItems, 
 
      selectedIcon, 
 
      } = this.state; 
 
    const { children } = this.props; 
 
    const handleCloseWhenOpen = menuOpen ? { onClick: this.closeMenu } : null; 
 
    return (
 
    <PageWrapper> 
 
     <SideNav 
 
     onClick={this.openMenu} 
 
     selectedIcon={selectedIcon} 
 
     /> 
 
     <PageContentWrapper> 
 
     <Sidebar.Pushable as={Segment}> 
 
      <PushMenu 
 
      visible={menuOpen} 
 
      sideBarItems={sideBarItems} 
 
      {...handleCloseWhenOpen} 
 
      /> 
 
      <Sidebar.Pusher {...handleCloseWhenOpen}> 
 
      {children} 
 
      </Sidebar.Pusher> 
 
     </Sidebar.Pushable> 
 
     </PageContentWrapper> 
 
    </PageWrapper> 
 
    ); 
 
    } 
 
}

export default class SideNav extends Component { 
 
    static propTypes = { 
 
    onClick: PropTypes.func, 
 
    selectedIcon: PropTypes.any, 
 
    } 
 
    render() { 
 
    const { 
 
      onClick, 
 
      selectedIcon, 
 
      } = this.props; 
 
    return (
 
    <SideBarDiv> 
 
     <IconList> 
 
     { 
 
      Data.icon1Data.map((item, itemIndex) => { 
 
      return (
 
       <IconWrapper 
 
       key={itemIndex} 
 
       className={ 
 
       selectedIcon === item.get('value') 
 
       ? 'Icon-pressed-shadow' 
 
       : 'Icon-right-shadow' 
 
       } 
 
       onClick={() => onClick(item.get('value'))} 
 
       > 
 
        <ListItem> 
 
        <Icon name={item.get('name')} /> 
 
         </ListItem> 
 
       </IconWrapper> 
 
      ); 
 
      }) 
 
     } 
 
     { 
 
      Data.icon2Data.map((item, itemIndex) => { 
 
      return (
 
       <IconWrapper 
 
       key={itemIndex} 
 
       className={ 
 
       selectedIcon === item.get('value') 
 
       ? 'Icon-pressed-shadow' 
 
       : 'Icon-right-shadow' 
 
       } 
 
       onClick={() => onClick(item.get('value'))} 
 
       > 
 
       <ListItem> 
 
        <Icon name={item.get('name')} /> 
 
        <NotificationLabel>3</NotificationLabel> 
 
       </ListItem> 
 
       </IconWrapper> 
 
      ); 
 
      }) 
 
     } 
 
     </IconList> 
 
    </SideBarDiv> 
 
    ); 
 
    } 
 
}

export default class PushMenu extends Component { 
 
    constructor() { 
 
    super(); 
 
    this.state = { 
 
     visible: false, 
 
    }; 
 
    } 
 
    static propTypes = { 
 
    visible: PropTypes.bool, 
 
    sideBarItems: PropTypes.instanceOf(Immutable.List), 
 
    } 
 
    render() { 
 
    const { 
 
      sideBarItems, 
 
      visible, 
 
      } = this.props; 
 
    return (
 
     <Sidebar 
 
     className='Push-menu' 
 
     animation='push' 
 
     width='thin' 
 
     visible={visible} 
 
     > 
 
     <div> 
 
      { 
 
      sideBarItems ? sideBarItems.map((menuTitle, menuTitleIndex) => { 
 
       return (
 
       <div key={menuTitleIndex}> 
 
       <Header>{menuTitle.get('title')}</Header> 
 
       <Linebreak /> 
 
       </div> 
 
      ); 
 
      }) 
 
      : <Header>Content</Header> 
 
      } 
 
     </div> 
 
     <List> 
 
      { 
 
      sideBarItems ? sideBarItems.map((menuItem, menuItemindex) => { 
 
       return (
 
       <li key={menuItemindex}> 
 
        { 
 
        !!menuItem.get('childItems') && 
 
        menuItem.get('childItems').map((childItem) => { 
 
         return (
 
         <div key={childItem.get('name')}> 
 
          <ListItemHeader>{childItem.get('name')}</ListItemHeader> 
 
          <List> 
 
          { 
 
           childItem.get('nestedItems').map((nestedItem) => { 
 
           return (
 
            <ListLink key={nestedItem.get('name')}> 
 
            <Link 
 
             activeStyle={{ fontWeight: 'bold' }} 
 
             to={nestedItem.get('route')} 
 
            > 
 
             <li>{nestedItem.get('name')}</li> 
 
            </Link> 
 
           </ListLink> 
 
           ); 
 
           }) 
 
          } 
 
          </List> 
 
         </div> 
 
        ); 
 
        }) 
 
        } 
 
       </li> 
 
      ); 
 
      }) 
 
      : null 
 
      } 
 
     </List> 
 
      </Sidebar> 
 
    ); 
 
    } 
 
}

答えて

1

状態ましたメニューが開いているかどうかを示すフィールドmenuOpen。これはあなたの実行時にチェックされるものですhandleCloseWhenOpen。 したがって、Icon1をクリックすると、menuOpenがtrueに設定されます。次に、Icon2をクリックすると、menuOpenがチェックされ、trueと判定され、falseに切り替わります。したがって、Icon2をクリックするのではなく、Icon2をクリックするとIcon1のメニューが閉じます。

この動作を修正するには、各アイコンメニューの状態を個別に追跡する必要があります。したがって、SidebarNavの状態をトラッキングする場合は、各アイコンの状態オブジェクトにフィールドを設定することができます。

this.state={ 
    ..... 
    menu1Open:false, 
    menu2Open:false, 
    ..... 
} 

クリックしたアイコンに応じて、切り替えが必要なフィールドを確認します。それに応じてメニューをレンダリングします。

これが複雑になると思われる場合は、SideNavがそれぞれ独自の状態をトラッキングし、メニューデータをアイコンに渡して、メニューの開閉をクリックアクションで切り替えることができます。

+0

「各アイコンのフィールド」とはどういう意味ですか?小道具のように? – StuffedPoblano

+0

それは理にかなっています。ありがとうございました。これが答えです。それは有り難いです。 – StuffedPoblano

+0

もし私がそれが12のアイコン/メニューがあるので、私はそれがそうすると思う、乱雑になると思う... 2番目のオプションは、SideNavに自分の状態を追跡させることです。だから、私はちょうどSideNavコンポーネントのコンストラクタを正しい?元の投稿を編集してPushMenuコンポーネントを追加しました。 – StuffedPoblano

関連する問題