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

Поделиться
HTML-код
  • Опубликовано: 18 окт 2024

Комментарии • 94

  • @ВладиславПузырев-ю8л
    @ВладиславПузырев-ю8л 3 года назад +28

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

    • @it-sin9k
      @it-sin9k  3 года назад +2

      Спасибо!)

  • @underpog5347
    @underpog5347 3 года назад +26

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

    • @it-sin9k
      @it-sin9k  3 года назад +5

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

  • @eugenetit8072
    @eugenetit8072 Месяц назад

    Огромное спасибо за разъяснение!

  • @ivanp7697
    @ivanp7697 Год назад +5

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

    • @it-sin9k
      @it-sin9k  Год назад

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

  • @DmitriLipski
    @DmitriLipski 3 года назад +9

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

  • @zooyotz
    @zooyotz Год назад +1

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

  • @kri4evskiy
    @kri4evskiy 3 года назад +5

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

    • @it-sin9k
      @it-sin9k  3 года назад

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

    • @it-sin9k
      @it-sin9k  3 года назад

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

    • @АлексейЛоскутников-ю4р
      @АлексейЛоскутников-ю4р 3 года назад +2

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

  • @pashastrayt8928
    @pashastrayt8928 2 года назад +1

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

    • @it-sin9k
      @it-sin9k  2 года назад

      Спасибо!)

  • @artemu78
    @artemu78 2 года назад +1

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

    • @it-sin9k
      @it-sin9k  2 года назад

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

  • @mtyEyes
    @mtyEyes 3 года назад +3

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

  • @lollolich2399
    @lollolich2399 3 года назад +4

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

    • @it-sin9k
      @it-sin9k  3 года назад

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

  • @mikhailstepanischev8316
    @mikhailstepanischev8316 3 года назад +3

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

  • @artemu78
    @artemu78 2 года назад +1

    Спасибо!

    • @it-sin9k
      @it-sin9k  2 года назад +1

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

  • @hihoho1578
    @hihoho1578 3 года назад

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

    • @it-sin9k
      @it-sin9k  3 года назад

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

  • @ashbarso7752
    @ashbarso7752 2 года назад +1

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

  • @denisafonkin8795
    @denisafonkin8795 2 года назад

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

  • @gritsienkooleg3447
    @gritsienkooleg3447 Год назад

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

  • @LodkaGG
    @LodkaGG 2 года назад +1

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

  • @kostyapolishko6282
    @kostyapolishko6282 3 года назад +1

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

  • @NoName-zh7cc
    @NoName-zh7cc 3 года назад +1

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

  • @raufhashimov241
    @raufhashimov241 3 года назад

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

    • @it-sin9k
      @it-sin9k  3 года назад +1

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

  • @НикитаГончаров-е8ш

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

  • @michaelwhyte1021
    @michaelwhyte1021 3 года назад

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

    • @it-sin9k
      @it-sin9k  3 года назад

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

  • @awakeupcall5336
    @awakeupcall5336 Год назад

    спасибо

  • @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 а сразу актуальная ширина на клиенте

  • @serhiirumiantsev7736
    @serhiirumiantsev7736 3 года назад +1

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

    • @it-sin9k
      @it-sin9k  3 года назад +1

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

  • @kostyakozlov5289
    @kostyakozlov5289 2 года назад

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

    • @it-sin9k
      @it-sin9k  2 года назад +1

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

  • @aleksandrmikhailov3255
    @aleksandrmikhailov3255 3 года назад

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

    • @it-sin9k
      @it-sin9k  3 года назад +1

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

    • @aleksandrmikhailov3255
      @aleksandrmikhailov3255 3 года назад +1

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

  • @VeaceslavBARBARII
    @VeaceslavBARBARII 9 месяцев назад

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

  • @sykalovandrey6090
    @sykalovandrey6090 2 года назад

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

    • @it-sin9k
      @it-sin9k  2 года назад

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

  • @vadymserdiuk2779
    @vadymserdiuk2779 3 года назад

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

    • @it-sin9k
      @it-sin9k  3 года назад +1

      Спасибо!

  • @Aleksandr-w4e
    @Aleksandr-w4e 2 года назад

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

  • @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 Звучит как неплохое исследование) если будет желание поисследовать что то еще любопытное, можно ролик про это записать и выложить у нас)

  • @-X-Ray-
    @-X-Ray- 3 года назад +1

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

  • @vitabramov89
    @vitabramov89 3 года назад

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

  • @bekabdimanas
    @bekabdimanas 3 года назад

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

  • @hamletmuradyan5692
    @hamletmuradyan5692 Год назад

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

  • @IMHolub
    @IMHolub 3 года назад

    Годно

  • @ВладиславПузырев-ю8л

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

    • @it-sin9k
      @it-sin9k  3 года назад +1

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

    • @wh1teb1ack92
      @wh1teb1ack92 2 года назад

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

  • @sdv7525
    @sdv7525 Год назад

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

    • @it-sin9k
      @it-sin9k  Год назад

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

  • @userJakov
    @userJakov 11 месяцев назад

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

    • @it-sin9k
      @it-sin9k  11 месяцев назад

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

  • @koshgosh3081
    @koshgosh3081 2 года назад

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

    • @it-sin9k
      @it-sin9k  2 года назад

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

  • @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

  • @alexandrchazov6185
    @alexandrchazov6185 3 года назад

    useLayoutEffect, componentDidMountб useEffect

  • @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 7 месяцев назад

    дыд маунт

    • @it-sin9k
      @it-sin9k  7 месяцев назад

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

    • @djohardudaev95
      @djohardudaev95 7 месяцев назад

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

  • @makeoverweb2663
    @makeoverweb2663 3 года назад

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