#reactjs
#reactjs
Вопрос:
Я очень новичок в ReactJS и пытаюсь создать простую строку меню. Мое меню работает на моем ноутбуке, но на мобильном устройстве оно не меняет цвет активного меню. Если я помещаю пункт меню непосредственно в render (), он работает (см. Пункт меню «РАБОЧИЙ»), но моя первоначальная идея не меняет фон меню на мобильных телефонах. Я понятия не имею, почему. Спасибо за чтение.
import React, {Component} from 'react'
import './menu-main.sass';
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
const MenuButton = (props) => {
return (
<li className={props.className} onClick={props.onClick}>
<Link to={'/' props.route}>{props.name}</Link>
</li>
);
}
const menus = [
{id: 0, name: 'Products', route: 'products'},
{id: 1, name: 'Categories', route: 'category'},
{id: 2, name: 'About', route: 'about'},
]
class Menu extends Component {
constructor(){
super();
this.state = {
activeMenu: 0,
}
}
handleClick(i) {
this.setState({
activeMenu: i
})
}
renderMenuButton(i) {
let className = "button"
if (this.state.activeMenu == i) {
className = "active-menu"
}
return (
<MenuButton
key = {menus[i].id}
name = {menus[i].name}
route = {menus[i].route}
id = {menus[i].id}
onClick={() => this.handleClick(i)}
className = {className}
/>
);
}
renderSwitch(i) {
return (
<Route path = {menus[i].route} key = {menus[i].id}>
{'<' menus[i].route ' />'}
</Route>
);
}
render() {
return (
<Router>
<div className="container-menu-main">
<ul>
<li>Admin menu</li>
<li onClick={() => this.handleClick(2)}>WORKING!!!</li>
{menus.map((menu) => this.renderMenuButton(menu.id))} {/* DOES NOT WORK */}
</ul>
<Switch>
{menus.map((menu) => this.renderSwitch(menu.id))}
</Switch>
</div>
</Router>
)
}
}
export default Menu;
Комментарии:
1. Думаю, предоставление работающего образца действительно помогло бы.
2. Вы можете проверить это с помощью разных мобильных браузеров. Это может быть проблема, связанная с браузером.
3. Я проверил с помощью Chrome и Mi browser.
4. Запуск примера: master.dcl8mxikpvkz.amplifyapp.com
Ответ №1:
Я обнаружил, что существует проблема с шириной CSS. На мобильных устройствах активным цветом будет: цвет наведения, и если я удалю цвет наведения или установлю такой же, как активный цвет, он будет работать нормально. Я не знаю, почему, и мне это не нравится, потому что я не понимаю.
С другой стороны, я понял, что в react router есть встроенное решение для active link, поэтому мне не нужно управлять самим.
Ответ №2:
Вы переходите menu.id
к this.renderMenuButton
, но, похоже this.renderMenuButton
, ожидает индекс. Можете ли вы попробовать это:
import React, {Component} from 'react'
import './menu-main.sass';
import {
BrowserRouter as Router,
Switch,
Route,
Link
} from "react-router-dom";
const MenuButton = (props) => {
return (
<li className={props.className} onClick={props.onClick}>
<Link to={'/' props.route}>{props.name}</Link>
</li>
);
}
const menus = [
{id: 0, name: 'Products', route: 'products'},
{id: 1, name: 'Categories', route: 'category'},
{id: 2, name: 'About', route: 'about'},
]
class Menu extends Component {
constructor(){
super();
this.state = {
activeMenu: 0,
}
}
handleClick(i) {
this.setState({
activeMenu: i
})
}
renderMenuButton(i) {
let className = "button"
if (this.state.activeMenu == i) {
className = "active-menu"
}
return (
<MenuButton
key = {menus[i].id}
name = {menus[i].name}
route = {menus[i].route}
id = {menus[i].id}
onClick={() => this.handleClick(i)}
className = {className}
/>
);
}
renderSwitch(i) {
return (
<Route path = {menus[i].route} key = {menus[i].id}>
{'<' menus[i].route ' />'}
</Route>
);
}
render() {
return (
<Router>
<div className="container-menu-main">
<ul>
<li>Admin menu</li>
<li onClick={() => this.handleClick(2)}>WORKING!!!</li>
{menus.map((menu, i) => this.renderMenuButton(i))} {/* Pass index instead of menu.id */}
</ul>
<Switch>
{menus.map((menu) => this.renderSwitch(menu.id))}
</Switch>
</div>
</Router>
)
}
}
export default Menu;
Комментарии:
1. Спасибо за ваш ответ, но, к сожалению, он по-прежнему не работает.