navitem의 React-Bootstrap 링크 항목


85

react-router 및 react-bootstrap을 사용하여 스타일링 문제가 있습니다. 아래는 코드 스 니펫입니다.

import { Route, RouteHandler, Link } from 'react-router';
import AuthService from '../services/AuthService'
import { Button, Nav, Navbar, NavDropdown, MenuItem, NavItem } from 'react-bootstrap';

    <Nav pullRight>
      <NavItem eventKey={1}>
        <Link to="home">Home</Link>
      </NavItem>
      <NavItem eventKey={2}>
        <Link to="book">Book Inv</Link>
      </NavItem>
      <NavDropdown eventKey={3} title="Authorization" id="basic-nav-dropdown">
        <MenuItem eventKey="3.1">
          <a href="" onClick={this.logout}>Logout</a>
        </MenuItem>          
      </NavDropdown>  
    </Nav>

이것이 렌더링 할 때의 모습입니다.

여기에 이미지 설명 입력

나는 이것이 <Link></Link>원인 이라는 것을 알고 있지만 이유를 모르겠습니까? 나는 이것이 인라인되기를 바랍니다.

답변:


5

내부에 앵커를 두지 마십시오 NavItem. 이렇게하면 콘솔에 경고가 표시됩니다.

Warning: validateDOMNesting(...): <a> cannot appear as a descendant of <a>. See Header > NavItem > SafeAnchor > a > ... > Link > a.

NavItem렌더링 될 때 앵커 (의 직계 자식 NavItem)가 이미 존재하기 때문입니다.

위의 경고로 인해 react는 두 앵커를 형제로 취급해야하므로 스타일 문제가 발생했습니다.



3
예를 들어 주시겠습니까?
Paschalidis Christos

5
내가 받아 들인 대답이 아니라 두 번째 대답으로 문제가 해결되는 유일한 사람인가?
Ejaz Karim

1
@chadschmidt에 허용 대답을 변경하십시오 stackoverflow.com/a/36933127/1826429
골 디

247

react-router-bootstrap 에서 LinkContainer 를 사용 하는 것이 좋습니다. 다음 코드가 작동합니다.

import { Route, RouteHandler, Link } from 'react-router';
import AuthService from '../services/AuthService'
import { Button, Nav, Navbar, NavDropdown, MenuItem, NavItem } from 'react-bootstrap';
import { LinkContainer } from 'react-router-bootstrap';

/// In the render() method
<Nav pullRight>
  <LinkContainer to="/home">
    <NavItem eventKey={1}>Home</NavItem>
  </LinkContainer>
  <LinkContainer to="/book">
    <NavItem eventKey={2}>Book Inv</NavItem>
  </LinkContainer>
  <NavDropdown eventKey={3} title="Authorization" id="basic-nav-dropdown">
    <LinkContainer to="/logout">
      <MenuItem eventKey={3.1}>Logout</MenuItem>    
    </LinkContainer>      
  </NavDropdown>  
</Nav>

이것은이 문제를 인터넷 검색 할 때 미래의 자신에 대한 메모입니다. 다른 사람이 대답을 통해 도움을 받기를 바랍니다.



4
activeClassName을 토글하는 것은 어떻습니까?
Anyul 리 바스

이 작업을 수행 할 수 없으면 경로가 React Router에 포함되어 있는지 확인하십시오.
Anant Simran Singh

8
NavItems에 "활성"스타일을 적용하지 못합니다.
다니엘 Arant

1
아래에 active / activeKey가 작동하지 않는 문제를 해결하는 답변을 추가했습니다. react-bootstrap v_1.0 베타에서도 작동합니다! (일반 버전과 함께 사용하려면 NavItem 등에서 Nav.Item을 빼기 만하면됩니다.)
Young Scooter

49

2020 upd :react-boostrap: 1.0.0-beta.16 및 테스트react-router-dom: 5.1.2

2019 upd : react-bootstrap v4 (현재 1.0.0-beta.5 사용) 및 react-router-dom v4 (4.3.1)로 작업하는 사용자는 Nav.Link의 "as"prop을 사용하세요. 예:

import { Link, NavLink } from 'react-router-dom'
import { Navbar, Nav } from 'react-bootstrap'

<Navbar>
  {/* "Link" in brand component since just redirect is needed */}
  <Navbar.Brand as={Link} to='/'>Brand link</Navbar.Brand>
  <Nav>
    {/* "NavLink" here since "active" class styling is needed */}
    <Nav.Link as={NavLink} to='/' exact>Home</Nav.Link>
    <Nav.Link as={NavLink} to='/another'>Another</Nav.Link>
    <Nav.Link as={NavLink} to='/onemore'>One More</Nav.Link>
  </Nav>
</Navbar>

다음은 작업 예제입니다 : https://codesandbox.io/s/3qm35w97kq


방금 시도했지만 'as = {NavLink}'에서는 작동하지 않습니다.
lannyboy

1
이것은 react-bootstrap 1을 사용하는 react router v5에서 작동하고 react 16.8
proc

저는 boostrap vue가 단순히 "to"매개 변수를 구현하고 관리하는 Vue.js에서 왔으며 훨씬 더 쉽습니다. 어쨌든 팁을 주셔서 감사합니다. 많은 도움이되었습니다!
egdavid

