Разделение логики и представления в React-приложении

แชร์
ฝัง
  • เผยแพร่เมื่อ 4 ส.ค. 2024
  • Самыми популярными подходами в декомпозиции React-компонентов являются hoc и hook. Т.е. компоненты высшего порядка и кастомные хуки. С их помощью можно сделать приложение более гибким и легче тестируемым, однако сами подходы немного разнятся.
    Исходный вариант codesandbox.io/s/modern-sun-p...
    Вариант с hoc codesandbox.io/s/keen-montalc...
    Вариант с hook codesandbox.io/s/tender-sid-q...
    00:00 Постановка задачи
    02:13 HOC - компоненты высшего порядка
    16:34 Hooks - кастомные хуки
    26:39 Подведение итогов
    Мои курсы по вебу с купонами:
    ✅ mishanep.com/
    📢 Поддержка канала:
    / mishanep
    www.tinkoff.ru/rm/nepomnyasch...
    paypal.me/mishanep

ความคิดเห็น • 69

  • @victormog
    @victormog 2 ปีที่แล้ว +5

    Лучший пример использования кастомных хуков, что я видел...

  • @dimondmarcker3179
    @dimondmarcker3179 2 ปีที่แล้ว +7

    спасибо за самые лучшие, бесплатные, красивые, изящные и понятные уроки в интернете! ❤

  • @valeramischenko9391
    @valeramischenko9391 2 ปีที่แล้ว +11

    Спасибо, Михаил, классный контент, легкое доходчивое объяснение, рад что нашел ваш канал))

  • @dimahinev
    @dimahinev ปีที่แล้ว

    Михаил, благодарю вас
    ничего лучше не видел, коротко, просто, информативно, позитивно

  • @adam-front
    @adam-front 2 ปีที่แล้ว +1

    Благодарю, топовый контент, то чего не хватает.
    Разделение логики React, hooks, hoc, кастомные хуки

  • @irinal7766
    @irinal7766 2 ปีที่แล้ว

    Классный пример на HOC и custom hooks!
    Нравится доходчивое объяснение, смотрю уже не первое видео. Спасибо!

  • @force_of_abstinence
    @force_of_abstinence 2 ปีที่แล้ว

    Спасибо, Михаил, пригодились и мне твои знания! Дай Бог благ земных!

  • @outcast-cr5yy
    @outcast-cr5yy ปีที่แล้ว

    спасибо вам большое за такой полезный контент. То что вы делаете, для нас неоценимо.

  • @_oxios_
    @_oxios_ 2 ปีที่แล้ว +2

    Спасибо за урок! Было действительно полезно!

  • @vadimniziev5489
    @vadimniziev5489 2 ปีที่แล้ว

    Спасибо! Как всегда, очень актуальные ролики!

  • @iamcaptain7115
    @iamcaptain7115 ปีที่แล้ว

    Просто и наглядно. Спасибо, Михаил!

  • @oleg_northern
    @oleg_northern ปีที่แล้ว

    Вы просто лучший! Спасибо за вашу работу.

  • @ggadoctb
    @ggadoctb ปีที่แล้ว

    Было здорово увидеть видео с реализацией кастомных хуков, которые Вы часто в работе используете, мне как человеку на время забросившему реакт для работы на ангуляре, нужно в темпе поменять майндсет с сервисов на хуки)

  • @user-hd3ov5lj1u
    @user-hd3ov5lj1u 2 ปีที่แล้ว +1

    отличное видео, спасибо большое за ваш труд

  • @AlexGabber
    @AlexGabber 2 ปีที่แล้ว +1

    Отличное объяснение! Спасибо большое) С хоками теперь все понятно. Только я считаю, что они скорее не про разделение логики, их основной смысл в возможности слияния двух и более похожих, но разных компонентов. Возможно не прав, попробую понять на практике

  • @norwinlol
    @norwinlol 2 ปีที่แล้ว

    Спасибо за видео! Актуальную тему разбираете)

  • @user-de8qy1mw4g
    @user-de8qy1mw4g 2 ปีที่แล้ว

    Спасибо! Очень доступно и интересно.

  • @kamik0t0_yt83
    @kamik0t0_yt83 2 ปีที่แล้ว +1

    Хорошее видео. Я до всего этого сам допер. И приятно что в этом видео сделано также как и у меня на своих проектах - значит ход мыслей в нужном направлении)). Помню видео было на канале по Vue где чел сказал что логика приложения и её реализация не должны пересекаться, т.е. в данном случае видно что в компоненте есть сортировка и фильтрация - логики, но их реализаций в компоненте нет и все они находится в кастомных хуках. Единственное о чем не все говорят что кастомный хук отличается от обычной функции тем что его название начинается с use (например useFilter). Если вы не напишите use то вы не сможете использовать нативные хуки внутри такой функции. Может быть это очевидно, но может кому то будет полезно... мне бы было в свое время))

  • @aleradev_s3052
    @aleradev_s3052 2 ปีที่แล้ว

    Благодарю. Полезный материал 👍

  • @user-ue7lj2to9q
    @user-ue7lj2to9q 2 ปีที่แล้ว +3

    Не устаю восхищаться подачей материала. Великолепно! Спасибо за труд!

    • @mishanep
      @mishanep  2 ปีที่แล้ว

      Спасибо за позитив :)

    • @user-ue7lj2to9q
      @user-ue7lj2to9q 2 ปีที่แล้ว

      Мне как раз надо сделать фильтрацию билетов по 4 параметрам (checkbox). Это видео - то что меня спасёт :-)

  • @Maximurz1k
    @Maximurz1k ปีที่แล้ว

    Хорошее видео, спасибо!
    С Хуками пример выглядит более элегантно, Хоки я бы мб использовал как декораторы в несте: авторизация, DI, логирование, гварды и тд

  • @DmytroYaroshenko-qk4lh
    @DmytroYaroshenko-qk4lh ปีที่แล้ว

    Супер! Спасибо!

  • @vladtkachenko6822
    @vladtkachenko6822 ปีที่แล้ว

    спасибо большое, Михаил! прям идеально вовремя ютубчик подбросил это видео

  • @user-xn2jn8tt3b
    @user-xn2jn8tt3b 2 ปีที่แล้ว

    Мы писали хуки когда это не было мейнстримом 😅 Только они называли хелперсами 😉
    Спасибо за видео. Очень наглядно. Добавлю ссылочку в пособие для новобранцев.

    • @alexidino
      @alexidino 2 ปีที่แล้ว

      новобранцы не потянут, слишком быстро тараторит и мелькает все.

  • @fiatluxinregnonoctis
    @fiatluxinregnonoctis ปีที่แล้ว

    Спасибо большое

  • @user-zw7tl7ic4k
    @user-zw7tl7ic4k 2 ปีที่แล้ว +4

    Спасибо , сделайте видео по интеграции платёжной системы ✊ тема очень интересная

    • @mishanep
      @mishanep  2 ปีที่แล้ว +8

      Здесь бэкенд тогда потребуется. Напрямую с фронта слать в платежную систему запросы с секретными ключами как минимум небезопасно. Как минимум, NextJS. Я подумаю в эту сторону.

    • @userJakov
      @userJakov 2 ปีที่แล้ว +1

      @@mishanep было бы интересно посмотреть!

  • @d_r_robot
    @d_r_robot 2 ปีที่แล้ว

    Спасибо!

  • @maxfillsen957
    @maxfillsen957 2 ปีที่แล้ว

    Спасибо за разбор, информативно

    • @mishanep
      @mishanep  2 ปีที่แล้ว +1

      Надеюсь хотя бы частично ответил на ваш вопрос про умные/глупые компоненты.

    • @maxfillsen957
      @maxfillsen957 2 ปีที่แล้ว

      @@mishanep да, вполне

  • @AndrewFloatrx
    @AndrewFloatrx ปีที่แล้ว

    13:51, интересная композиция оберток... 👍

  • @olfi1728
    @olfi1728 2 ปีที่แล้ว

    Спасибо.

  • @romanmed9035
    @romanmed9035 2 ปีที่แล้ว

    недавно решал подобную задачу на кастомном хуке. жаль что не удосужился поискать и не встретил это видео. так же сначала хотел с хок делать. но все же на хуке сделал.

  • @darkside2436
    @darkside2436 2 ปีที่แล้ว

    Nice

  • @OsaDArT
    @OsaDArT 2 ปีที่แล้ว

    Отличное видео! Спасибо!
    Если кому интересно: есть ещё классный подход 'Контейнерные и презентационные компоненты', как собрат и конкурент НОС-у. Как по мне он более простой и читаемый.

  • @sergeyfilatov3027
    @sergeyfilatov3027 2 ปีที่แล้ว +2

    В примерах в видео всегда код который хорошо вынести в отдельный хук, который потом можно переиспользовать.
    А вот что делать с куском императивного кода, который ты понимаешь, что точно нигде больше использоваться не будет? Все равно вынести в хук? А вариант просто создать какой то файл, что то типа XxxModel и в него выносить куски такого кода, который невозможно переиспользовать, просто что бы создать слой абстракции, нормальный, как считаете?

    • @mishanep
      @mishanep  2 ปีที่แล้ว +5

      Мы в проектах создаём много узкоспецифичных хуков, которые только в 1 компоненте и используются. Здесь вопрос их хранения. Переспользуемые в общей папке, как на видео. Узкие - в папке с компонентом (обычно 1 компонент - 1 папка, чтобы хранить там тесты, стили и прочие штуковины).

  • @olnimus
    @olnimus ปีที่แล้ว

    Сделайте пожалуйста про разделение логики с Apollo.

  • @abereznitskiy31
    @abereznitskiy31 2 ปีที่แล้ว +1

    Михаил, спасибо за видео. Скажите пожалуйста, если используется redux, стоит ли выносить логику связанную с useSelectror и useDispatch в кастомные хуки для разделения? Если да, то где лучше эти хуки подключать? Там где они непосредственно требуются или в родительском компоненте и передавать значения из хука по пропсам детям?

    • @mishanep
      @mishanep  2 ปีที่แล้ว +2

      Здравствуйте.
      Да, имеет смысл выносить. И в кастомные хуки подключать хуки редакса, возвращая в компонент готовые данные и методы.

    • @mishanep
      @mishanep  2 ปีที่แล้ว +2

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

  • @user-eg2pz4wk8z
    @user-eg2pz4wk8z 2 ปีที่แล้ว

    Спасибо огромное за информативный ролик ! Планируется ли в будущем видео по jest тестированию и React Testing Library ?

    • @mishanep
      @mishanep  2 ปีที่แล้ว

      Здравствуйте.
      На канале уже есть видео по React testing library и видео по end 2 end тестированию с Cypress

    • @user-eg2pz4wk8z
      @user-eg2pz4wk8z 2 ปีที่แล้ว

      @@mishanep Увидел, спасибо тебе за такой бомбезный контент

  • @ssurrokk
    @ssurrokk ปีที่แล้ว

    🕺🕺🕺

  • @user-ny3fg6vl6h
    @user-ny3fg6vl6h ปีที่แล้ว

    Хуки топ, с Хок выглядит страшнее чем было до

  • @mikebotkin9094
    @mikebotkin9094 2 ปีที่แล้ว

    Сильно! А почему названия файлов с хуками не имеют префикса "use"? на мой взгляд удобно, когда файлы именуются так же, как и экспортируемые функции...

    • @mishanep
      @mishanep  2 ปีที่แล้ว

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

  • @_justadam_
    @_justadam_ ปีที่แล้ว

    Здравствуйте можете подсказать что за кеширования и зачем оно здесь?)

  • @hohage4284
    @hohage4284 ปีที่แล้ว

    разве нет рекомендации не использовать хук useEffect внутри hoc?

  • @SiriScare
    @SiriScare ปีที่แล้ว

    Михаил, уже говорил спасибо за потрясающе полезные уроки. Кажется ютуб решил удалить тот коммент. Так что еще раз повторю.
    Так же хочу сказать, что возникла проблема. Приведу решение для тех у кого тоже самое.
    Не знаю что конкретно повлияло, возможно новая версия реакта. Сделал Hoc-компонент, по примеру WithApp на 8.50 мин.
    Так он работал, но при попытке использовать useState выдал ошибку
    React Hook "useState" cannot be called inside a callback. Нашел решение
    Вкратце, вместо withapp(Component) { сделал withapp(Component) => { , + вместо return function (props) { сделал return function Comp(props) { .
    Хотел привести ссылки, но ютуб просто удаляет комментарии, возможно из-за них. Поэтому без меня найдете.

  • @dim3143
    @dim3143 2 ปีที่แล้ว +1

    Кстати запись типа export default withApp(App); в компонентах тоже много где запрещена, так ты привязываешь компонент к конкретному контейнеру. Теряется сам смысл использования хоков. Вместо этого используют вложения как у html тегов.

    • @maxhermany
      @maxhermany 2 ปีที่แล้ว

      Согласен. Но и с хуками получилось, что компонент как был с логикой, так и остался, просто теперь она вынесена в хуки.
      По идее, чтобы сделать чисто presentational компонент, нужно создать компонент-контейнер (хок?), который будет использовать те самые хуки и рендерить презентационный компонент, передавая ему необходимые пропсы.
      Тем не менее, как демонстрация различия хоков от хуков, видео годное 👌

  • @jorgenUA
    @jorgenUA 2 ปีที่แล้ว +1

    Просьба: объяснить на примерах что класть в Redux, а что нет

    • @constantine6464
      @constantine6464 2 ปีที่แล้ว

      как говорит наш мессия Дэн Абрамов - ничего 😂

  • @denpol9956
    @denpol9956 2 ปีที่แล้ว

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

    • @mishanep
      @mishanep  2 ปีที่แล้ว

      Справедливо. Как минимум, каждый хок - это дополнительный узел в виртуальном доме.

  • @user-iu7ll2wx4x
    @user-iu7ll2wx4x 2 ปีที่แล้ว

    Спасибо за видео, но зря дебаунс смешали с фильтрами - вы нарушили единую ответственность + хук фильтра ничего не говорит о задержке

    • @mishanep
      @mishanep  2 ปีที่แล้ว

      Не думаю, что хук фильтра должен предлагать настройку задержки. При желании можно добавить и такую настройку с дефолтным значением.
      Как бы вы реализовали дебаунс? И в чем конкретно видете нарушение? Фильтр фильтрует, дебаунс реализует задержку. По-моему каждый занимается своим единственным делом.

    • @user-iu7ll2wx4x
      @user-iu7ll2wx4x 2 ปีที่แล้ว

      @@mishanep Например я подключаю ваш хук для фильтрации в свое приложение , я не могу изменить код хука и увидеть код хука . Но и задержку тоже не хочу,что делать?) Хук задержки я бы вызывал в компоненте.

    • @mishanep
      @mishanep  2 ปีที่แล้ว +1

      @@user-iu7ll2wx4x любое приложение старается быть консистентным, поэтому я с трудом представляю себе ситуацию, где в одной части приложения фильтр нужен с задержкой, а в другой - без. И сама задержка вероятнее всего будет всегда одинаковой, поэтому настройка и не требуется.
      Другой разговор, если мы пишем свою библиотеку хуков общего пользования, тогда имеет смысл поработать над гибкостью. Но это более сложная тема.

  • @mico6762
    @mico6762 2 ปีที่แล้ว

    Очень жаль, что вы проиграли Магнусу в матче за шахматную корону:(

    • @mishanep
      @mishanep  2 ปีที่แล้ว +6

      Мои коллеги по работе больше любили вспоминать вывеску моей игры против корейского гроссмейстера Нихуа.

  • @ISKCON-16108
    @ISKCON-16108 2 ปีที่แล้ว

    "Смысла немного" - его вообще нет.