• Как исправить ошибку "TS2769: No overload matches this call." при dispatch асинхронного экшена?

    @Raey Автор вопроса
    Вроде разобрался. Нужно было задать корректные типы в вызове applyMiddleware (у меня это вообще не было сделано).
    Вот пример:
    const store = createStore(
      rootReducer,
      composeWithDevTools(
        applyMiddleware(
          thunk.withExtraArgument(api) as ThunkMiddleware<
            GlobalState,
            AllReduxActions,
            AxiosInstance
          >,
        ),
      ),
    );


    А вот где посмотрел: https://github.com/reduxjs/redux-thunk/blob/master...
    Надеюсь, будет кому-нибудь полезно.
    Ответ написан
    Комментировать
  • Git: объясните «на пальцах» разницу между rebase и cherry-pick?

    Все красиво объяснил Nkly777, только в блоке PS merge с rebase перепутаны.
    Добавлю картинок.

    git rebase devel - собачка на молнии - "сшивает" коммиты по дате их создания
    (ветка devel "растворяется" в основной ветке)
    518b8dbce1cd4f96b30de9782ae38fcd.png
    git merge devel - пожарная лестница, все коммиты ветки devel крепятся в конец, образуется пересечение
    (devel остается отдельной веткой, к которой можно вернуться)
    1ba8186d879d46ff85ea7c1e192328e2.png
    git chery-pick idea - забрать коммиты из ветки idea
    2717e3091f644ef2954aa2de4514f446.png
    Ответ написан
    2 комментария
  • Git: объясните «на пальцах» разницу между rebase и cherry-pick?

    barker
    @barker
    Э… даже не знаю что тут ещё сказать можно, совершенно разные действия ведь. Грубо говоря, в первом случае ветка переставляется (со всеми коммитами), во втором отдельно взятый коммит (или несколько, схлопываются в один как вариант) патчится на другую ветку. Отсюда же и разное использование и разные ограничения. И механизм разный. Для понимания механизмов надо изучать всякие там progit и на дереве экспериментировать визуально. А если бы механизмы понимали, этого вопроса 100% не возникло бы :)
    Ответ написан
    4 комментария
  • Git: объясните «на пальцах» разницу между rebase и cherry-pick?

    @Nkly777
    git chery-pick - ты забираешь комиты из одной ветки в другую, это бывает полезно когда изменения сделаные другим разработчиком в его ветке, прямо сейчас нужны тебе в твоей ветке, и что бы не писать этот код заново, ты забираешь его комит себе в ветку

    git rebase master - ты синхронизируешься с главной веткой в которую коммитят все разработчики проекта, это полезно когда кто-то изменил участок кода с которым ты сейчас работаешь в своей ветке, дабы через неделю ты смог без проблем смержиться с master веткой. Обычно делается каждое утро перед началом рабочего дня и в конце когда фича готова.

    git merge - обычно используется когда у вас 2 и более master ветки (к примеру master и prototype) в этих ветках очень много комитов (и rebase здесь не подходит) и обчно через пару недель, maintainer репозитория наработки из prototype ветки "сливает" в master ветку по средствам этого самого git merge

    P.S. Что бы легче предствить разницу между git merge и git rebase. Представь что merge как собачка на молнии у одежды - "сшивает" комиты по дате их создания.
    В то время как git rebase как пожарная лестница - при применении твои коммиты крепится на конец родительской ветки

    git merge используйте для мержа фич и фиксов в master ветку (как и делает это Github)
    а git rebase используется для своей ветку в которой вы работаете над фичей что бы забрать последние изменения с master ветку (для этого есть очень удобная команда `git pull --rebase origin master`, аналог 3х команд (`git checkout master; git pull origin master; git checkout mybrach; git rebase master`)
    Ответ написан
    2 комментария
  • Чем опасен force push?

    Lobotomist
    @Lobotomist
    Software Developer
    BD_ l3ftoverZ! ответил в принципе верно - можно затереть чужие изменения, но это не единственная опасность.

    Проблема еще и в том, что старые версии коммитов кто-то получил. И если при форсед пуше в содержимое коммитов были внесены изменения (например, они были поменяны местами и в итоге "сумма изменений" осталась та же, но порядок изменился) при пулле возникнут конфликты при попытке отребэйзить (смерджить) старые версии коммитов на новые. И тут уже все зависит от опытности и внимательности разработчика, который с этим столкнулся. Если он достаточно опытен - он поймет в чем дело и правильно разрулит ситуацию. А если нет - он начнет решать конфликты, накосячит при их решении, при пуше не проверит что он пушит не только свои коммиты, которые собирался, но и старые версии коммитов отребэйзенные на новые версии и это будет... неприятно.

    История из жизни.

    Вот реальная ситуация, которая произошла у меня на работе. К сожалению, за давностью лет конкретные детали я помню смутно, но в целом все было примерно так. В какой-то момент появилась ошибка. Причем код, в котором она была был очень "говнокод", человек его написавший уже уволился и понять в каком месте этот говнокод написан неправильно, не понимая "логики" автора было очень сложно. С помощью git-bisect я нашел проблемный коммит и стал дальше раскручивать клубок. В итоге выяснилось, что было нарушено по крайней мере три важных правила работы с гитом (описанные во внутренней вики и обязательные к исполнению) и если бы хотя бы одно из них нарушено не было - все было бы ок.
    1. Я сделал пуш в мастер и оперативно осознав, что что-то там не так быстренько поправил и залил форсед пушем исправления. Это было важно сделать именно так. Я решил, что во-первых, маловероятно, что кто-то успел сделать пулл, а во-вторых, даже если он и сделал - когда у него возникнут конфликты он либо сам все поймет, либо обратится ко мне. Первое нарушение. Мне следовало уведомить всех разработчиков об этом и объяснить как нужно правильно действовать.
    2. Естественно, один разработчик успел сделать пулл и отребэйзил на старый мастер ветку этого уволившегося и стал доделывать таск. Когда спустя продолжительное время он стал ребэйзить эту ветку на мастер у него полезли конфликты. Он не понял из-за чего эти конфликты возникли. Но храбро все их решил. Етественно, не правльно, уже хотя-бы потому, что он вообще не должен был их решать. Нарушение второго правила - "решай конфликты только тогда, когда ты понимаешь почему они возникли". Обратись он ко мне - все было бы в порядке.
    3. Когда он стал пушить свои изменения он нарушил третье правило: "Всегда проверяй список коммитов, которые ты пушишь". Он не заметил, что кроме "своих" коммитов, он так же пушит чужие, старые версии коммитов мастера, которые он отребэйзил на новые. Он должен был это заметить и забить тревогу - что такое, откуда эти коммиты, я их не делал. Опять же, обратись он ко мне - я бы на месте бы разобрался в чем дело, и исправил ситуацию.

    Так что не надейтесь на авось (как я в данном случае).


    В целом, получается так - если ты понимаешь, что обе проблемы - 1) перезатирание чужих изменений и 2) наличие у кого-то старых версий коммитов не актуальны - смело делай форсед пуш. Например:
    • Это ветка по задаче, в которой работаешь только ты и согласно workflow никто не должен без твоего ведома брать из нее какие-то коммиты.
    • Ты точно знаешь кто имеет доступ к ветке и уверен, что эти люди с ситуацией справятся корректно. Ты их предупредил и они знают что в таких ситуациях делать.
    Ответ написан
    Комментировать
  • Как проверить, что элемент массива содержит строку?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    Примерно так:
    // Получить первое совпадение с подстрокой
    array_all.find(s => s.includes(searchText))
    
    // Получить все совпадения с подстрокой
    array_all.filter(s => s.includes(searchText))
    Ответ написан
    Комментировать
  • Как проверить, что элемент массива содержит строку?

    r0n1x
    @r0n1x
    html, css, js
    <input oninput="search(this.value)">
        <div class="finded" />
        <script>
          const array_all = [
            'привет', 'пришел', 'приехал',
            'дом', 'дорога', 'игрушка'
          ]
          function search(value) {
            if (!value.trim()) return
            const arr = array_all.filter(el => el.includes(value))
            if (arr.length) {
              const elem = document.querySelector('.finded')
              if (elem) elem.textContent = arr.join(', ')
            }
          }
        </script>
    Ответ написан
    Комментировать
  • Фильтрация вложенных данных React?

    Я бы сделал два словаря (наборов соответствий данных):
    1. Название категории => Категория
    2. Название Item => Все категории с этим Item

    Дальше при фильтрации достаточно будет проверить наличие ключа в любом словаре (так вы поймете введена категория или Item), и вернуть значение по ключу.

    Словари можно составить один раз при получении данных.
    Всё написанное выше при условии что я правильно понял что вам нужно J
    Ответ написан
    Комментировать
  • Фильтрация вложенных данных React?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    1. В любой строке встречается пустая строка, по этому такой поиск выдаёт все значения.
    2. map складывает в выходной массив результат переданной функции. Поскольку она у вас возвращает отфильтрованный массив items, то в итоге у вас получается массив массивов items. Если вам нужно, чтоб возвращались категории - возвращайте категории.

    Ну и дважды одну и ту же работу делать не надо, можно обойтись одним reduce:
    сonst filterData = filter(arr, input.value);
    
    interface Category {
      category: string;
      list: Array<{
        item: string;
      }>;
    }
    
    function filter<T extends Category>(data: T[], value: string): T[] {
      if (!value) return data.slice(); // или [] если при пустом value нужен пустой массив
      value = value.toLowerCase();
      
      return data.reduce((result, category) => {
        if(category.category.toLowerCase().includes(value)) {
          result.push(category);
        } else {
          const list = category.list.filter(({ item }) => item.toLowerCase().includes(value));
          if (list.length) {
            result.push({
              ...category,
              list
            });
          }
        }
        return result;
      }, [] as T[])
    }
    Ответ написан
    Комментировать
  • Какая выгода компаниям "растить" джуниоров внутри себя?

    verkhoturov
    @verkhoturov
    Frontend Developer
    Добавлю свои пять копеек.

    Часто на проектах есть много рутины и ручной работы, где не нужны глубокие знания. Держать для этой рутины лишнего мидла \ сеньера очень невыгодно. Джун, под присмотром опытных коллег, может эту рутину успешно разгребать.
    Ответ написан
    Комментировать
  • Лучший способ изучения React?

    Официальная документация и практика
    Ответ написан
    Комментировать
  • В чём разница между reselect и хуками useCallback и useMemo?

    alex4answ
    @alex4answ
    Это очень разные вещи:

    1. useCallback - мемоизирует саму функцию, а не ее результат
    2. useMemo - мемоизирует результат функции
    3. Reselect - это вообще редаксовская штука, мемоизирует результаты селектора, и выстраивает зависимости одного от другого, если результат зависимого селектора не обновился - реселект не будет пересчитывать селектор. кароче говоря оптимизация.
    Ответ написан
    Комментировать
  • Работа после 11 класса?

    Kozack
    @Kozack
    Thinking about a11y
    Можно
    Ответ написан
    Комментировать
  • Как сделать редирект с домашнего роута на вложенный React-router 4?

    victorzadorozhnyy
    @victorzadorozhnyy Автор вопроса
    Все оказалось просто. в UserRouter не нужно еще раз оборачивать в Router и все работает
    Ответ написан
    Комментировать
  • Не могу понять принцип работы в react с setInterval & setTimeout?

    dpigo
    @dpigo
    Front-end developer
    Интервалы автоматически не могут остановиться, если не был сохранен их идентификатор и явно не был вызван clearInterval.

    В реакте - тоже самое. Даже если компонент стал неактивным интервалы будут выполняться. Поэтому если не хотите утечек - сохраняйте идентификаторы и явно вызывайте clearInterval в componentWillUnmount.

    Вот посмотрите пример: https://jsbin.com/zefopuw В консоли будет видно, что несмотря на то, что компоненты были удалены - интервалы все еще работают.
    Ответ написан
    1 комментарий
  • Какое регулярное выражение подойдет для проверки номера телефона?

    Зеленый свет для:
    +79261234567
    89261234567
    79261234567
    +7 926 123 45 67
    8(926)123-45-67
    123-45-67
    9261234567
    79261234567
    (495)1234567
    (495) 123 45 67
    89261234567
    8-926-123-45-67
    8 927 1234 234
    8 927 12 12 888
    8 927 12 555 12
    8 927 123 8 123

    ^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$
    Ответ написан
    5 комментариев
  • Как спрятать scrollbar в div и отставить возможность скроллинга?

    DotDash
    @DotDash
    •••• • •−•• •−•• −−− •−− −−− •−• •−•• −•• −−••−−
    Привет! Сейчас 2019 и это работает вот так:
    Ответ написан
    1 комментарий
  • Как сделать видео youtube адаптивным?

    Хабр. Самые простые техники адаптивной верстки:
    <div class="video">
      <iframe src="//www.youtube.com/embed/b7deZTDDEbs?rel=0&amp;showinfo=0" 
      frameborder="0" allowfullscreen></iframe>
    </div>

    .video {
    position: relative;
    padding-bottom: 56.25%;
    height: 0;
    overflow: hidden;
    }
    .video iframe, .video object, .video embed {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    }
    Ответ написан
    Комментировать
  • Как объяснять кадровикам быстрые смены работы?

    DevMan
    @DevMan
    Три места работы по три месяца - это год, а не десять.
    Можно сказать, что фрилансил, можно сказать что не работал по семейным обстоятельствам.
    Адекваты смотрят на человека и его скилы, а не где он работал. А от неадекватов стоит и нужно держаться в стороне.
    Ответ написан
    Комментировать