1
대신에이 솔루션을 사용 LinkContainer에서 react-router-bootstrap이 솔루션을 지원하기 때문에를 activeClassName.
takasoft

@Alexey 감사합니다. LinkContainer가 작동하도록 몇 시간을 보냈고이 답변을 찾았습니다.
David Easley

31

react-bootstrap을 사용해 보셨습니까 componentClass?

import { Link } from 'react-router';
// ...
<Nav pullRight>
  <NavItem componentClass={Link} href="https://stackoverflow.com/" to="/">Home</NavItem>
  <NavItem componentClass={Link} href="https://stackoverflow.com/book" to="/book">Book Inv</NavItem>
</Nav>

1
이것은 잘 작동합니다! 스타일 문제가 없으며 재정의가 필요한 다른 답변보다 훨씬 간단합니다. href / to의 반복을 피하기 위해 HoC로 재정의 할 수도 있습니다.
Tim Lind

1
이것은 너무 깨끗해서 지금 외부 링크에 "target blank"와 함께 사용했고 매우 잘 작동합니다. 감사합니다
Saulo 고메스

1
다른 패키지를 포함 할 필요없이 더 좋습니다.
sbk201

2
1.0.0-beta.5로 업그레이드했습니다. componentClass :(
Nate-Bit Int

12

LinkContainerreact-router-bootstrap에서 사용 을 피할 수 있습니다 . 그러나 다음 릴리스에서 componentClassas예정입니다. 따라서 마지막 버전 (v1.0.0-beta)에 대해 다음 스 니펫을 사용할 수 있습니다.

<Nav>
    <Nav.Link as={Link} to="/home" >
        Home
    </Nav.Link>
    <Nav.Link as={Link} to="/book" >
        Book Inv
    </Nav.Link>
    <NavDropdown title="Authorization" id="basic-nav-dropdown">
        <NavDropdown.Item onClick={props.logout}>
            Logout
        </NavDropdown.Item>
    </NavDropdown>
</Nav>

5

다음은 react-router 4와 함께 사용하는 솔루션입니다.

import * as React from 'react';

import { MenuItem as OriginalMenuItem, NavItem as OriginalNavItem } from 'react-bootstrap';

export const MenuItem = ({ href, ...props }, { router }) => (
  <OriginalMenuItem onClick={e => {e.preventDefault();router.transitionTo(href)}} href={href} {...props}/>
);

MenuItem.contextTypes = {
  router: React.PropTypes.any
};

export const NavItem = ({ href, ...props }, { router }) => (
  <OriginalNavItem onClick={e => {e.preventDefault();router.transitionTo(href)}} href={href} {...props}/>
);

NavItem.contextTypes = {
  router: React.PropTypes.any
};

사용하는 대신 router.transitionTo(href)사용router.history.push(href)
Devasatyam

2

히스토리 를 사용할 수 있습니다 . 라우터로 구성 요소를 만들어야 합니다 .

App.js에서 :

// other imports
import {withRouter} from 'react-router';

const NavigationWithRouter = withRouter(Navigation);

//in render()
    <NavigationWithRouter />

Navigation.js에서 :

//same code as you used before, just make an onClick event for the NavItems instead of using Link

<Nav pullRight>
  <NavItem eventKey={1} onClick={ e => this.props.history.push("/home") } >
    Home
  </NavItem>
  <NavItem eventKey={2} onClick={ e => this.props.history.push("/book") } >
    Book Inv
  </NavItem>
</Nav>

2

IndexLinkContainer는 내부 NavItem 에서 현재 선택을 기반으로 활성화 된 항목을 강조 표시 하도록하려면 LinkContainer보다 나은 옵션 입니다. 수동 선택 핸들러가 필요하지 않습니다.

import { IndexLinkContainer } from 'react-router-bootstrap';
....

//Inside render
<Nav bsStyle="tabs" >
  <IndexLinkContainer to={`${this.props.match.url}`}>
    <NavItem >Tab 1</NavItem>
  </IndexLinkContainer>
  <IndexLinkContainer to={`${this.props.match.url}/tab-2`}>
    <NavItem >Tab 2</NavItem>
  </IndexLinkContainer>
  <IndexLinkContainer to={`${this.props.match.url}/tab-3`}>
    <NavItem >Tab 3</NavItem>
  </IndexLinkContainer>
</Nav>

탭을 사용하고 있지 않지만 탐색 모음의 링크를 활성으로 강조 표시하고 싶습니다. IndexLinkContainer를 사용해 보았지만 지시 한대로 작동하지 않습니다. 경로로 직접 이동하면 올바른 경로가 강조 표시되지만 링크 만 클릭하면 표시되지 않습니다.
Thomas Le

btw just curios 어떻게 찾았 IndexLinkContainer습니까? 상점 워드 프로세서에서 어느 곳을 찾을 수 없습니다 ...
티엠 응우 엔

@ThomasLe Component 대 PureComponent 사용을 확인하십시오. Component
FrozenKiwi

0

react-bootstrap v_1.0 베타에서 "activeKey"prop으로 기능을 추가하려면 다음 형식을 사용하세요.

<Nav activeKey={//evenKey you want active}>
    <Nav.Item>
        <LinkContainer to={"/home"} >
            <Nav.Link eventKey={//put key here}>
                {x.title}
            </Nav.Link>
        </LinkContainer>
    </Nav.Item>
    //other tabs go here
</Nav>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.