Доброго времени суток.
Недавно начал изучать React, мой первый фреймворк. Решил для начала реализовать header.
В плане функциональности меню отличное. На больших экранах отображается полный список ссылкок, на мелньких бургер. Бургер можно закрыть по крестику, оверлею или свайпом.
Но я в первую очередь хочу спросить ваше мнение по поводу того, правильно ли я распределил компоненты.
Босс:
/src/hoc/Layout/Layout.js
import { Component } from 'react';
import Header from '../../components/Navigation/Header/Header';
import '../../libs/fontawesome/css/all.min.css';
import cssClasses from './Layout.module.scss';
class Layout extends Component {
state = {
isMenuOpen: false,
}
toggleMenuHandler = () => {
const { isMenuOpen } = this.state;
this.setState({
isMenuOpen: !isMenuOpen,
});
}
keyPressHandler = ({ key }) => {
if (key && key === 'Escape') {
this.toggleMenuHandler();
}
}
render() {
const { isMenuOpen } = this.state;
if (isMenuOpen) {
document.addEventListener('keydown', this.keyPressHandler)
} else {
document.removeEventListener('keydown', this.keyPressHandler)
}
return(
<div className={cssClasses.Layout}>
<Header isMenuOpen={isMenuOpen} toggleMenuHandler={this.toggleMenuHandler} />
{this.props.children}
</div>
);
}
}
export default Layout;
Далее компоненты:
/src/components/Navigation/Header/Header.js
import Havbar from './Navbar/Navbar';
import cssClasses from './Header.module.scss';
const Header = ({ isMenuOpen, toggleMenuHandler }) => {
return (
<header className={cssClasses.Header}>
<Havbar isMenuOpen={isMenuOpen} toggleMenuHandler={toggleMenuHandler} />
</header>
);
};
export default Header;
/src/components/Navigation/Header/Navbar/Navbar.js
import { NavLink, Link } from 'react-router-dom';
import { useSwipeable } from 'react-swipeable';
// UI
import Overlay from '../../../UI/Overlay/Overlay';
import cssClasses from './Navbar.module.scss';
import logo from '../../../../img/logo.jpg';
const links = [
{ to: '/', label: 'Main', exact: true },
{ to: '/faq', label: 'Faq', exact: false },
{ to: '/contacts', label: 'Contacts', exact: false },
];
const navbarLinkGenerator = (linksList, toggleMenuHandler) => {
return linksList.map(({ to, label, exact }, index) => {
return (
<li key={`navlink-${index}`}>
<NavLink to={to} exact={exact} onClick={toggleMenuHandler} activeClassName={cssClasses.active}>{ label }</NavLink>
</li>
);
});
};
const Havbar = ({ isMenuOpen, toggleMenuHandler }) => {
const navbarLinksClasses = [cssClasses['Navbar-links']];
if (isMenuOpen) {
navbarLinksClasses.push(cssClasses.show);
}
const handlers = useSwipeable({
onSwipedRight: () => toggleMenuHandler(),
});
return (
<>
<div className="Navbar-logo">
<div className={cssClasses['Navbar-logo']}>
<Link to="/">
<img src={logo} alt="logo" />
</Link>
</div>
</div>
<div {...handlers} className={navbarLinksClasses.join(' ')}>
<i className="far fa-times" onClick={toggleMenuHandler}></i>
<nav>
<ul>
{navbarLinkGenerator(links, toggleMenuHandler)}
</ul>
</nav>
</div>
<div className={cssClasses['Navbar-burger']} onClick={toggleMenuHandler}>
<i className="fal fa-align-left" />
</div>
{ isMenuOpen && <Overlay onClick={toggleMenuHandler} /> }
</>
);
};
export default Havbar;
/src/components/UI/Overlay/Overlay.js
import classesList from './Overlay.module.scss';
const Overlay = ({ onClick }) => {
return (
<div onClick={onClick} className={classesList.Overlay}></div>
)
};
export default Overlay;
Файлы scss думаю не особо важны.
Буду рад услышать, что я сделал не правильно в плане логики и любую другую критику или советы.
Заранее спасибо.