react-router-dom: 4.2.2
を使用しています。現在のURLにactiveClassName
を追加できます。しかし、驚くべきことに、クラスは常にルートURLに追加されます。
以下のスクリーンショットのようなエラーページなどのページにアクセスすると、ホームナビゲーションリンクもactiveClassを取得します。
更新:上記のスクリーンショットでは、http://localhost:3000/#/error
にアクセスしたことを示しました。したがって、active-link
はLove Error?
NavLinkにのみ追加する必要があります。しかし、ご覧のとおり、Home
NavLinkにも追加されます。
これが私のnavbarコードです:
import React from 'react';
import { NavLink } from 'react-router-dom';
export const NavigationBar = () => (
<ul className="horizontal-menu">
<li> <NavLink to = '/' activeClassName="active-link">Home</NavLink> </li>
<li> <NavLink to = '/about' activeClassName="active-link">About Us</NavLink> </li>
<li> <NavLink to = '/error' activeClassName="active-link">Love Error?</NavLink> </li>
</ul>
)
ルーティングには、次のスイッチを使用しました。
<Switch>
<Route exact path = '/' component = {Home} />
<Route exact path = '/about' component = {AboutUs} />
<Route exact path = '/error' component = {Error404} />
<Route path = "/news/:id" component = {NewsDetail} />
<Route path="*" component={Error404} />
</Switch>
期待される動作を得るにはどうすればよいですか?
リンクがアクティブかどうかを確認するには、isActive={}
を使用して検証を追加する必要があります。
動作しています jsFiddle 。 (フィドルは私が作成したものではありません)
追加する必要があるコードは以下のとおりです
Jsfiddleの例
<li><NavLink to="/" isActive={checkActive}>Home</NavLink></li>
コードの変更
<li> <NavLink to='/' activeClassName="active-link" isActive={checkActive}>Home</NavLink> </li>
isActiveプロパティをチェックし、「checkActive」は関数です。
const checkActive = (match, location) => {
//some additional logic to verify you are in the home URI
if(!location) return false;
const {pathname} = location;
console.log(pathname);
return pathname === "/";
}
使用できる別の設定は「exact」ですが、jsFiddleでそれを示すことはできません。コードは次のようになると思います
<li> <NavLink exact to='/' activeClassName="active-link">Home</NavLink> </li>
お役に立てれば。さらに詳しい情報が必要な場合はお知らせください。
最初のexact
の前にactiveClassName
を追加しても機能することがわかりました。したがって、たとえば、次のように設定できます。
export const NavigationBar = () => (
<ul className="horizontal-menu">
<li><NavLink to='/' exact activeClassName="active-link">Home</NavLink>
</li>
....remaining NavLinks
</ul>
)
次のようなアクティブなクラスにはexact
キーワードを使用できます
<NavLink exact to ='/'>Home</NavLink>
それはそのように生成されます
<a href="/" class="active" aria-current="page">Home</a>
あなたが別のページを取得する場合、それはそのようなものになります
<a href="/">Home</a>
私は最近この問題に遭遇し、単に追加することで解決しました:
import { withRouter } from 'react-router-dom';
次にコンポーネントをラップします:
export default withRouter(Component);
コードの変更
<li> <NavLink to='/' activeClassName="active-link" isActive={checkActive}>Home</NavLink> </li>
その後
const checkActive = (match, location) => {
console.log(location);
if (!location) return false;
const { pathname } = location;
const { url } = match;
return pathname === url ? true : false;
};
const { pathname } = location; const { url } = match; return pathname === url ? true : false;
私はReactを今学んでいて、ちょうど同じ問題に出くわしました。私は次のことを試みました、そしてそれは私のために働きました。
したがって、3つのナビゲーションリンクがあります。
<li><NavLink to="/home">Home</NavLink></li>
<li><NavLink to="/about">About</NavLink></li>
<li><NavLink to="/contact">Contact</NavLink></li>
しかし、4つのルートを追加しました。
<Route exact path="/" component={Home}></Route>
<Route path="/home" component={Home}></Route>
<Route path="/about" component={About}></Route>
<Route path="/contact" component={Contact}></Route>
同じコンポーネント(ホーム)に2つのルート(/および/ home)を追加しました。このように、react-router-domは、クリックしたリンクにのみ「アクティブ」クラスを追加するように見えます。
ホームの場合、Link
の代わりにNavLink
を使用できます。
import { Link } from 'react-router-dom';
<Link to='/'>Home</Link>