Я изучаю React Router и следую этот учебник Все ясно и работает, как указано (спасибо автору), за исключением проблемы, которая выделяет активную ссылку NavLink.
Взгляните на файл css и обратите внимание на класс .current:
nav ul {
list-style: none;
display: flex;
background-color: black;
margin-bottom: 20px;
}
nav ul li {
padding: 20px;
}
nav ul li a {
color: white;
text-decoration: none;
}
.current {
border-bottom: 4px solid white;
}
Когда я загружаю приложение, ссылка «Домой» на навигационной панели выделяется белой нижней линией границы, но остается выделенной, даже когда я нажимаю ссылку «О себе» или ссылку «Контакт». Я следил за всем шаг за шагом, но вот эту проблему я не могу понять.
После прочтения реактивного документа о NavLink и многих онлайн-руководств, я все еще не знаю, как это исправить.
Вот когда я нажимаю на ссылку "О нас"

Вот когда я нажимаю ссылку "Контакты"

Вот как пример маршрута учебника
<nav>
<ul>
<li><NavLink exact activeClassName = "current" to='/'>Home</NavLink></li>
<li><NavLink exact activeClassName = "current" to='/about'>About</NavLink></li>
<li><NavLink exact activeClassName = "current" to='/contact'>Contact</NavLink></li>
</ul>
</nav>
Обратите внимание, что ссылка Home остается с активной белой линией под ней, несмотря на то, что это больше не активная ссылка.
Добавление activeClassName = "current" предполагает выделение текущего представления белым подчеркиванием, но домашняя ссылка остается выделенной белым подчеркиванием.
Итак, всем вам с многолетним опытом, пожалуйста, помогите.
Вот мой app.js
import React, { Component } from 'react';
import './App.css';
import Main from './components/main';
import Navigation from './components/navigation';
class App extends Component {
render() {
return (
<div>
<h1> React Router </h1>;
<h5> import 'BrowserRouter' from 'react-router-dom' in Appjs</h5>
<hr></hr>
<Navigation />
<Main />
</div>
);
}
}
export default App;
Вот мой index.js
import React from 'react';
import ReactDOM from 'react-dom';
//Add browserrouter to use it in your app
import { BrowserRouter } from 'react-router-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
//this router example is from this site
//https://blog.pusher.com/getting-started-with-react-router-v4/
/*
You can only pass a single child element to a Router,
so it is necessary to create a root component
that renders the rest of your application and
then pass that in as the child of the Router.
*/
ReactDOM.render((
<BrowserRouter>
<App />
</BrowserRouter>
), document.getElementById('root'));
Вот мой main.js
import React, { Component } from 'react';
import { NavLink, Switch, Route } from 'react-router-dom';
import Home from './home';
import About from './about'
import Contact from './contact'
class Main extends Component {
render() {
return (
<div>
<p> My main component </p>
<Switch>
<Route exact = {true} path='/' component = {Home}></Route>
<Route path='/about' component = {About}></Route>
<Route path='/contact' component = {Contact}></Route>
</Switch>
</div>
);
}
}
export default Main;
И, наконец, мой navigation.js
import React, { Component } from 'react';
import { NavLink } from 'react-router-dom';
class Navigation extends Component {
render() {
return (
<div>
<p> My Navigation component </p>
<nav>
<ul>
<li><NavLink to='/'> Home </NavLink> </li>
<li><NavLink to='/about'> About </NavLink> </li>
<li><NavLink to='/contact'> Contact </NavLink> </li>
</ul>
</nav>
</div>
);
}
}
export default Navigation;






Вы должны добавить свойство exact к корневому ("") маршруту, в противном случае оно будет соответствовать каждому маршруту, начинающемуся с "", React Router точный
например:
<Route exact path = "/" component = {Home} />
<Route path = "/about" component = {About} />
<Route path = "/topics" component = {Topics} />
Обновлять:
Также изменение порядка будет иметь тот же эффект без точного свойства
<Route path = "/about" component = {About} />
<Route path = "/topics" component = {Topics} />
<Route path = "/" component = {Home} />
в коммутаторе маршрутизатора он перейдет к первому совпадающему маршруту, если мы добавим маршрут с путем / в начале, он всегда будет отображать компонент в пути, Лучше избегать точной фиксации заказа
Спасибо, что нашли время и ответили. Он по-прежнему действует так же. Применение вашего кода не повлияло на поведение выделения ссылок
или поделитесь своим компонентом маршрута
попробуйте @SakoBu упомянутый метод
Navlink также нуждается в точном на нем ... Измените на это:
import React, { Component } from 'react';
import { NavLink } from 'react-router-dom';
class Navigation extends Component {
render() {
return (
<div>
<p> My Navigation component </p>
<nav>
<ul>
<li><NavLink to='/' activeClassName = "current" exact = {true}> Home </NavLink> </li>
<li><NavLink to='/about' activeClassName = "current"> About </NavLink> </li>
<li><NavLink to='/contact' activeClassName = "current"> Contact </NavLink> </li>
</ul>
</nav>
</div>
);
}
}
export default Navigation;
компоненту NavLink должна быть предоставлена точная опора.
Это работает примерно так, Дом Фотографий
Когда пользователь нажимает на Home, url = '/ me', он загружает домашний компонент, когда пользователь нажимает на Pictures, url = '/ me / pictures', если точное не указано в NavLink, тогда оба url содержат '/ me », что делает их обоих активными.
Это вариант использования для точной поддержки NavLinks.
для v6 используйте end вместо exact
<NavLink end activeClassName = "activeNavLink" to = "/">
Вы можете использовать точные и строгие в соответствии с вашими потребностями в Навигационных ссылках.
Когда вы щелкаете навигационную ссылку, добавьте к ней активный класс и удалите его из всех остальных.