- nanoid — генерирует уникальные id, запрещено использовать в keys react (уточнить чем лучше Symbol)
import React, { Component } from 'react';
import nanoid from 'nanoid'
class InputWithLabel extends Component {
constructor(props){
| // Если пользователь управляет сайтом с помощью мышки, outline скрывается | |
| // Если начинает управлять клавиатурой, outline ставится на элементе следующем после | |
| // того, с которым взаимодействовал пользователь | |
| // Обратить внимание на радио кнопки, фокус не появляется на них при управлении с клавиатуры | |
| let lastDown, lastDownAt; | |
| document.addEventListener('mousedown', e => { | |
| lastDown = e.target; | |
| lastDownAt = Date.now(); | |
| }) |
| /* С помощью css блок текста ограничивается указанным количеством строк */ | |
| /* Остальное скрывается троеточиями */ | |
| .text { | |
| display: -webkit-box; | |
| width: 100%; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| -webkit-line-clamp: 2; | |
| -webkit-box-orient: vertical; | |
| } |
| // Принимает целое число и массив склонений, выдает правильное числительное = (N, ['час', 'часа', 'часов']) | |
| function declOfNum(n, titles) { | |
| return titles[ | |
| n % 10 === 1 && n % 100 !== 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2 | |
| ]; | |
| } | |
| // Делит целое число на разряды пробелом | |
| function numberWithSpaces(x) { | |
| return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, " "); |
| // раскладывает полученную дату на запчасти и возвращает ее в виде объекта с доп данными | |
| export const destructDate = masterDate => { | |
| const now = dayjs(); | |
| const dayNames = ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота']; // тк в dayjs 0 это воскресенье | |
| const dayNamesShort = ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб']; | |
| const monthsNames = [ | |
| 'Январь', | |
| 'Февраль', | |
| 'Март', | |
| 'Апрель', |
| <!-- | |
| Ползунок https://developer.mozilla.org/ru/docs/Web/HTML/Element/Input/range | |
| Кастомизация HTML5 progress element https://habr.com/ru/post/266895/ | |
| --> | |
| <p>Audio settings:</p> | |
| <div> | |
| <input type="range" id="volume" name="volume" | |
| min="0" max="11"> | |
| <label for="volume">Volume</label> |
| import React from 'react'; | |
| import Spinner from '../components/Spinner'; | |
| import ErrorMessage from '../components/ErrorMessage'; | |
| import DataService from '../services/DataService'; | |
| export default function(WrappedComponent) { | |
| class withDataForComponent extends React.Component { | |
| constructor(props) { | |
| super(props); | |
| this.dataService = new DataService(props.id); |
| // Миксин реализует грид систему внутри flex-контейнера | |
| // $cols - количество блоков в одном ряду | |
| // $margin - отступ между блоками в % | |
| @mixin grid-element($cols, $margin) { | |
| margin-bottom: $margin; | |
| // Если больше 5 блоков в ряду, то растягивать на всю ширину | |
| @if($cols >= 5) { | |
| width: 100%; | |
| margin-right: 0; |