React.js. Начало работы. Часть 9 из 12

26.10.2019

Теги: JavaScriptReact.jsWeb-разработкаКомпонентМенюНавигацияСобытиеФреймворк

Создание приложения: выдвижное меню

Выдвижное меню сегодня — весьма распространенный элемент пользовательского интерфейса, особенно, если учитывать мобильные устройства. Наше меню расположено за пределами окна браузера, а при клике мышкой по кнопке — выдвигается слева направо, занимая всю ширину окна браузера.

Создаем новое приложение

Итак, создаем новое приложение:

> create-react-app slidemenu

Удаляем все файлы из директорий src и public. И создаем файл index.html в директории public:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Выдвижное меню</title>
</head>
<body>
    <div id="container"></div>
<body>
</html>

В директории src создаем файлы index.css и index.js:

body {
    background-color: #EEEEEE;
    margin: 0;
    padding: 25px;
    font-family: Arial, Helvetica, sans-serif;
    font-size: 20px;
    overflow: auto;
}
    #container li {
        margin-bottom: 10px;
    }
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import MenuContainer from './MenuContainer';

ReactDOM.render(
    <div>
        <MenuContainer/>
    </div>,
    document.getElementById('container')
);

Теперь создаем компонент MenuContainer, который сам будет выводить элементы меню. Но это временно, пока не напишем остальные компоненты нашего приложения.

import React, {Component} from 'react';

class MenuContainer extends Component {
    render() {
        return (
            <div>
                <ul>
                    <li>Первый пункт меню</li>
                    <li>Второй пункт меню</li>
                    <li>Третий пункт меню</li>
                    <li>Четвертый пункт меню</li>
                    <li>Пятый пункт меню</li>
                    <li>Шестой пункт меню</li>
                    <li>Седьмой пункт меню</li>
                </ul>
            </div>
        );
    }
}

export default MenuContainer;

Чтобы проверить работу приложения, переходим в директорию slidemenu и выполняем команду:

> npm start

Показ и скрытие меню

При клике мышкой по кнопке открытия — меню выдвигается слева направо. При клике мышкой по кнопке закрытия — меню скрывается справа налево. Нам нужно поддерживать определенное состояние, чтобы отслеживать, скрыто меню в данный момент или нет.

import React, {Component} from 'react';

class MenuContainer extends Component {
    constructor(props) {
        super(props);

        this.state = {
            visible: false
        }

        this.toggleMenu = this.toggleMenu.bind(this);
    }
    
    tiggleMenu() {
        this.setState({
            visible: !this.state.visible
        });
    }
    
    render() {
        return (
            <div>
                <ul>
                    <li>Первый пункт меню</li>
                    <li>Второй пункт меню</li>
                    <li>Третий пункт меню</li>
                    <li>Четвертый пункт меню</li>
                    <li>Пятый пункт меню</li>
                    <li>Шестой пункт меню</li>
                    <li>Седьмой пункт меню</li>
                </ul>
            </div>
        );
    }
}

export default MenuContainer;

Создание кнопок

Создаем файлы ShowButton.js и ShowButton.css в директории src:

import React, {Component} from 'react';
import './ShowButton.css';

class ShowButton extends Component {
    render() {
        return (
            <button id="show-button" onClick={this.props.handleClick}><span>»</span></button>
        );
    }
}

export default ShowButton;
#show-button {
    background-color: #007777;
    margin-bottom: 20px;
    width: 50px;
    height: 50px;
    border-radius: 50%;
    border: none;
    outline: none;
    transition: all 0.2s;
}
#show-button:hover {
    background-color: #009999;
    cursor: pointer;
    transform: scale(1.1, 1.1);
}
    #show-button span {
        font-size: 50px;
        color: #FFFFFF;
        position: relative;
        top: -8px;
        left: 2px;
    }

Создаем файлы HideButton.js и HideButton.css в директории src:

import React, {Component} from 'react';
import './HideButton.css';

class HideButton extends Component {
    render() {
        return (
            <button id="hide-button" onClick={this.props.handleClick}><span>«</span></button>
        );
    }
}

export default HideButton;
#hide-button {
    background-color: #007777;
    margin-bottom: 20px;
    width: 50px;
    height: 50px;
    border-radius: 50%;
    border: none;
    outline: none;
    transition: all 0.2s;
    float: right;
    margin-right: 25px;
    margin-top: 25px;
}
#hide-button:hover {
    background-color: #009999;
    cursor: pointer;
    transform: scale(1.1, 1.1);
}
    #hide-button span {
        font-size: 50px;
        color: #FFFFFF;
        position: relative;
        top: -8px;
    }

Создание меню

Теперь все пункты меню разместим в отдельном компоненте SlideMenu. Кроме пунктов меню этот компонент будет показывать кнопку закрытия меню:

import React, {Component} from 'react';
import HideButton from './HideButton';
import './SlideMenu.css';

class SlideMenu extends Component {
    render() {
        var visibility = 'hide';
        if (this.props.visibility) {
            visibility = 'show';
        }
        return (
            <div id="slide-menu" className={visibility}>
                <HideButton handleClick={this.props.handleClick} />
                <h3><a href="#">Первый элемент меню</a></h3>
                <h3><a href="#">Второй элемент меню</a></h3>
                <h3><a href="#">Третий элемент меню</a></h3>
                <h3><a href="#">Четвертый элемент меню</a></h3>
                <h3><a href="#">Пятый элемент меню</a></h3>
                <h3><a href="#">Шестой элемент меню</a></h3>
                <h3><a href="#">Седьмой элемент меню</a></h3>
            </div>
        );
    }
}

export default SlideMenu;
#slide-menu {
    width: 100vw;
    height: 100vh;
    background-color: #FFE600;
    position: fixed;
    top: 0;
    left: 0;
    transition: transform 1s cubic-bezier(0, 0.52, 0, 1);
    overflow: hidden;
    z-index: 100;
}
    #slide-menu.hide {
        transform: translate3d(-100vw, 0, 0);
    }
    #slide-menu.show {
        transform: translate3d(0, 0, 0);
    }
        #slide-menu h3 a {
            color: #333333;
            margin-left: 15px;
            text-decoration: none;
        }
        #slide-menu h2 a:hover {
            text-decoration: underline;
        }

А компонент MenuContainer больше не будет сам показывать элементы меню, а только вызывать ShowButton и SlideMenu:

import React, {Component} from 'react';
import ShowButton from './ShowButton';
import SlideMenu from './SlideMenu';

class MenuContainer extends Component {
    constructor(props) {
        super(props);

        this.state = {
            visible: false
        }

        this.toggleMenu = this.toggleMenu.bind(this);
    }

    toggleMenu() {
        this.setState({
            visible: !this.state.visible
        });
    }

    render() {
        return (
            <div>
                <ShowButton handleClick={this.toggleMenu} />
                <SlideMenu handleClick={this.toggleMenu} visibility={this.state.visible} />
            </div>
        );
    }
}

export default MenuContainer;

Мы передаем компоненту ShowButton свойство handleClick, значение которого — функция toggleMenu(). А компонент ShowButton назначает эту функцию в качестве обработчика события click.

Аналогично, мы передаем компоненту SlideMenu свойство handleClick, а тот передает его дальше — компоненту HideButton. И уже компонент HideButton назначает эту функцию в качестве обработчика события click. Кроме того, мы передаем состояние меню в текущий момент времени компоненту SlideMenu, чтобы задать css-класс show или hide элементу div с идентификатором slide-menu.

Поиск: JavaScript • React.js • Web-разработка • Меню • Навигация • Событие • Фреймворк • Компонент

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.