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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете сохранить свойство состояния для класса портфеля и установить его соответствующим образом из метода 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>
);
}
}
Подумайте о том, чтобы написать это без поиска DOM, это может избавить вас от головной боли.