Timer

Рассмотрим пример создания компонента countdown timer в React с использованием Bit.

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

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

Введение

Nodejs и NPM совершили революцию во вселенной JavaScript, которой принадлежат такие фреймворки и инструменты, как Angular, Lerna, React и т. д. Некоторые остались в прошлом, а некоторые активно используются до сих пор.

Фреймворки JS, такие как Angular, React и Vue, привнесли использование компонентов в разработку UI. Каждое представление состоит из компонентов, при объединении которых формируется сложный UI.

С помощью компонентов можно разделить представление и логику, а также использовать эти представления в других проектах. Однако, несмотря на преимущества использования компонентов, остается проблема обмена компонентами между несколькими проектами. 

На помощь приходит Bit:

Bit превращает компоненты в строительные блоки, которые можно отделить и разместить в любом проекте.

Таким образом, компоненты не только организованы, но и доступны для обнаружения, установки и разработки для всех членов команды.

Bit — крутой инструмент для обмена компонентами между проектами.

Для примера возьмем приложение React:

react-app/
 - src/
 - components/
  - login/
   - login.component.js
   - login.component.css
  - register/
   - register.component.js
   - register.component.css
 - App.js
 - index.js

В папке components находится компонент login, который содержит и отображает логику для регистрации в приложении. Компонент register содержит логику и представление регистрации.

Однако при каждом запуске нового проекта компоненты login и register приходится создавать заново. Есть ли способ создать общий компонент и использовать его в нескольких проектах?

С помощью Bit вы можете легко отделять компоненты, не создавая новое хранилище, папки или проекты, и публиковать их в реестре Bit. Благодаря автоматическому отделению компонентов и обработке их зависимостей 500 компонентов публикуются за считанные минуты.

Если при работе над другим проектом потребуется добавить компонент login или register, используйте компонент bit import login.component или bit import register.component.

Их также можно установить с помощью клиентов NPM или Yarn.

Теперь рассмотрим пример создания компонента Timer, а также его использования в других проектах с помощью Bit.

Countdown timer используется для отображения обратного отсчета для любого события.

Установка Bit и скаффолдинг проекта React

Для начала выполним глобальную установку инструмента Bit CLI, чтобы использовать его в рамках всей системы.

$ npm i bit-bin -g

Перед созданием проекта React убедитесь, что create-react-app установлен:

$ npm i create-react-app -g

Выполняем скаффолдинг проекта React:

$ create-react-app react-app

Затем инициализируем bit:

$ bit init

Создание компонента Timer

Приступим к созданию компонента Timer.

Для начала создаем папку для компонентов и объединяем структуру проекта в соответствии с их функциональностью. Папка components/ содержит все компоненты.

$ mkdir src/components && mkdir src/components/timer
$ touch src/components/timer/timer.component.js
$ touch src/components/timer/timer.component.css

touch src/components/timer/timer.component.js содержит представление и логику, а touch src/components/timer/timer.component.css — дизайн.

Откройте touch src/components/timer/timer.component.js и добавьте туда следующий код:

import React, { Component } from 'react'
// import cn from 'classnames/bind'
import './countdown.css'

//const cx = cn.bind(styles)

class CountDown extends Component {
    constructor(props) {
        super(props)
        this.count = this.count.bind(this)
        this.state = {
            days: 0,
            minutes: 0,
            hours: 0,
            secounds: 0,
            time_up:""
        }
        this.x = null
        this.deadline = null
    }
    count () {        
        var now = new Date().getTime();
        var t = this.deadline - now;
        var days = Math.floor(t / (1000 * 60 * 60 * 24));
        var hours = Math.floor((t % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
        var minutes = Math.floor((t % (1000 * 60 * 60)) / (1000 * 60));
        var seconds = Math.floor((t % (1000 * 60)) / 1000);
        this.setState({days, minutes, hours, seconds})
        if (t < 0) {
                clearInterval(this.x);
                this.setState({ days: 0, minutes: 0, hours: 0, seconds: 0, time_up: "TIME IS UP" })
            }
    }
    componentDidMount() {
        this.deadline = new Date("apr 29, 2018 21:00:00").getTime();
 
        this.x = setInterval(this.count, 1000);
    }
    
    render() {
        const { days, seconds, hours, minutes, time_up } = this.state
        return ( 
            <div> 

            <h1>Countdown Clock</h1>
            <div id="clockdiv">
            <div>
                <span className="days" id="day">{days}</span>
                <div className="smalltext">Days</div>
                
            </div>
            <div>
                <span className="hours" id="hour">{hours}</span>
                <div className="smalltext">Hours</div>
                
            </div>
            <div>
                <span className="minutes" id="minute">{minutes}</span>
                <div className="smalltext">Minutes</div>
                
            </div>
            <div>
                <span className="seconds" id="second">{seconds}</span>
                <div className="smalltext">Seconds</div>
                
            </div>
            </div>
            
            <p id="demo">{time_up}</p>
            </div>
        )
    }
}

export default CountDown

componentDidMount используется для запуска таймера. Сначала выполняется constructor, затем componentDidMount и наконец метод render. По этой причине инициализация делегирована в constructor, а таймер запущен в componentDidMount. render отображает значения: hours, days, minutes, seconds.

constructor ==> componentDidMount ==> render

Наконец экспортируем класс CountDown , чтобы пользователи могли импортировать компонент CountDown в проекты React при установке этой библиотеки.

Работа над компонентом завершена. Переходим к оформлению стиля компонента.

Откройте src/components/timer/timer.component.css и вставьте следующий фрагмент:

/*body{
    text-align: center;
    background: #00ECB9;
  font-family: sans-serif;
  font-weight: 100;
}
h1{
  color: #396;
  font-weight: 100;
  font-size: 40px;
  margin: 40px 0px 20px;
}*/
 #clockdiv{
    font-family: sans-serif;
    color: #fff;
    display: inline-block;
    font-weight: 100;
    text-align: center;
    font-size: 30px;
}
#clockdiv > div{
    padding: 10px;
    border-radius: 3px;
    background: #00BF96;
    display: inline-block;
}
#clockdiv div > span{
    padding: 15px;
    border-radius: 3px;
    background: #00816A;
    display: inline-block;
}
smalltext{
    padding-top: 5px;
    font-size: 16px;
}

