2017-10-09 9 views
0

아이콘이있는 사이드 메뉴를 만들었으며 각 아이콘을 클릭하면 메뉴가 해당 항목과 함께 슬라이드 아웃됩니다. 동일한 항목을 클릭하면 메뉴가 닫히지 만 다른 항목은 메뉴를 열어 두는 경우

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

를 사용하여 나는 메뉴를 icon1를 클릭하면이 열리고 다시 icon1을 클릭하면 메뉴가 닫힙니다 그래서하게 ... 소품으로

{...handleCloseWhenOpen} 

퍼팅. icon1을 클릭하면 메뉴가 열리고 아이콘 데이터가 전환되는 대신 icon2가 열리고 메뉴가 닫히고 icon2에 대한 데이터가있는 메뉴가 다시 표시되게하려면 icon2를 다시 클릭해야합니다. 동일한 아이콘을 클릭하여 다시 열면 해당 메뉴가 닫히기를 원합니다.

도움이 될 것입니다.

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

SidebarNav이 된 상태가 보유 메뉴가 열려 있는지 여부를 추적하는 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 개의 아이콘/메뉴가 있기 때문에 엉망이 될 것이라고 생각한다면 ... 두 번째 옵션은 SideNav가 자체 상태를 추적하도록하는 것입니다. 그래서 SideNav 구성 요소에서 생성자를 올바르게 수행합니까? PushMenu 구성 요소를 포함하도록 원래 게시물을 편집했습니다. – StuffedPoblano