какая разница между useLayoutEffect, componentDidMount и useEffect?

Поділитися
Вставка
  • Опубліковано 11 лип 2024
  • Мы плавно переписываем компоненты с componentDidMount на useEffect, но на 100 ли процентов они идентичны? Данное видео поможет Вам в этом разобраться!
    Поддержать Айти Синяка можно здесь:
    UA-cam: / @it-sin9k
    boosty: boosty.to/sin9k
    Patreon: / itsin9k
    00:00 Анонс темы
    00:33 Викторина с componentDidMount
    01:38 Правильный ответ
    01:49 Проверим со sleep
    02:37 Делаем выводы о componentDidMount
    03:15 Сравним с useEffect
    04:01 Делаем выводы о useEffect
    04:31 Подтверждение из документации
    05:12 Аналога useEffect не существует на классах
    05:37 Знакомство с useLayoutEffect
    05:54 Задумайтесь...
    06:19 Подписывайтесь!
    06:53 Рекомендованные видео
    Подписаться на канал: / @it-sin9k
    Twitter: / it_sin9k
    -------------------------
    Данный канал создан для инициирования бесед на различные темы IT сферы (социальные / технические), а также для тех кому короткая видео выжимка статьи, выступления на конференции или же просто личных мыслей, являются более удобным форматом