Откройте App.js и визуализируйте компонент Timer:

import React, { Component } from 'react';
import './App.css';
import TimerComponent from './components/timer/countdown'
class App extends Component {
    render() {
        return ( 
            <>
                <TimerComponent />
            </>
        );
    }
}
export default App;

Запустите npm run start в терминале и перейдите к localhost:3000. Там отобразится компонент Timer.

Создание компонентов

Для создания компонентов нужно добавить компиляторы, которые отобразят компоненты в Bit web UI. Компиляторы визуализируют компоненты в удаленном окружении. Для компонентов React потребуются транспайлеры для компиляции компонентов в версию для визуализации. Независимо от количества опубликованных компонентов, эти действия выполняются один раз для каждого проекта.

$ bit import bit.envs/compilers/react --compiler
username: chidume
password:
the following component environments were installed
- bit.envs/compilers/[email protected]

Отслеживание компонентов

Чтобы сообщить bit, какие файлы следует отслеживать, используем команду bit add.

Команда помещает файлы в рабочее пространство Bit, в котором файлы моделируются в качестве компонентов. В созданном проекте помещаем компоненты login и register.

$ bit add src/components/*

В этом случае используется шаблон поиска (glob pattern), чтобы сообщить Bit об отслеживании всех файлов в папке components. При необходимости можно использовать отдельные пути.

Теперь отделяем и отмечаем отслеживаемые компоненты. График зависимостей каждого компонента остается в неизменяемом состоянии.

$ bit tag --all 0.0.1

Создание коллекции и обмен компонентами

Теперь нужно создать коллекцию на bit.dev. Коллекция играет роль пространства для обмена схожих по функционалу компонентами.

Переходим на bit.dev и создаем коллекцию.

Коллекция готова к работе, осталось ее заполнить.

Теперь перемещаем организованные компоненты в коллекцию:

$ bit export <YOUR_ACCOUNT_NAME_HERE>.<YOUR_COLLECTION_NAME>

Здесь можно просмотреть компонент, которым мы только что поделились!

Можно поэкспериментировать с компонентом на его странице, а затем установить или импортировать в любой другой проект.

Использование компонента Timer из Bit в другом проекте

Создайте еще один проект React:

$ create-react-app react-bit

Папка выглядит следующим образом:

Этот проект отличается от предыдущего проекта react с компонентом timer. Допустим, для этого проекта также необходим компонент timer. Для начала инициализируем рабочее пространство Bit через bit init и импортируем компонент timer из Bit следующим образом:

$ bit init
$ bit import <YOUR_ACCOUNT_NAME_HERE>.<YOUR_COLLECTION_NAME>/timer --path src/components/timer

С помощью этой команды timer устанавливается из реестра Bit в папку src/components/timer, принадлежащую react-bit.

Теперь компонент timer можно визуализировать в любом месте. Например, в файле App.js.

import React, { Component } from 'react';
import './App.css';
import TimerComponent from '@bit/chidume.my_components_92.timer/timer'
class App extends Component {
    render() {
        return ( 
            <>
                <TimerComponent />
            </>
        );
    }
}
export default App;

Мы выполнили import TimerComponent from '@bit/<YOUR_ACCOUNT_NAME_HERE>.<YOUR_COLLECTION_NAME>/components/timer' вместо import TimerComponent from './components/timer'. Почему?

При импорте компонента с Bit создаются ссылки в каталоге проекта node_modules.

Это означает, что компоненты нужно импортировать с использованием абсолютного пути.

Здесь также можно вносить изменения в компонент timer, несмотря на то, что он был создан в другом месте, а затем синхронизировать новую версию компонента с версией в Bit. С помощью Bit можно объединять изменения компонентов из других проектов!

Заключение

Мир программирования находится на стадии повторного использования компонентов. С помощью Bit можно использовать компоненты повторно в других проектах без лишних усилий и ограничений, что значительно ускоряет процесс разработки.


Перевод статьи Chidume Nnamdi 🔥💻🎵🎮: Build a Reusable Timer Component With React and Bit