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

  Рет қаралды 31,495

АйТи Синяк

АйТи Синяк

Күн бұрын

Пікірлер
@ВладиславПузырев-ю8л
@ВладиславПузырев-ю8л 3 жыл бұрын
Круто что ты такие достаточно глубокие темы поднимаешь по react
@it-sin9k
@it-sin9k 3 жыл бұрын
Спасибо!)
@eugenetit8072
@eugenetit8072 2 ай бұрын
Огромное спасибо за разъяснение!
@underpog5347
@underpog5347 4 жыл бұрын
Спасибо, отличный контент. Орлов молодец, будьте как Орлов)
@it-sin9k
@it-sin9k 4 жыл бұрын
возьмем как девиз канала))) "Орлов молодец, будьте как Орлов!"
@ivanp7697
@ivanp7697 Жыл бұрын
Спасибо, что уделяешь в своих роликах таким неочевидным, но очень важным нюансам!
@it-sin9k
@it-sin9k Жыл бұрын
Спасибо за приятный комментарий :)
@kri4evskiy
@kri4evskiy 3 жыл бұрын
Ухтышка! Очень и очень!!! Вот про useLayoutEffect() я вообще нигде не встречал в русскоязычном сегменте. А тут ещё и сопоставление с обычным useEffect() и componentDidMount(). Конечно, без этого материал был бы не расскрыт, но вы раскрыли его) Спасибо! Успеха!
@it-sin9k
@it-sin9k 3 жыл бұрын
Это очень круто!) но я еще рекомендую посмотреть плейлист Frontend Solid, судя по опросам он более успешный чем React плейлист))
@it-sin9k
@it-sin9k 3 жыл бұрын
если не сикрет, а где вы наткнулись на наш канал? а то сегодня большой прирост, а мы не знаем откуда ноги растут)
@АлексейЛоскутников-ю4р
@АлексейЛоскутников-ю4р 3 жыл бұрын
@@it-sin9k Была ссылка с канала It kamasutra, от Димыча.
@artemu78
@artemu78 2 жыл бұрын
Спасибо ребята. Отдельный респект за простой и эффективный sleep().
@it-sin9k
@it-sin9k 2 жыл бұрын
Всегда приятно читать такие комментарии)
@pashastrayt8928
@pashastrayt8928 2 жыл бұрын
Супер, спасибо) Я начинающий разработчик, и такие видео, поясняющие тонкие моменты, очень для меня кстати) Подача, монтаж просто класс.
@it-sin9k
@it-sin9k 2 жыл бұрын
Спасибо!)
@artemu78
@artemu78 2 жыл бұрын
Спасибо!
@it-sin9k
@it-sin9k 2 жыл бұрын
спасибо за поддержку!
@zooyotz
@zooyotz Жыл бұрын
Невероятно качественный контент! Это подписка и фура лайков!
@it-sin9k
@it-sin9k Жыл бұрын
Годится!)
@DmitriLipski
@DmitriLipski 4 жыл бұрын
Спасибо за Ваши видео. Как всегда, очень подробно и доходчиво!
@lollolich2399
@lollolich2399 3 жыл бұрын
Отличное видео, после прочтения документации ваше видео помогло разобраться до конца в теме, благодаря наглядному примеру. Лайк и подписочка!
@it-sin9k
@it-sin9k 3 жыл бұрын
Добро пожаловать :)
@mtyEyes
@mtyEyes 4 жыл бұрын
Спасибо за ролик. Пример с квадратом очень наглядный и понятный
@VeaceslavBARBARII
@VeaceslavBARBARII 10 ай бұрын
Вместо componentDidCatch можно использовать useErrorBoundary
@mikhailstepanischev8316
@mikhailstepanischev8316 3 жыл бұрын
Очень интересно,спасибо ! useLayoutEffect, componentDidMount и useEffect
@awakeupcall5336
@awakeupcall5336 Жыл бұрын
спасибо
@denisafonkin8795
@denisafonkin8795 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 а сразу актуальная ширина на клиенте
@-X-Ray-
@-X-Ray- 4 жыл бұрын
Кайф-кайф-кайф!
@hihoho1578
@hihoho1578 4 жыл бұрын
Спасибо) Поддержу лайком и комментом
@it-sin9k
@it-sin9k 4 жыл бұрын
лайк для нас на вес золота!)
@userJakov
@userJakov Жыл бұрын
тема с красными квадратами взята из статьи на хабре про аналогичную тему, или же наоборот
@it-sin9k
@it-sin9k Жыл бұрын
Я иногда публикую расшифровки своих же видео на хабре. Поэтому в обоих случаях я постил контент :)
@kostyakozlov5289
@kostyakozlov5289 2 жыл бұрын
Хочется узнать планируется ли контент на тему Concurent. Тема, дейтвительно, не тривиальная
@it-sin9k
@it-sin9k 2 жыл бұрын
Есть мысли сделать видео по этому поводу, но не в ближайшее время. Ближайшие выпусков 5 уже распланированы
@gritsienkooleg3447
@gritsienkooleg3447 Жыл бұрын
Помогло, спс большое тебе, дружище ))
@NoName-zh7cc
@NoName-zh7cc 3 жыл бұрын
Просто супер, спасибо
@hamletmuradyan5692
@hamletmuradyan5692 Жыл бұрын
Так будет более короткый. * * * function Exmaple2() { const [status, setStatus] = useState("========= NOT SET ========="); useLayoutEffect(() => { setStatus("INITIALIZED"); }, []); return {status}; }
@sdv7525
@sdv7525 Жыл бұрын
А кто больше комиссии заберет? ютуб спонсорство или патреон?
@it-sin9k
@it-sin9k Жыл бұрын
хмм, хороший вопрос. Комиссию больше берет патреон :)
@LodkaGG
@LodkaGG 2 жыл бұрын
Спасибо за пояснение, очень познавательно.
@kostyapolishko6282
@kostyapolishko6282 3 жыл бұрын
Это действительно годный контент!!
@sykalovandrey6090
@sykalovandrey6090 2 жыл бұрын
Спасибо за материал! Как я только не пробовал через useEffect и useLayoutEffect и у меня всё ровно dispatch(createAsyncThunk...) } , [ ] ) дважды подгружает данные... Я надеюсь Вы знакомы с подобной ситуацией и можете подсказать, почему так происходит у меня)
@it-sin9k
@it-sin9k 2 жыл бұрын
мне бы код увидеть, причины могут быть разными :)
@aleksandrmikhailov3255
@aleksandrmikhailov3255 3 жыл бұрын
Контент, как всегда, шикарен! Подскажи, планируешь ли записывать что-то подобное про, например, по Flux? Интересно было бы про Редакс послушать
@it-sin9k
@it-sin9k 3 жыл бұрын
Спасибо!) Я проводил голосовалку, какую тему после React hooks раскрыть. И там как раз таки была тема Redux, но люди выбрали тему Паттерны) Поэтому учавствуйте в будущих голосовалках)
@aleksandrmikhailov3255
@aleksandrmikhailov3255 3 жыл бұрын
@@it-sin9k я только недавно открыл для себя этот канал) на голосовалки не успел. Но паттерны - это не хуже ни разу))
@michaelwhyte1021
@michaelwhyte1021 3 жыл бұрын
Классная обработка видео, все четко и понятно. Спасибо за труд, подписался!
@it-sin9k
@it-sin9k 3 жыл бұрын
мы очень рады :)
@vadymserdiuk2779
@vadymserdiuk2779 3 жыл бұрын
Отличная работа
@it-sin9k
@it-sin9k 3 жыл бұрын
Спасибо!
@bekabdimanas
@bekabdimanas 3 жыл бұрын
Вау класс просто
@raufhashimov241
@raufhashimov241 4 жыл бұрын
Канал топчик.Я доволен :)
@it-sin9k
@it-sin9k 4 жыл бұрын
рады стараться :)
@ВладиславПузырев-ю8л
@ВладиславПузырев-ю8л 3 жыл бұрын
Получается useEffect делает setTimeout колбека после того как react вызывает компонент чтобы получить разметку, а componentDidMount вызывается синхронно после метода render в самой первой макро таске и блокирует стек вызова и пока стек не будет свободен не выполниться перерисовка, я так понял. Странно почему componentDidMount по умолчанию не сделали планирующим макро таску в таком случае?)
@it-sin9k
@it-sin9k 3 жыл бұрын
я думаю когда создавали React о таком сходу не подумали, были и похуже проблемы и поинтереснее идеи чем заняться. А появилась возможность во время хуков сделать это иначе и вот запилили)
@wh1teb1ack92
@wh1teb1ack92 2 жыл бұрын
Т.е грубо говоря useEffect вызывает асинхронно синхронное изменение стейта, чтобы отображать промежуточные варики
@serhiirumiantsev7736
@serhiirumiantsev7736 4 жыл бұрын
спасибо, как всегда, супер.
@it-sin9k
@it-sin9k 4 жыл бұрын
Благодарочка :)
@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 Жыл бұрын
​@@it-sin9k записал работу примера из видео в Chrome Dev Tools и немного удивился) Вызов setState из componentDidMount просто вносит изменения в переменные реакта и возвращает управление методу жизненного цикла. При этом вся цепочка действий (первый рендер -> обновление DOM -> componentDidMount -> setState -> повторный рендер -> повторное обновление DOM) выполняется внутри одной макрозадачи. Так что кадру с "0" попросту некуда вклиниться. Запутало то, что setState считается асинхронным, поэтому ошибочно думал, что второй рендер будет выполняться в отдельной макрозадаче)
@it-sin9k
@it-sin9k Жыл бұрын
@@dmtrkskv Звучит как неплохое исследование) если будет желание поисследовать что то еще любопытное, можно ролик про это записать и выложить у нас)
@НикитаГончаров-е8ш
@НикитаГончаров-е8ш Жыл бұрын
Как всегда топ 🔥🔥
@makeoverweb2663
@makeoverweb2663 3 жыл бұрын
Очень полезная инфа, спасибо!
@it-sin9k
@it-sin9k 3 жыл бұрын
Спасибо!
@alexandrchazov6185
@alexandrchazov6185 3 жыл бұрын
useLayoutEffect, componentDidMountб useEffect
@vitabramov89
@vitabramov89 4 жыл бұрын
ретЁрн))) спасибо за видео!
@koshgosh3081
@koshgosh3081 3 жыл бұрын
на фрикодкэмп курс реакта прохожу, там в задании не обьяснили, загуглил, в ютубе посмотрел, у тебя понятней всех, тема простая, но не понятно, если тебе просто дают что-то в программировании, без обьяснений, расшифровки
@it-sin9k
@it-sin9k 3 жыл бұрын
Спасибо за такую высокую похвалу!
@Aleksandr-w4e
@Aleksandr-w4e 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 жыл бұрын
в 18 версии реакта ввели батчинг, соответственно код стал работать иначе. Теперь нужно использовать flushSync
@IMHolub
@IMHolub 3 жыл бұрын
Годно
@lomeat
@lomeat 4 жыл бұрын
Исчерпывающе. Нечего добавить или убавить. Упоминание документации уже после примера, а не до, хорошо сказалось на закреплении того о чем идет речь.
@it-sin9k
@it-sin9k 4 жыл бұрын
Спасибо!) мы работаем над подачей)
@artemtreiko8436
@artemtreiko8436 2 жыл бұрын
только что на хабре это читал - один в один
@it-sin9k
@it-sin9k 2 жыл бұрын
Так это наверное наша же статья) некоторые видео я делал расшифровку на хабре)
@_Black_Mirror_
@_Black_Mirror_ 3 жыл бұрын
Запрещают материться в интернете, а так бы высказался по эмоциональнее про хорошее качество данного ролика
@it-sin9k
@it-sin9k 3 жыл бұрын
ахахах) низкий поклон) в качестве благодарности, можно поделиться этими видео с коллегами)
@djohardudaev95
@djohardudaev95 8 ай бұрын
дыд маунт
@it-sin9k
@it-sin9k 8 ай бұрын
а что не так с дыд маунт?) а то с комента непонятно)
@djohardudaev95
@djohardudaev95 8 ай бұрын
@@it-sin9k местами слишком сильное Ы, режет слух
@ashbarso7752
@ashbarso7752 3 жыл бұрын
Красавчик, все ясно и очень полезно оказалось
Best Practices for useEffect by React Documentation
8:52
АйТи Синяк
Рет қаралды 26 М.
Что вы знаете о useCallback?
10:02
АйТи Синяк
Рет қаралды 49 М.
Ice Cream or Surprise Trip Around the World?
00:31
Hungry FAM
Рет қаралды 20 МЛН
Hoodie gets wicked makeover! 😲
00:47
Justin Flom
Рет қаралды 131 МЛН
Мама у нас строгая
00:20
VAVAN
Рет қаралды 9 МЛН
Новые возможности React с useDeferredValue
11:06
АйТи Синяк
Рет қаралды 14 М.
Все ли вы знаете о React key?
8:47
АйТи Синяк
Рет қаралды 38 М.
Goodbye, useEffect - David Khourshid
29:59
BeJS
Рет қаралды 503 М.
Зачем на самом деле нужен хук useCallback
8:33
Михаил Непомнящий
Рет қаралды 44 М.
Learn React Hooks: useLayoutEffect - Simply Explained!
9:17
Cosden Solutions
Рет қаралды 20 М.
Ice Cream or Surprise Trip Around the World?
00:31
Hungry FAM
Рет қаралды 20 МЛН