React-Router와의 활성 링크?


91

React-Router (v4)를 시도 중이며 Nav를 시작하여 Link's 중 하나를 사용하는 데 문제가 있습니다 active. Link태그 중 하나를 클릭 하면 활성 항목이 작동하기 시작합니다. 그러나 홈 Link/경로 에서로드되는 구성 요소이기 때문에 앱이 시작되는 즉시 활성화 되기를 원합니다 . 이것을 할 방법이 있습니까?

내 현재 코드는 다음과 같습니다.

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <Link activeClassName='is-active' to='/'>Home</Link> {/* I want this to start off as active */}
        <Link activeClassName='is-active' to='/about'>About</Link>
      </Nav>

      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)

답변:


218

<Link>더 이상 activeClassName또는 activeStyle속성 이 없습니다 . react-router v4에서 <NavLink>조건부 스타일을 지정하려면 다음 을 사용해야 합니다.

const Router = () => (
  <BrowserRouter>
    <div>
      <Nav>
        <NavLink exact={true} activeClassName='is-active' to='/'>Home</NavLink>
        <NavLink activeClassName='is-active' to='/about'>About</NavLink>
      </Nav>

      <Match pattern='/' exactly component={Home} />
      <Match pattern='/about' exactly component={About} />
      <Miss component={NoMatch} />
    </div>
  </BrowserRouter>
)

나는 집에 정확한 속성을 추가 <NavLink>내가 꽤 확실하기 때문에 그것없이, 홈 링크는 항상 활성화 될 것이라고 해요 /일치합니다 /about그리고 당신은 다른 페이지.


2
NavLink를 사용하면 언뜻보기에 문제를 피할 수 있다고 생각했기 때문에 오늘이 대답을 간과했습니다. 이것을 설명하는 다른 곳을 찾기가 어렵습니다. 사람들은 그가 정확히 옳기 때문에이 답변을 찬성 할 필요가 있습니다. NavLink를 사용해야합니다. 또한! exact = {true}도 정확히 맞습니다. 그렇지 않으면 홈이 항상 활성화되도록 다른 링크를 클릭 할 때 렌더링되는 첫 번째 링크가 다시 렌더링되지 않습니다. 10 번 더 찬성 할 수 있으면 좋겠습니다.
wuno

4
Redux와 함께 React를 사용하는 경우이 github.com/ReactTraining/react-router/blob/master/packages/…
Petr Adam

1
중첩 된 경로의 경우, 당신은 사용해야 할 수도 있습니다 exact에 대한 NavLink도.
Wiktor Czajkowski

1
@PetrAdam이라는 링크에 감사드립니다. 왜 이것이 작동하지 않는지 궁금했습니다! (해결책은으로 connect전화 를 래핑하는 것 입니다 withRouter).
Brian Burns

1
redux가 re-render를 차단하지 않도록 메소드에 옵션 pure: false을 제공 할 수 있습니다 connect(). 업데이트되지 않는 뷰에 대한 추가 정보 : https://github.com/reduxjs/react-redux/blob/master/docs/troubleshooting.md
Pateta
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.