ReactJs - вставьте новый класс CSS в элемент, когда активен конкретный NavLink

У меня есть это приложение. Все работает успешно, кроме того, что я написал в заголовке этого поста.

class PortfolioMenu extends Component {
  isActive= (match, location) => {
    if (match) {
     if (document.querySelector('.portfolio-menu')){
     document.querySelector('.portfolio-menu').className += " new-classjs";
     }
    }
    return match;
  };

  render(){   
    return (
      <div>
        <Router>
          <div class = "wrapper2">
            <div class = "wrapper-portfolio">
              <Route exact path='/portfolio' render = {() => <Intro />} />
              <Route exact path='/portfolio/casas' render = {() => <Casas />} />               
            </div>
            <nav>
              <ul className = "portfolio-menu">
                <li><NavLink activeClassName = "active" isActive = {this.isActive} exact to = "/portfolio">• introdução</NavLink></li>
                <li><NavLink activeClassName = "active" exact to = "/portfolio/casas">• casas</NavLink></li>

              </ul>
            </nav>
          </div>
        </Router>
      </div>
    )
  }
  }


export default PortfolioMenu

Как вы можете видеть в приведенном выше коде, у меня есть эта функция реагирования, которая определяет, активна ли какая-то страница. Эта функция успешно работает. Когда я набираю console.info(page detected) в его теле, он показывает результат

isActive= (match, location) => {
    if (match) {
     if (document.querySelector('.portfolio-menu')){
     document.querySelector('.portfolio-menu').className += " new-classjs";
     }
    }
    return match;

Таким образом, корень проблемы заключается в том, что то, что происходит в этом теле функции, в этом конкретном случае не работает. Я хотел бы суммировать результаты «new-classjs», кроме класса «portfolio-menu»: <ul className = "portfolio-menu new-classjs"">. Как я могу это решить?

Подумайте о том, чтобы написать это без поиска DOM, это может избавить вас от головной боли.

Ryan Searle 30.01.2019 15:07

Я хотел бы добавить новый класс в «меню-портфолио» только тогда, когда активна определенная страница.

claudiopb 30.01.2019 15:13

Я возглавил приложение и вижу, что оно работает только тогда, когда я нажимаю в меню. Когда страница открывается в первый раз, она не работает. я провел тест с этой функцией тела isActive= (match, location) => { if (match) { if (document.querySelector('.portfolio-menu')){ document.querySelector('.portfolio-menu'). style.color = "красный" } } возвращает совпадение;

claudiopb 30.01.2019 15:27
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сохранить свойство состояния для класса портфеля и установить его соответствующим образом из метода isActive.

class PortfolioMenu extends Component {
  state = {
    portfolioClass: ""
  };

  isActive = (match, location) => {
    const { portfolioClass } = this.state;
    const newClass = match ? "new-classjs" : "";
    if (newClass !== portfolioClass)
      this.setState({ portfolioClass: newClass });
    return match;
  };

  render() {
    const { portfolioClass } = this.state;
    return (
      <div>
        <Router>
          <div class = "wrapper2">
            <div class = "wrapper-portfolio">
              <Route exact path = "/portfolio" render = {() => <Intro />} />
              <Route exact path = "/portfolio/casas" render = {() => <Casas />} />
            </div>
            <nav>
              <ul className = {`portfolio-menu ${portfolioClass}`}>
                <li><NavLink activeClassName = "active" isActive = {this.isActive} exact to = "/portfolio">• introdução</NavLink></li>
                <li><NavLink activeClassName = "active" exact to = "/portfolio/casas">• casas</NavLink></li>
              </ul>
            </nav>
          </div>
        </Router>
      </div>
    );
  }
}

Демо на https://codesandbox.io/s/p91xk60p6j

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