ActiveClassName в реактивном маршрутизаторе выделяет две ссылки NavLink одновременно

Я изучаю 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 и многих онлайн-руководств, я все еще не знаю, как это исправить.

Вот когда я нажимаю на ссылку "О нас" ActiveClassName в реактивном маршрутизаторе выделяет две ссылки NavLink одновременно

Вот когда я нажимаю ссылку "Контакты" ActiveClassName в реактивном маршрутизаторе выделяет две ссылки 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;

Когда вы щелкаете навигационную ссылку, добавьте к ней активный класс и удалите его из всех остальных.

Egor Egorov 26.10.2018 19:06
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
7
1
6 000
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы должны добавить свойство 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} />

в коммутаторе маршрутизатора он перейдет к первому совпадающему маршруту, если мы добавим маршрут с путем / в начале, он всегда будет отображать компонент в пути, Лучше избегать точной фиксации заказа

Спасибо, что нашли время и ответили. Он по-прежнему действует так же. Применение вашего кода не повлияло на поведение выделения ссылок

Marco 26.10.2018 19:21

или поделитесь своим компонентом маршрута

Hafeez Hamza 26.10.2018 19:24

попробуйте @SakoBu упомянутый метод

Hafeez Hamza 26.10.2018 19:27
Ответ принят как подходящий

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 = "/">

Вы можете использовать точные и строгие в соответствии с вашими потребностями в Навигационных ссылках.

Другие вопросы по теме