• Можно ли добавить несколько обработчиков событий в react?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Example extends Component {
      handleClick = e => {
        const { firstHandler, secondHandler } = this.props;
    
        firstHandler(e);
        secondHander(e);
      };
    
      render() {
        return <button onClick={this.handleClick}>Click me</button>;
      }
    }
    Ответ написан
    5 комментариев
  • Как разделить скрипт на части в React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Ответ написан
    Комментировать
  • В чем причина ошибки gulp watch?

    rockon404
    @rockon404
    Frontend Developer
    Invalid CSS after "...lor: #dddddd; }": expected 1 selector or at-rule, was "padding: {}"
    on line 2 of app/sass/main.sass


    Вот вам sass валидатор. Проверьте свой код.
    Ссылка на случай если синтаксис не знаете.
    Ответ написан
    7 комментариев
  • Где какие единицы измерения используют?

    rockon404
    @rockon404
    Frontend Developer
    Размер шрифта задаете в vmin и vh? Зачем?
    В последних проектах использовали преимущественно rem. А в одном, вообще, преимущественно px и никаких проблем не испытывали.
    Так же в, одном из проектов, конвертировали px в rem:
    font-size: ${rem('14px')};
    Очень интересный опыт, но отлаживать не очень удобно. В коде 10px в консоли 0.625rem.

    По поводу кейсов использования:
    rem, px используют для всего.
    vw, vh, vmin исключительно для редких кейсов, где важна зависимость от viewport.
    Проценты преимущественно для задания ширины, высоты и абсолютного/фиксированного позиционирования.
    Относительные единицы(1.4) для line-height, для изолированных элементов и кнопок/инпутов можно line-height задавать и в rem/px.

    Многие активно используют em. Мне не зашло, да и в проектах не использовали, поэтому ничего объективного по поводу этой единицы измерения сказать не могу.
    Ответ написан
    Комментировать
  • Как грамотно настроить локальную среду разработки?

    rockon404
    @rockon404
    Frontend Developer
    node то зачем в docker? Если уж возникло желание использовать разные версии, можно использовать nvm. Если вы работаете преимущественно с JavaScript, то node, имхо, гораздо удобней использовать если он установлен в системе.
    php, DB и подобное в docker
    Стоит оговориться, что если работаете в проекте со специфичной версией node и docker контейнерами, то ей, конечно, в docker самое место.
    Ответ написан
    6 комментариев
  • Как удалять пустые значения в объекте перед отправкой на бэк?

    rockon404
    @rockon404
    Frontend Developer
    function filterEmptyProps(obj) {
      const result = {};
      Object.entries(obj).forEach(([ key, val ]) => {
        if (val || val === 0) {
          result[key] = val;
        }
      });
    
      return result;
    }

    Чистая функция, возвращает новый объект.

    Демо.
    Ответ написан
    Комментировать
  • Как организовать передача состояния из react в svg?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Лучше создавать спрайт и добавлять его в документ, а иконки забирать по id.
    Компонент на примере Styled Components:
    import React from 'react';
    import styled from 'styled-components';
    
    const SVG = styled.svg`
      display: inline-block;
      vertical-align: middle;
    `;
    
    const Icon = ({ name, ...props }) {
      if (!name) {
        throw new Error('Unknown icon name!');
      }
      return (
        <SVG {...props}>
          <use xlinkHref={`#icon-${name}`} />
        </SVG>
      );
    }
    
    export default Icon;


    Cтилизованая иконка c разными состояниями:
    import React from 'react';
    import styled from 'styled-components';
    import { Icon } from './components';
    
    const StyledIcon = styled(Icon)`
      fill: ${props => props.state.fill};
    `;
    
    const Example = ({ iconState }) => <StyledSVG name="profile" state={iconState} />;
    
    export default Example;


    Styled Components, тут лишь для примера. Подобные компоненты легко реализуются и без использования этой библиотеки.
    Ответ написан
    2 комментария
  • Как перейти по ссылке внутри обработчика событий в react?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    import React, { Component } from 'react';
    import { withRouter } from 'react-router-dom';
    
    class Example extends Component {
      handler = () => {
        this.props.history.push('/cources');
      };
      
      render() { /* ... */ }
    }
    
    export default withRouter(Example);


    Возможно, вам подойдет простой вариант с компонентом Link:
    import React, { Component } from 'react';
    import { Link } from 'react-router-dom';
    
    class Example extends Component {
      render() {
        return <Link to="/cources" />;
      }
    }
    
    export default Example;
    Ответ написан
    Комментировать
  • Полезно ли изучать React/Redux, если хочешь работать с VueJS?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Изучайте то, что больше нравится.
    Хорошо знать и практиковать оба фреймворка(да, да, да: вообще-то React библиотека бла, бла, бла) нет особого смысла.
    Хотите попробовать React - пробуйте.

    ИМХО хорошо изучите React, на Vue переходить не захотите.
    Ответ написан
    3 комментария
  • Как вы относитесь к Bootstrap 4? И используете ли вы его в своей работе?

    rockon404
    @rockon404
    Frontend Developer
    "Громоздкий css фреймворк" === экономия времени.

    "Громоздкий css фремворк" хорош когда:
    1. Вы являетесь единтсвенным исполнителем, а гонорар за проект фиксированный. Быстрей выполните - больше заработаете.
    2. Вы являетесь веб-студией. С фреймворками вы будете клепать типовые сайты со скоростью конвейера. У вас будут конкурентные цены и сроки. Текучка кадров не страшна, так как новые разработчики скорей всего будут знать фреймворк, который вы используете, а если и нет, у фреймворков в большинстве случаев отличная документация и огромное комьюнити.

    Важно в выборе стека технологий исходить из требований, бюджета, сроков, размера и квалификации команды.
    Так большие проекты, чаще пишут без использования css-фреймворков, в таких проектах большие бюджеты и сроки, сильные разработчики и высокие требования. Если ваша цель вырасти до таких проектов, то, непременно учитесь, верстать без фреймворков.

    Как путь развития рекоментдую смотреть в сторону Frontend Developer. JavaScript/TypeScript, React/Vue, Babel, Webpack.
    Ответ написан
    Комментировать
  • Как сделать треугольную svg картинку?

    rockon404
    @rockon404
    Frontend Developer
    Подобные вещи легко реализуются с помощью clip-path.
    Пример.
    Генератор.
    can-i-use (пользователи IE и Edge в пролете)

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

    Возможно, для вашей задачи подойдет вариант использования png картинки с прозрачностью.
    А, вариант от Андрей является отличным и кросс-браузерным решением.
    Ответ написан
    Комментировать
  • Как сделать интернет магазин юзабительным?

    rockon404
    @rockon404
    Frontend Developer
    Несколько относительно минималистичных магазинов:
    ripndip
    dcshoes
    pennyscateboards
    Ответ написан
    Комментировать
  • Запуск скрипта в определенное время?

    rockon404
    @rockon404
    Frontend Developer
    Насколько я понял addAge - это колбек модалки при закрытии, поэтому эту функцию лучше не удалять.

    Вот для показа по локальному времени клиента:
    var TIME_FROM = 0;
    var TIME_TO = 9;
    
    var date = new Date();
    var clientLocalHour = date.getHours();
    
    if (clientLocalHour >= TIME_FROM && clientLocalHour < TIME_TO) {
      $('.ageWindow').fadeIn(100);
    }
    
    function addAge() { 
      $('.ageWindow').fadeOut(500);
    }


    Вот для показа по локальному времени вашего сервиса(считается на стороне клиента, часовой пояс +3 Москва):
    var SERVICE_TIMEZONE = 3;
    var TIME_FROM = 0;
    var TIME_TO = 9;
    
    var date = new Date();
    var clientLocalHour = date.getHours();
    var timezoneOffset = date.getTimezoneOffset() / 60;
    var serviceComputedHour = clientLocalHour + timezoneOffset + SERVICE_TIMEZONE;
    
    if (serviceComputedHour >= TIME_FROM && serviceComputedHour < TIME_TO) {
      $('.ageWindow').fadeIn(100);
    }
    
    function addAge() { 
      $('.ageWindow').fadeOut(500);
    }

    SERVICE_TIMEZONE - часовой пояс, сейчас стоит +3 Москва, можно задать любой (целое число в диапазоне от -12 до 12)
    TIME_FROM - время начала показа
    TIME_TO - время окончания показа

    По-хорошему, конечно, переименовать метод закрытия модалки, класс и поправить название метода в слушателе закрытия модалки, но боюсь вы не разберетесь как это сделать.
    Ответ написан
    Комментировать
  • Как преобразовать строку в тег?

    rockon404
    @rockon404
    Frontend Developer
    Можно использовать unescape из lodash.
    Демо.
    Ответ написан
    Комментировать
  • В чем разница записи замыкания js?

    rockon404
    @rockon404
    Frontend Developer
    Это самовызывающаяся функция. Разницы нет. А замыканиями в JavaScript технически являются абсолютно все функции.
    Ответ написан
    Комментировать
  • Как вы боретесь со слабой типизацией и зачем ее придумали?

    rockon404
    @rockon404
    Frontend Developer
    Для этого в проектах используют TypeScript или Flow:
    const foo = (arg: number) => { /* do something with number type */ };

    Сейчас без них большие проекты лучше даже не начинать.

    О преимуществах слабой типизации:
    1. Удобство использования смешанных выражений (например из целых, вещественных чисел и строк).
    2. Абстрагирование от типизации и сосредоточение на задаче.
    3. Краткость записи.
    Ответ написан
    Комментировать
  • Как правильно построить логику для поиска по массивам?

    rockon404
    @rockon404
    Frontend Developer
    var sorted_fruits_2016 = fruits_2016.sort(sortById);
    var sorted_fruits_2017 = fruits_2017.sort(sortById);
    var sorted_fruits_2018 = fruits_2018.sort(sortById);
    
    var result_2016_2017 = compare(sorted_fruits_2016, sorted_fruits_2017);
    var result_2017_2018 = compare(sorted_fruits_2017, sorted_fruits_2018);
    
    function compare(oldArr, newArr) {
      var deleted = [], added = [], notChanged = [];
      var innerIndex = 0;
    
      if (!newArr.length) {
        return {
          added: added,
          deleted: oldArr,
          notChanged: notChanged
        };
      }
    
      for (var i = 0; i < newArr.length; i++) {
        if (innerIndex >= oldArr.length - 1) {
          added.push(newArr[i]);
          continue;
        }
    
        for (var j = innerIndex; j < oldArr.length; j++) {
          var newElId = newArr[i][0];
          var oldElId = oldArr[j][0];
          
          if (newElId > oldElId) {
            deleted.push(oldArr[j]);
          } else if (newElId < oldElId) {
            added.push(newArr[i]);
            innerIndex = j;
            break;
          } else {
            notChanged.push(newArr[i]);
            innerIndex = j + 1;
            break;
          }
        }
      }
      
    
      return {
        deleted: deleted,
        added: added,
        notChanged: notChanged
      };
    }
    
    function sortById(a, b) {
      return a[0] - b[0];
    }

    Демо.

    Если сравнений надо делать не много, а например по требованию пользователя, то можно сделать функцию обертку для сортировки и сравнения:
    var result = compare(fruits_2016, fruits_2017);
    
    console.log('result', result);
    
    function compare(oldArr, newArr) {
      var sortedOldArr = oldArr.sort(sortById);
      var sortedNewArr = newArr.sort(sortById);
      
      return compareSorted(sortedOldArr, sortedNewArr);
    }
    
    function compareSorted(oldArr, newArr) {
      var deleted = [], added = [], notChanged = [];
      var innerIndex = 0;
      
      if (!newArr.length) {
        return {
          added: added,
          deleted: oldArr,
          notChanged: notChanged
        };
      }
    
      for (var i = 0; i < newArr.length; i++) {
        if (innerIndex >= oldArr.length - 1) {
          added.push(newArr[i]);
          continue;
        }
    
        for (var j = innerIndex; j < oldArr.length; j++) {
          var newElId = newArr[i][0];
          var oldElId = oldArr[j][0];
          
          if (newElId > oldElId) {
            deleted.push(oldArr[j]);
          } else if (newElId < oldElId) {
            added.push(newArr[i]);
            innerIndex = j;
            break;
          } else {
            notChanged.push(newArr[i]);
            innerIndex = j + 1;
            break;
          }
        }
      }
      
    
      return {
        deleted: deleted,
        added: added,
        notChanged: notChanged
      };
    }
    
    function sortById(a, b) {
      return a[0] - b[0];
    }


    Демо.
    Ответ написан
  • Почему мобильный хром неправильно масштабирует и позиционирует некоторые элементы?

    rockon404
    @rockon404
    Frontend Developer
    Не допускайте появления горизонтального скролла для всей страницы в мобильной версии.
    Для таблиц можно использовать контейнер со скроллом.
    Почитайте статью про таблицы в адаптивном дизайне.
    Там есть готовые решения.
    Ответ написан
    1 комментарий
  • Нужно ли писать в классе элемент и модификатор вместе по БЭМ?

    rockon404
    @rockon404
    Frontend Developer
    Правильна. Так как, если делать модификатор только для элемента, другой программист может написать нечто подобное:
    <a href="http://mail.ru" class="item-link item-link_first">item</a>

    и сам того не желая, переопределить ваши стили.

    Соглашение по именованию.

    UPD: не понял вопрос. Подумал, что вы хотите использовать такую запись:
    <a href="http://mail.ru" class="top-menu__item-link item-link_first">item</a>

    А вы спрашивали про такой вариант?:
    <a href="http://mail.ru" class="top-menu__item-link_first">item</a>

    Так тоже делать нельзя. Так как вам в таком случае как минимум придется дублировать базовые стили во всех модификаторах, что не логично.
    Ответ написан
    Комментировать
  • Реализация комментариев express.js?

    rockon404
    @rockon404
    Frontend Developer
    Все верно:
    1. пользователь пишет комментарий и нажимает отправить.
    2. инициируется запрос на сервер.
    3. сервер проводит валидацию полученных данных, если она пройдена пишет комментарий в БД и отправляет ответ с со статусом 200 и комментарием с присвоенным идентификатором или просто идентификатор. Если нет возвращает ошибку.
    4. интерфейс отрисовывает полученный комментарий в треде, либо сообщение об ошибке.
    Использование БД для этой задачи обязательно.
    Ответ написан
    2 комментария