КОМЕНТАРІ • 93

  • @user-je1el3gj9d
    @user-je1el3gj9d 3 роки тому +28

    Круто что ты такие достаточно глубокие темы поднимаешь по react

    • @it-sin9k
      @it-sin9k  3 роки тому +2

      Спасибо!)

  • @DmitriLipski
    @DmitriLipski 3 роки тому +9

    Спасибо за Ваши видео. Как всегда, очень подробно и доходчиво!

  • @mtyEyes
    @mtyEyes 3 роки тому +3

    Спасибо за ролик. Пример с квадратом очень наглядный и понятный

  • @ashbarso7752
    @ashbarso7752 2 роки тому +1

    Красавчик, все ясно и очень полезно оказалось

  • @underpog5347
    @underpog5347 3 роки тому +26

    Спасибо, отличный контент. Орлов молодец, будьте как Орлов)

    • @it-sin9k
      @it-sin9k  3 роки тому +5

      возьмем как девиз канала))) "Орлов молодец, будьте как Орлов!"

  • @NoName-zh7cc
    @NoName-zh7cc 2 роки тому +1

    Просто супер, спасибо

  • @user-nd5zd5kc5k
    @user-nd5zd5kc5k Рік тому

    Как всегда топ 🔥🔥

  • @mikhailstepanischev8316
    @mikhailstepanischev8316 3 роки тому +3

    Очень интересно,спасибо ! useLayoutEffect, componentDidMount и useEffect

  • @Lodka_Is_Sad
    @Lodka_Is_Sad Рік тому +1

    Спасибо за пояснение, очень познавательно.

  • @kostyapolishko6282
    @kostyapolishko6282 2 роки тому +1

    Это действительно годный контент!!

  • @ivanp7697
    @ivanp7697 Рік тому +5

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

    • @it-sin9k
      @it-sin9k  Рік тому

      Спасибо за приятный комментарий :)

  • @user-wh9mc2po7g
    @user-wh9mc2po7g 2 роки тому

    спасибо, очень полезно и наглядно

  • @michaelwhyte1021
    @michaelwhyte1021 3 роки тому

    Классная обработка видео, все четко и понятно. Спасибо за труд, подписался!

    • @it-sin9k
      @it-sin9k  3 роки тому

      мы очень рады :)

  • @gritsienkooleg3447
    @gritsienkooleg3447 Рік тому

    Помогло, спс большое тебе, дружище ))

  • @lollolich2399
    @lollolich2399 3 роки тому +4

    Отличное видео, после прочтения документации ваше видео помогло разобраться до конца в теме, благодаря наглядному примеру. Лайк и подписочка!

    • @it-sin9k
      @it-sin9k  3 роки тому

      Добро пожаловать :)

  • @makeoverweb2663
    @makeoverweb2663 3 роки тому

    Очень полезная инфа, спасибо!

  • @kri4evskiy
    @kri4evskiy 3 роки тому +5

    Ухтышка! Очень и очень!!! Вот про useLayoutEffect() я вообще нигде не встречал в русскоязычном сегменте. А тут ещё и сопоставление с обычным useEffect() и componentDidMount(). Конечно, без этого материал был бы не расскрыт, но вы раскрыли его) Спасибо! Успеха!

    • @it-sin9k
      @it-sin9k  3 роки тому

      Это очень круто!)
      но я еще рекомендую посмотреть плейлист Frontend Solid, судя по опросам он более успешный чем React плейлист))

    • @it-sin9k
      @it-sin9k  3 роки тому

      если не сикрет, а где вы наткнулись на наш канал? а то сегодня большой прирост, а мы не знаем откуда ноги растут)

    • @user-cd1sr5sx2r
      @user-cd1sr5sx2r 3 роки тому +2

      @@it-sin9k Была ссылка с канала It kamasutra, от Димыча.

  • @serhiirumiantsev7736
    @serhiirumiantsev7736 3 роки тому +1

    спасибо, как всегда, супер.

    • @it-sin9k
      @it-sin9k  3 роки тому +1

      Благодарочка :)

  • @denisafonkin8795
    @denisafonkin8795 Рік тому

    спасибо тебе!

  • @pashastrayt8928
    @pashastrayt8928 Рік тому +1

    Супер, спасибо)
    Я начинающий разработчик, и такие видео, поясняющие тонкие моменты, очень для меня кстати)
    Подача, монтаж просто класс.

  • @zooyotz
    @zooyotz Рік тому +1

    Невероятно качественный контент! Это подписка и фура лайков!

  • @hihoho1578
    @hihoho1578 3 роки тому

    Спасибо)
    Поддержу лайком и комментом

    • @it-sin9k
      @it-sin9k  3 роки тому

      лайк для нас на вес золота!)

  • @artemu78
    @artemu78 Рік тому +1

    Спасибо!

    • @it-sin9k
      @it-sin9k  Рік тому +1

      спасибо за поддержку!

  • @raufhashimov241
    @raufhashimov241 3 роки тому

    Канал топчик.Я доволен :)

    • @it-sin9k
      @it-sin9k  3 роки тому +1

      рады стараться :)

  • @artemu78
    @artemu78 Рік тому +1

    Спасибо ребята. Отдельный респект за простой и эффективный sleep().

    • @it-sin9k
      @it-sin9k  Рік тому

      Всегда приятно читать такие комментарии)

  • @awakeupcall5336
    @awakeupcall5336 Рік тому

    спасибо

  • @vadymserdiuk2779
    @vadymserdiuk2779 3 роки тому

    Отличная работа

  • @beksultanabdimanasov4838
    @beksultanabdimanasov4838 3 роки тому

    Вау класс просто

  • @vitabramov89
    @vitabramov89 3 роки тому

    ретЁрн)))
    спасибо за видео!

  • @INGolub
    @INGolub 3 роки тому

    Годно

  • @-X-Ray-
    @-X-Ray- 3 роки тому +1

    Кайф-кайф-кайф!

  • @aleksandrmikhailov3255
    @aleksandrmikhailov3255 3 роки тому

    Контент, как всегда, шикарен! Подскажи, планируешь ли записывать что-то подобное про, например, по Flux? Интересно было бы про Редакс послушать

    • @it-sin9k
      @it-sin9k  3 роки тому +1

      Спасибо!)
      Я проводил голосовалку, какую тему после React hooks раскрыть. И там как раз таки была тема Redux, но люди выбрали тему Паттерны) Поэтому учавствуйте в будущих голосовалках)

    • @aleksandrmikhailov3255
      @aleksandrmikhailov3255 3 роки тому +1

      @@it-sin9k я только недавно открыл для себя этот канал) на голосовалки не успел. Но паттерны - это не хуже ни разу))

  • @kostyakozlov5289
    @kostyakozlov5289 2 роки тому

    Хочется узнать планируется ли контент на тему Concurent. Тема, дейтвительно,
    не тривиальная

    • @it-sin9k
      @it-sin9k  2 роки тому +1

      Есть мысли сделать видео по этому поводу, но не в ближайшее время. Ближайшие выпусков 5 уже распланированы

  • @sykalovandrey6090
    @sykalovandrey6090 2 роки тому

    Спасибо за материал! Как я только не пробовал через useEffect и useLayoutEffect и у меня всё ровно dispatch(createAsyncThunk...) } , [ ] ) дважды подгружает данные... Я надеюсь Вы знакомы с подобной ситуацией и можете подсказать, почему так происходит у меня)

    • @it-sin9k
      @it-sin9k  2 роки тому

      мне бы код увидеть, причины могут быть разными :)

  • @IIIHANDYMANIII
    @IIIHANDYMANIII 2 роки тому

    Занятно, проверил, в react 17.0.2 синхронный sleep не фризит render, сначала отрабатывает setState, затем после фриза остальная часть componentDidMount

    • @it-sin9k
      @it-sin9k  2 роки тому

      а где устанавливали sleep?

    • @IIIHANDYMANIII
      @IIIHANDYMANIII 2 роки тому

      @@it-sin9k В componentDidMount

    • @IIIHANDYMANIII
      @IIIHANDYMANIII 2 роки тому

      @@it-sin9k чем я вчера смотрел хз, синхронный sleep конечно фризит, мне вот не понятно как так выходит что рендерится сразу результат setState(тот что в componentDidMount, при наличии sleep перед setState). Судя по логам повторный рендер происходит после sleep, а на экране тем временем уже результат «повторного» рендеринга.

    • @it-sin9k
      @it-sin9k  2 роки тому

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

    • @pkhorikov
      @pkhorikov 2 роки тому

      @@it-sin9k у меня аналогичное поведение на react@18.0.0.
      import React, { useState, useEffect, useRef } from "react";
      export const RedFigureFc: React.FC = (): JSX.Element => {
      const [width, setWidth] = useState(0);
      const ref: React.RefObject = useRef();
      useEffect(() => {
      const start = new Date().getTime();
      let end = start;
      while (end < start + 3 * 1000) {
      end = new Date().getTime();
      }
      setWidth(ref.current.clientWidth);
      }, []);
      return (


      width: { width }

      );
      }
      width не 0 а сразу актуальная ширина на клиенте

  • @dmtrkskv
    @dmtrkskv Рік тому

    Объясните плиз, может я что-то неправильно понимаю. Вызов setState в componentDidMount асинхронный, поэтому у браузера есть возможность отрисовать 0, но мы почему-то сразу видим 220 без каких-либо мерцаний. У меня есть подозрения, что setState - это микрозадача, поэтому пока состояние не обновится, до нового кадра браузера дело не доходит.

    • @it-sin9k
      @it-sin9k  Рік тому

      Если бы это была бы микрозадача мы бы никогда не увидели бы ноль с синхронным кодом в ней. Думаю тут надо смотреть на то как написан React, а не на event loop. Я думаю если просто написать в componentDidMount setState, то react просто успеваю за 1 frame нарисовать render, после этого изменить state и опять провести render. В этом же и суть виртуального дома, что он может обновиться много раз, а отрисовать лишь 1 раз. Опять же, это просто гипотеза, а не точный факт :)

    • @dmtrkskv
      @dmtrkskv Рік тому +1

      ​@@it-sin9k записал работу примера из видео в Chrome Dev Tools и немного удивился) Вызов setState из componentDidMount просто вносит изменения в переменные реакта и возвращает управление методу жизненного цикла. При этом вся цепочка действий (первый рендер -> обновление DOM -> componentDidMount -> setState -> повторный рендер -> повторное обновление DOM) выполняется внутри одной макрозадачи. Так что кадру с "0" попросту некуда вклиниться.
      Запутало то, что setState считается асинхронным, поэтому ошибочно думал, что второй рендер будет выполняться в отдельной макрозадаче)

    • @it-sin9k
      @it-sin9k  Рік тому +1

      @@dmtrkskv Звучит как неплохое исследование) если будет желание поисследовать что то еще любопытное, можно ролик про это записать и выложить у нас)

  • @VeaceslavBARBARII
    @VeaceslavBARBARII 6 місяців тому

    Вместо componentDidCatch можно использовать useErrorBoundary

  • @user-je1el3gj9d
    @user-je1el3gj9d 3 роки тому

    Получается useEffect делает setTimeout колбека после того как react вызывает компонент чтобы получить разметку, а componentDidMount вызывается синхронно после метода render в самой первой макро таске и блокирует стек вызова и пока стек не будет свободен не выполниться перерисовка, я так понял.
    Странно почему componentDidMount по умолчанию не сделали планирующим макро таску в таком случае?)

    • @it-sin9k
      @it-sin9k  3 роки тому +1

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

    • @wh1teb1ack92
      @wh1teb1ack92 2 роки тому

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

  • @hamletmuradyan5692
    @hamletmuradyan5692 Рік тому

    Так будет более короткый.
    * * *
    function Exmaple2() {
    const [status, setStatus] = useState("========= NOT SET =========");
    useLayoutEffect(() => {
    setStatus("INITIALIZED");
    }, []);
    return {status};
    }

  • @sdv7525
    @sdv7525 11 місяців тому

    А кто больше комиссии заберет? ютуб спонсорство или патреон?

    • @it-sin9k
      @it-sin9k  11 місяців тому

      хмм, хороший вопрос. Комиссию больше берет патреон :)

  • @userJakov
    @userJakov 8 місяців тому

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

    • @it-sin9k
      @it-sin9k  7 місяців тому

      Я иногда публикую расшифровки своих же видео на хабре. Поэтому в обоих случаях я постил контент :)

  • @alexandrchazov6185
    @alexandrchazov6185 2 роки тому

    useLayoutEffect, componentDidMountб useEffect

  • @pkhorikov
    @pkhorikov 2 роки тому

    Не удалось воспроизвести ваш пример на React 18.0.0.
    export const RedFigureFc: React.FC = (): JSX.Element => {
    const [width, setWidth] = useState(0);
    const ref: React.RefObject = useRef();
    useEffect(() => {
    const start = new Date().getTime();
    let end = start;
    while (end < start + 3 * 1000) {
    end = new Date().getTime();
    }
    setWidth(ref.current.clientWidth);
    }, []);
    return (


    width: { width }

    );
    }
    у меня с первого рендера width = ref.current.clientWidth, а не 0 как в useState

    • @it-sin9k
      @it-sin9k  2 роки тому +1

      в 18 версии реакта ввели батчинг, соответственно код стал работать иначе. Теперь нужно использовать flushSync

  • @koshgosh3081
    @koshgosh3081 2 роки тому

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

    • @it-sin9k
      @it-sin9k  2 роки тому

      Спасибо за такую высокую похвалу!

  • @artemtreiko8436
    @artemtreiko8436 2 роки тому

    только что на хабре это читал - один в один

    • @it-sin9k
      @it-sin9k  2 роки тому +1

      Так это наверное наша же статья) некоторые видео я делал расшифровку на хабре)

  • @lomeat
    @lomeat 3 роки тому +1

    Исчерпывающе. Нечего добавить или убавить. Упоминание документации уже после примера, а не до, хорошо сказалось на закреплении того о чем идет речь.

    • @it-sin9k
      @it-sin9k  3 роки тому +1

      Спасибо!) мы работаем над подачей)

  • @_Black_Mirror_
    @_Black_Mirror_ 3 роки тому

    Запрещают материться в интернете, а так бы высказался по эмоциональнее про хорошее качество данного ролика

    • @it-sin9k
      @it-sin9k  3 роки тому

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

  • @djohardudaev95
    @djohardudaev95 3 місяці тому

    дыд маунт

    • @it-sin9k
      @it-sin9k  3 місяці тому

      а что не так с дыд маунт?) а то с комента непонятно)

    • @djohardudaev95
      @djohardudaev95 3 місяці тому

      @@it-sin9k местами слишком сильное Ы, режет слух