Предзагрузка данных через роутинг

  Рет қаралды 29,590

Михаил Непомнящий

Михаил Непомнящий

Күн бұрын

Осенью 2022 года React Router научился делать асинхронные запросы на сервер при переходах между SPA страницами. Разбираемся как это можно сделать.
Код из видео github.com/mic...
Мои курсы по вебу с купонами:
✅ mishanep.com/
📢 Поддержка канала:
/ mishanep
www.tinkoff.ru...
paypal.me/mish...

Пікірлер: 122
@СергейВер-и9ю
@СергейВер-и9ю Жыл бұрын
Как по мне, Роутер слишком много на себя пытается взять. Кастомный хук по получению данных гораздо легче по написанию, понимаю, скорости загрузки...
@Romul3003
@Romul3003 Жыл бұрын
Ахренеть! Я не успеваю за всем этим фронтэндом) Спасибо!
@mkonin
@mkonin Жыл бұрын
Присоединяюсь. Ток к одному привык уже новое
@ГусяНоздреватая
@ГусяНоздреватая Жыл бұрын
Век живи, век учись Быть разрабом зашибись
@stepankizim3277
@stepankizim3277 Жыл бұрын
Ваш канал сокровище для Junior dev
@raufhashimov241
@raufhashimov241 Жыл бұрын
И не только для джуна :)
@threehundredbucks3212
@threehundredbucks3212 Жыл бұрын
@@raufhashimov241 сильно сомневаюсь, что НЕ джун станет смотреть ролик по новой фиче, вместо того-чтобы открыть оф доку )
@СашаАлександр-е4м
@СашаАлександр-е4м 7 күн бұрын
​@@threehundredbucks3212 станет)
@biLLie_wiLLie
@biLLie_wiLLie Жыл бұрын
Я два выпуска назад попросил Михаила рассказать про это обновление и он меня услышал)
@CyberGenius777
@CyberGenius777 Жыл бұрын
Не знаю насколько это нужно. Геморроя только добавили. Будет ли этот функционал кто-то реально использовать и переписывать все - неизвестно
@superboba2007
@superboba2007 Жыл бұрын
на мой взгляд в случае с использованием с defer получается какое то трудно читаемое нагромождение кода всего лишь для того, что бы показать компонент Loader. почему бы для этой задачи не сделать хук и использовать его вроде: const { data, loading, error } = useFetch("...") ?
@СергейВер-и9ю
@СергейВер-и9ю Жыл бұрын
import {useCallback, useState} from 'react'; const useRequest = (promise: (...args: TParams) => Promise) => { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const run = useCallback((...args: TParams) => { setData(null); setLoading(true); setError(null); promise(...args) .then((response) => { setData(response); setError(null); }) .catch((error: Error) => { setData(null); setError(error.message); }) .finally(() => { setLoading(false); }); }, [promise]); return {data, loading, error, run}; }; export default useRequest;
@vitmih380
@vitmih380 Жыл бұрын
И что это дало? Лишь бы было.
@vo_skor
@vo_skor Жыл бұрын
Основой принцип реакта - декомпозиция. И когда встретишь это на проекте после чувака который любит декомпозировать декомпозированное, не потеряешься 😁
@_Black_Mirror_
@_Black_Mirror_ Жыл бұрын
Спасибо за разбор новых возможностей. Пользоваться я этим не буду. Новый синтаксис никакой пользы не несет
@dimondmarcker3179
@dimondmarcker3179 Жыл бұрын
на самом деле теперь v6.4 очень похожа на remix, в плане всех этих лоадеров, Form и т.д. в теории это может полностью изменить подход к разработке некоторых приложений хочется еще больше видео про react-router-dom v6.4!
@oops61rus
@oops61rus Жыл бұрын
судя по странице ReactRouter там справа вверху прям отсылка идет к Remix, так что вполне вероятно
@kujojotaro3464
@kujojotaro3464 Жыл бұрын
Это и есть remix
@olegkravchenko9655
@olegkravchenko9655 Жыл бұрын
Если внимательно посмотреть на имена авторов того и другого, то всё станет понятно ;)
@АлМ-ы8ъ
@АлМ-ы8ъ Жыл бұрын
Автор, скажите что такое "эндерфугнансы " на 19:18 (по таймлайну) ?
@mishanep
@mishanep Жыл бұрын
😄😄😄 Звучит смешно. Переслушал несколько раз и сам не пойму)) Ума не приложу откуда вылезло))
@АлМ-ы8ъ
@АлМ-ы8ъ Жыл бұрын
@@mishanep да и пофиг, все равно ты молодец😃
@unknownrus920
@unknownrus920 Жыл бұрын
Я может что упустил, но в чем преимущество перед просто загрузкой контента через useEffect при переходе на страничку?
@exsterx
@exsterx Жыл бұрын
тот же вопрос. я храню состояние в recoil без перезагрузки страницы - ранее подгруженные данные открываются мнгновенно фишка - дрочево ради дрочева
@CyberGenius777
@CyberGenius777 Жыл бұрын
@@exsterx Согласен, ненужный гемор. Может это как-то влияет на производительность, что навряд ли... В общем, ненужная фишка
@d0paminer
@d0paminer Жыл бұрын
useEffect триггерит сайд-эффекты после рендера.
@exsterx
@exsterx Жыл бұрын
@@d0paminer раскройте подробнее, что вы имеете ввиду
@The14Some1
@The14Some1 Жыл бұрын
@@exsterx Ну как минимум один дополнительный draw call
@user-irinaais90
@user-irinaais90 6 ай бұрын
Расскажите, пожалуйста, как писать вложенные роутеры по версии React Router 6.4 с помощью createBrowserRouter
@НікітаКорчемний-г4ч
@НікітаКорчемний-г4ч 5 ай бұрын
лично я в children роутах ещё одни чилдрены делаю и outlet-ом выбираю что где отрисовывать, возможно это не правильно, но оно работает, я буквально сегодня проверял. В крайнем случае почитай доку
@user-irinaais90
@user-irinaais90 5 ай бұрын
@@НікітаКорчемний-г4ч спасибо
@alexandrmos205
@alexandrmos205 3 ай бұрын
Подскажите пожалуйста. Если работать не через Route, а через массив объектов, то как делать редирект, например, по клику на кнопку. Ведь useNavigate, работает только с route
@zoombix5753
@zoombix5753 Жыл бұрын
Можно ещё роликов по новой версии роутера?)) Там линки обновили с ними немного не ясно(
@alexandrmos205
@alexandrmos205 3 ай бұрын
Подскажите, а как в переменную router передавать дополнительные параметры. Допустим я хочу передать в пропс одного из компонентов вложенных в router, состояние, которое создается хуком, но, так как хуки можно создавать только внутри компонентов (в данном случае внутри App), а router является внешней константой, то при передачи ее в RouteProvider, я никак этого сделать не смогу. Т.е. мне нужно создавать router уже внутри компонента App, чтобы передавать в пропсы состояния сделанные с помощью хуков, т.е. других вариантов нет?
@it.s_vlad
@it.s_vlad 8 ай бұрын
для тех, кто не понимает, зачем нужен loader: - без использования loader - сначала загружается компонент, потом после его рендера начинается загрузка данных в useEffect. - с использованием loader - компонент и данные загружаются параллельно.
@nevrox6197
@nevrox6197 8 ай бұрын
Но в таком случае отстутсвует lazy loading и клиент не видит ничего,немного не понятен плюс этого подхода,кроме того что не подтягиваются хуки реакта
@NovikovEugene13
@NovikovEugene13 5 ай бұрын
Просто прописываешь if (!data) return null и не паришься насчёт лишнего рендера (выполнения функции компонента)
@ilovekurut
@ilovekurut 9 ай бұрын
ох да запутаться можно.Пока одно выучишь, другое учить надо. И не понятно что на интервью спросят.Поэтому учим все подряд
@user-fn4jw5nc3z
@user-fn4jw5nc3z 7 ай бұрын
Да роутер многое на себя забирает из функционала, не думаю что многие будут этим пользоваться, скорее тем что привычнее
@6azinga
@6azinga Жыл бұрын
Спасибо огромное за то, что Вы находитесь на острие технологий front-end!
@yuriyovdeyev685
@yuriyovdeyev685 Жыл бұрын
Здорово, очень полезная инфа и подача отличная! Спасибо!
@АлександрКос-р3щ
@АлександрКос-р3щ 4 ай бұрын
Про try catch не забываем
@limpchh
@limpchh Жыл бұрын
Чем тогда отличается загрузка постов через useEffect и defer. Ведь и там и там можно показывать лоадер, отличается только реализация
@mishanep
@mishanep Жыл бұрын
Создатели библиотеки с роутингом просто предложили нам разделить логику получения и потребления данных.
@limpchh
@limpchh Жыл бұрын
@@mishanep Понял, спасибо за ответ)
@sevgenberg585
@sevgenberg585 Жыл бұрын
{request,params} выдает ошибку, Unhandled Thrown Error! _ref is undefined делал все по видео!Что это может быть?
@sergeysharapov5945
@sergeysharapov5945 Жыл бұрын
компонент уже стал каким то грязным и похоже на страницу php с ajax подгрузкой где нужно )
@everemchuk
@everemchuk Жыл бұрын
Ну это еще тот бубен. Ничего нового данные изменения не принесли, только опять проблемы с новой стандартизацией и структурой проекта. Как по мне ничего лучшего чем ReactQuery или же Redux + RTKQuery не придумали. Я думаю что в будущем данная фишка не получит своей популярности, и будет просто как заглушка в библиотеке
@Napolion4ik
@Napolion4ik Жыл бұрын
Не много не понимаю какие плюсы дает этот метод предзаргрузки, да я сам когда то думал, а почему нельза передавать какие то данные по роутер после клика, всеравно под скелетом у нас используеться useContext , но разработчики что-то перемудрили
@offiza8631
@offiza8631 Жыл бұрын
Спасибо большое за такое полезное видео!)
@singlebw4065
@singlebw4065 Жыл бұрын
Здравствуйте Михаил. Как создать бесконечный роутер?
@constantine6464
@constantine6464 Жыл бұрын
как раз когда реакт получает новый нативный хук use
@Aleksandr_Bolshakov
@Aleksandr_Bolshakov Жыл бұрын
Уроки супер, но расскажи как организовать проект вместе с отдельным npm пакетом в котором находятся компоненты и импортируются в проект
@SkyAndStarss
@SkyAndStarss Жыл бұрын
а можно ли подход с роутер лоадером соеденить с редакс тулкитом??
@ЯнаПронько-ы7ъ
@ЯнаПронько-ы7ъ Жыл бұрын
Спасибо! Буду следить за каналом, чтобы следить за новинками)
@oleksiikriuchkov7399
@oleksiikriuchkov7399 Жыл бұрын
Такой подход очень ускоряет загрузку!🥰
@Maximurz1k
@Maximurz1k Жыл бұрын
Пример понятный но не продакшн) Покажите плз пример с RTK Query)
@mishanep
@mishanep Жыл бұрын
Так это же два разных подхода. Может быть со временем другие библиотеки предложат нам интеграции под возможности роутинга, пока она сырая.
@Maximurz1k
@Maximurz1k Жыл бұрын
@@mishanep Ну пока это первый заход "быть похожим на ангуляр" ну наконец то))) Ток в ангуляре можно было в резолвере сервисы подсосать. Это же тема не только для резолвинга данных, но еще и гвардинг доступов. Я вижу проблему в том, что нет четких паттернов "как делаем", просто сделали и в путь) Ну, будем вырабатывать
@redhook777
@redhook777 Жыл бұрын
В продакшене ведь чаще всего next
@Maximurz1k
@Maximurz1k Жыл бұрын
@@redhook777 1) причем тут ssr 2) "чаще всего" это где? крупняк редко его использует, чаще свое. и большинство SPA это внутрянка где ssr не нужен
@victormog
@victormog Жыл бұрын
Шикарное видео!
@dimalukashenko4865
@dimalukashenko4865 Жыл бұрын
Хороший урок, очень ждал продолжения курса
@Игорь-ч6н9м
@Игорь-ч6н9м Жыл бұрын
Как это будет работать с redux? Приходящие данные надо будет через стор обрабатывать?
@mishanep
@mishanep Жыл бұрын
Здесь могут быть разные сценарии поведения. В базовом варианте можно обойтись без складывания в стор. Здесь скорее вопрос, как избежать повторных запросов. На данной стадии вариантов кэширования из коробки не видно. Как подружить с лоадер с редаксом - вопрос, я пока не пробовал =)
@АлександрСкиталец-ц7р
@АлександрСкиталец-ц7р Жыл бұрын
Думаю если вам не нужны эти будут данные в другом компоненте. То их не стоит пробрасывать в стор redux. Бывает ситуации когда вам надо только получить и отрисовать данные и больше не где не использовать. Пока всё лишь предположение. Но всё равно очень полезный инструмент. Надо пробовать использовать в проекте.
@СергейГеоргиев-в1ч
@СергейГеоргиев-в1ч Жыл бұрын
Как совместить это с reduxjs/toolkit, если мы обычно в toolkit вызывали асинхронную функцию через createAsyncThunk и через dispatch вызывали нужный нам reducer и записывали данные в state, а уже через redux-react используя useSelector передавали данные? Как я понял, сейчас мы данные получаем через useLoaderData помимо reduxjs/toolkit
@ГусяНоздреватая
@ГусяНоздреватая Жыл бұрын
Лучше не надо совмещать, обычно редакс нужен для управления состоянием каких-то больших данных, а предварительная загрузка react-router-dom для получения и отрисовки небольших. Ну а вообще для больших проектов данная фича выглядит как оверхед, ибо редакс или что-нибудь другое для state manage (например, react-query) прекрасно справиться без помощи библиотеки, которая в первую очередь нужна для роутинг, а не для предзагрузки
@adamburke4496
@adamburke4496 Жыл бұрын
А есть ли кэширование в данной версии роутера?
@CJIu3eHb
@CJIu3eHb Жыл бұрын
Интересно, а если без defer, то как отрисовать лоадер на зависшей (пока данные грузятся) странице, с которой идет переход. Чтобы люди понимали, что нажатие на кнопку/ссылку сработало и что-то делается.
@andreyyastrebtsov4367
@andreyyastrebtsov4367 Жыл бұрын
useNavigation там есть хук и у него состояние есть. Ну тоесть используем так const navigation = useNavigation(). И там уже цепляемся navigation.state === 'loadiing и рисуем что надо
@FOND645
@FOND645 Жыл бұрын
Подскажите, дружит ли React Router Dom с Electron?
@mishanep
@mishanep Жыл бұрын
У меня пока не было опыта работы с Electron.
@worldandplanet8715
@worldandplanet8715 Жыл бұрын
Спасибо, очень своевременное для меня видео)
@АнатолийГорбов-о1ь
@АнатолийГорбов-о1ь Жыл бұрын
Очень интересное видео! Спасибо за курс по v6 реакт роутеру!)
@irinal7766
@irinal7766 Жыл бұрын
Спасибо, очень своевременное для меня видео)
@МатвейДенисов-т2к
@МатвейДенисов-т2к Жыл бұрын
Михаил, контент потрясающий
@vitaliynoveles6626
@vitaliynoveles6626 Жыл бұрын
Спасибо за видео) Подскажите, пожалуйста, какая у вас тема стоит?)
@mishanep
@mishanep Жыл бұрын
Codesandbox
@romuelson
@romuelson Жыл бұрын
Отличная декомпозиция 🤠
@Konstantin19877
@Konstantin19877 Жыл бұрын
Очень круто. Спасибо за контент.
@xlebuwek1
@xlebuwek1 Жыл бұрын
Add text 12:44
@Григорий-ь5ь7о
@Григорий-ь5ь7о Жыл бұрын
Он Гений
@tweeker2104
@tweeker2104 Жыл бұрын
А возможно ли использовать useLoaderData в typescript? А то я пробую, а оно ругается на типы. В документации react-router-dom ничего не нашел об этом (ну или плохо искал :) )
@mishanep
@mishanep Жыл бұрын
В файлах декларации возвращаемый тип для этого хука идет как unknown. Поэтому, по логике, надо подготовить свой тип и указать его. const data = useLoaderData() as MyType
@Asgyr
@Asgyr Жыл бұрын
@@mishanep Спасибо очень помог ваш ответ !)))
@Алексей-и5д3в
@Алексей-и5д3в Жыл бұрын
Супер. Спасибо большое
@Napolion4ik
@Napolion4ik Жыл бұрын
На 23:15 вы не писали return defer ({...}), он обезателен или можно обойтись await-ом в return-e
@The14Some1
@The14Some1 Жыл бұрын
Интересно, вы уже досмотрели до конца, или всё ещё ждёте ответа? :)
@Napolion4ik
@Napolion4ik Жыл бұрын
@@The14Some1 хаххаха смешно))досмотрел до конца )забыл удалить коментарий
@Wra-ij8yk
@Wra-ij8yk Жыл бұрын
Подскажите этот курс еще актуален?
@mishanep
@mishanep Жыл бұрын
Видео свежее, так что актуально. Но зависит от того, какую версию библиотеки вы в своем приложении используете. Там есть различия между версией 5, 6 и 6.4. В рамках плейлиста разбирается 6-я версия и последние дополнения, начиная с 6.4.
@ramilnazmiev9448
@ramilnazmiev9448 Жыл бұрын
Подскажите как тема в VS называется ?
@mishanep
@mishanep Жыл бұрын
CodeSandbox
@СергейВер-и9ю
@СергейВер-и9ю Жыл бұрын
Берите на заметку классный хук, на подобии useFetch, который поддерживает параметры и гораздо легче всей этой дичи с React router. import {useCallback, useState} from 'react'; const useRequest = (promise: (...args: TParams) => Promise) => { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const run = useCallback((...args: TParams) => { setData(null); setLoading(true); setError(null); promise(...args) .then((response) => { setData(response); setError(null); }) .catch((error: Error) => { setData(null); setError(error.message); }) .finally(() => { setLoading(false); }); }, [promise]); return {data, loading, error, run}; }; export default useRequest;
@ufc_uz6
@ufc_uz6 Жыл бұрын
Супер
@dmitryts9093
@dmitryts9093 Жыл бұрын
Спасибо за Ваши видео
@ВладиславСвидерский-г6й
@ВладиславСвидерский-г6й Жыл бұрын
спасибо!
@FailValiev
@FailValiev Жыл бұрын
А если заново надо получить данные?
@nikitasafonkin3077
@nikitasafonkin3077 Жыл бұрын
перегружать компонент🤔
@vty4261
@vty4261 Жыл бұрын
@@nikitasafonkin3077 useRevalidate()
@alexandrd419
@alexandrd419 Жыл бұрын
Если вы использовали angular, то расскажите почему react лучше? Ну кроме как простоты и количества вакансий. Помоему ангулар куда логичнее. верстка от логики отдельно, модульный подход. Есть сервисы. Компоненты верстать может верстальщик, без знаний js/ts. Все есть из коробки, и никаких там а мы на проэкте используем мобх, или еще чего. Хотя и простота тоже такое.... если взять ts, rxjs, redux(и всякий другой зоопарк), webpack, то тоже получается не так уж и просто. Просто учу angular. Мне нравится. Все из коробки. нормальный ооп. но вакансий на него значительно меньше. Вот думаю не зря ли его осваиваю? Хотя посмотрел в сторону реакт. Какая-я то ерунда и все вперемешку.
@mishanep
@mishanep Жыл бұрын
Я не работал с Ангуляром. Касаемо Реакта, то здесь от проекта надо плясать. Не каждый проект нуждается в роутинге на стороне клиента, не всегда нужен Redux и его аналоги, многие проекты спокойно обходятся и без ts, что удешевляет разработку и снижает порог входа.
@drunken_rubbish
@drunken_rubbish Жыл бұрын
В ангуляре зачастую ориентироваться сложнее, сам rxjs тоже весьма неприятная и сложная штука. На реакте в целом многие моменты делаются гораздо проще, на реакте больше выбор библиотек, на реакте лучше можно контролировать ререндеры. Да и он банально легче и меньше. Это его основные плюсы. У ангуляра, то что многое с коробки и то, что в модульном подходе код выглядит красиво, правда до первого взаимодействия с rxjs)))
@denissaripov7130
@denissaripov7130 Жыл бұрын
Реакт даёт просто функцию, которая возвращает html и если возвращает то же, что и в прошлый раз - оптимизирует Под капотом ангуляра непонятно что, много декларативности и нужно запоминать какие-то решения тк так придумали разработчики Любой чел, знающий js, на реакт за день пересядет, а вот на ангуляр врятли
@richardvoronov3482
@richardvoronov3482 Жыл бұрын
Ничем реакт не лучше. Инструмент всегда хорош, когда он в правильных руках. Реакт это библиотека, и его нужно уметь готовить. Ангуляр это фреймворк, свободы чуть меньше чем с реактом в плане композиции приложения и от этого код должен быть выше качеством, чем то что пишут на реакте. Реакт просто популярней ангуляра, поэтому его выбирают чаще, от того и вакансий больше. Мало где можно встретить хороший код на реакте как раз из-за того что библиотека не ограничивает разраба ни в чем, кроме не сложных правил написания хуков. Если это большая компания, вероятно, у них есть деньги нанять программистов, если это стартап или средняя компания то, вероятно, они уже наняли "реакт разработчиков", а не программистов. Так что, если хотите поскорее на работу, берите реакт и вперед, если уже освоили реакт попробуйте ангуляр.
@The14Some1
@The14Some1 Жыл бұрын
​@@denissaripov7130 Блин, а тут, типа, придуманные разработчиками решения не нужно запоминать? Вот, мы прям сейчас обсуждаем последнюю версию роутера, который уже в третий раз значительно меняет парадигму своей внутрянки. У меня уже голова идёт кругом от редакса, редакс-квери, редакс-санк, ртк-квери и роутера разных версий.
@kinafermur
@kinafermur Жыл бұрын
Михаил, а вы не поделитесь статейкой где откопали такой способ получения данных, или копались в документации? очень интересно, круто что технология не стоит на месте
@mishanep
@mishanep Жыл бұрын
Изначально я узнал об этом в их release notes, которыми библиотека поделилась ещё на стадии беты. А дальше через документацию.
@lesters
@lesters Жыл бұрын
спасибо за актуальную инфу, скажи а почему ты не используешь стандартную запись export default ComponentName ?
@mishanep
@mishanep Жыл бұрын
Иногда использую и экспорт по умолчанию. Не согласен, что это стандартная запись. Многие библиотеки в качестве стандарта как раз используют именованный экспорт. Но для проекта это вопрос привычки и соглашений внутри команды.
@lesters
@lesters Жыл бұрын
ну и есть смысл убирать юзстейт и прочие для замены их на роутинг, он что жрет меньше памяти? или это просто альтернативный подход?
@mishanep
@mishanep Жыл бұрын
Здесь скорее история не про память, а про разные уровни абстракции. У нас, к сожалению или может быть к счастью, слишком много вариантов делания одного и того же. Касаемо производительности я не замерял, не отвечу. Но в теории должно быть быстрее.
@raufhashimov241
@raufhashimov241 Жыл бұрын
Какой редактор?
@galibibr02
@galibibr02 9 ай бұрын
vs code
ErrorElement для обработки ошибок в React приложении
14:18
Михаил Непомнящий
Рет қаралды 15 М.
Новый уровень твоей сосиски
00:33
Кушать Хочу
Рет қаралды 4,9 МЛН
Крутой фокус + секрет! #shorts
00:10
Роман Magic
Рет қаралды 21 МЛН
Help Me Celebrate! 😍🙏
00:35
Alan Chikin Chow
Рет қаралды 45 МЛН
Новые хуки useTransition и useDeferredValue в React 18
22:17
Михаил Непомнящий
Рет қаралды 22 М.
GraphQL для фронтенд разработчиков
35:52
Михаил Непомнящий
Рет қаралды 47 М.
Пишем список дел на React.JS. Дневники вкатуна #59
25:28
ITogether с Ефрейтором
Рет қаралды 198
Автоматизация создания React-компонентов
14:36
Михаил Непомнящий
Рет қаралды 21 М.
React Router - Complete Tutorial
23:53
Cosden Solutions
Рет қаралды 119 М.
Custom Protected Route Component in React
10:58
Cosden Solutions
Рет қаралды 44 М.
Новый уровень твоей сосиски
00:33
Кушать Хочу
Рет қаралды 4,9 МЛН