Работа с историей, локацией и приватными роутами в React-router 6

Поділитися
Вставка
  • Опубліковано 26 вер 2024

КОМЕНТАРІ • 129

  • @ВикторияИлларионова-ц7ю

    0:56 - кнопка назад
    6:25 - переадресация
    7:50 - объект Location
    9:53 - приватные роуты
    16:25 - упрощенная авторизация с createContext
    18:18 - создание prop value
    19:54 - кастомный хук useAuth
    20:47 - использование контекста
    25:39 - объяснение авторизации
    27:19 - о коммитах на github

  • @SiriScare
    @SiriScare Рік тому +12

    Занимаюсь уже который день по этим урокам и тихо офигеваю, насколько оказывается качественно можно делать учебные материалы. Не могу больше молчать. Это офигенно!!
    Где ж ты был все это время, родной.

  • @lightinthedark5708
    @lightinthedark5708 2 роки тому +76

    Превосходное изложение материала, не перестаю радоваться вашему присутствию в UA-cam. Спасибо, Михаил.

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

      Спасибо и Вам на добром слове =)

  • @Костя-с5л8я
    @Костя-с5л8я 2 роки тому +11

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

  • @alsusayfulina1865
    @alsusayfulina1865 Рік тому +3

    Даже на платных курсах такого качества материала не получаешь, спасибо, это очень полезно!

  • @АлексейМастяница-ы4е

    Что-то слишком часто Вы нас балуете годным контентом )
    Огромное спасибо , однозначно лайк )

  • @ДмитрийМельников-ъ3в

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

  • @sudactudak5743
    @sudactudak5743 2 роки тому +7

    Редко пишу комментарии, но я просто не знаю, представляете ли Вы, насколько Ваши ролики по React Router полезны (другие видео от Вас не смотрел еще :) ). Мало того, что 6 версия библиотеки почти ни в каких русскоязычных источниках подробно не освещается, так еще и такой полезный контент для новичков, как в этом ролике. Надеюсь, будете продолжать и набирать популярность!

  • @ЯнаАлександровна-э7к

    Какие прекрасные уроки! Прохожу с их помощью урок по созданию SPA со странами ) Спасибо!!!

  • @vo_skor
    @vo_skor 2 роки тому +8

    Вы для меня находка Михаил!)
    Есть вашим подписчиком с серии видео про Router,которая мне очень пригодилась.
    Отличная подача материала, без воды и по делу 👍
    Как только пройду испытательный, поддержу ваш канал✌️

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

    На платном курсе встретил обучение React-router 5, но проект был на React 18 и 5-я версия выдавала ошибки. После этого обратился к ютубу, и как же я счастлив, что мне попались именно вы

  • @tazorprod.934
    @tazorprod.934 Рік тому

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

  • @АлексейСтепанов-к9о

    Михаил, спасибо за урок. С нетерпением жду следующего видео.

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

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

  • @АлександрПараконный

    Михаил талант обучения, очень доступно и понятно, прям нектар для мозга. Информацию с такой подачей можно принимать без отдыха

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

    Очень помогло в понимании, как это всё работает вместе. Спасибо.

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

    Твой канал очередное открытие для меня!) Всё думал когда сесть за доку и посмотреть что там нового, но с тобой всё становится проще:)))
    Развития твоему каналу))

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

    очень полезная информация по работе с пакетом react router version 6, благодарю

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

    Очень информативное видео. Спасибо большое за проделанную работу !!!

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

    Михаил, вы лучший!

  • @КотМатроскин-х9ь

    я чуть в колбасу не перекрутился, когда прошлый урок понимал, тьфу тьфу освоил... а этот наверное стреляться буду... но интересные темы автор преподносит!

  • @ЕвгенийТяка-ч4х
    @ЕвгенийТяка-ч4х 2 роки тому +1

    спасибо большое! Очень информативно

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

    То что доктор прописал! Сразу куча вопросов отпала.

  • @АлександрСадыков-ъ8щ

    Спасибо за подробное объяснение!)

  • @ИгорьГолуб-н6щ
    @ИгорьГолуб-н6щ 2 роки тому

    Михаил, огромное спасибо за Ваш труд. Отличное видео.

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

    Очень хорошее объяснение материала! Спасибо буду смотреть дальше!

  • @ЕвгенийШут-о7н
    @ЕвгенийШут-о7н 2 роки тому

    Хождение по истории - круто

  • @Кофей-й8х
    @Кофей-й8х 2 роки тому

    Ты лучший! Всегда все по полочкам!

  • @Виталя-ц2б
    @Виталя-ц2б 2 роки тому

    Михаил, спасибо большое за лекцию!

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

    Спасибо, Михаил!🤘

  • @НиколайХаритонов-й3н

    От души душевно. Хорошие уроки, спасибо.

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

    Михаил спасибо!!!

  • @ЕгорЗосимов-ж6б
    @ЕгорЗосимов-ж6б 2 роки тому

    Отличный канал, автору большой респект!

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

    топ подача!

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

    потрясно

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

    Спасибо

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

    Спасибо за Ваши старания!

  • @ГлебКодрик-ж5ж
    @ГлебКодрик-ж5ж 2 роки тому

    Лучшая подача информации

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

    Просто нет слов!!! Спасибо

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

    Михаил, большое спасибо, как всегда спасаете)))

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

    уроки огонь

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

    Отлично, очень полезно, спасибо

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

    Как всегда познавательно !

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

    Отличная информация

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

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

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

    Хотелось бы вариант, когда все страницы (кроме входа) приватные :) Может есть более красивая реализация такого сценария. Что бы не оборачивать каждую страницу

    • @maxamax5695
      @maxamax5695 11 місяців тому +1

      Такой же вопрос у меня) нашли решение?

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

      @@maxamax5695 к сожелению, нет

  • @МаксимВ-к9ч
    @МаксимВ-к9ч 2 роки тому

    Спасибо! Классное видео. Было бы здорово, если бы хоть маленько рассказал про HOC.

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

      Можно и про hoc, но эта техника несколько устарела. Сегодня для выделения логики используют кастомные хуки и/или редакс

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

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

  • @АмыргаТавакай
    @АмыргаТавакай 2 роки тому

    Лучший!

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

    спасибо тебе и твоим роликам за то что, мне не нужно смотреть индусов))

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

    спасибо!!!!

  • @ЯнаПронько-ы7ъ
    @ЯнаПронько-ы7ъ Рік тому +1

    Спасибо за видео, подписалась, думаю этот канал будет мне полезен!
    Вопросик: не рекомендуется использовать navigate(-1), а лучше Link, как я поняла, но ведь для Link нужно знать конкретный путь, а если мы хотим просто назад(то есть откуда пришел пользователь) как быть?

    • @mishanep
      @mishanep  Рік тому +2

      Если нужна кнопка назад, то navigate(-1) отлично подходит. Иногда предыдущая страница бывает не пригодной для возвращения по каким-то причинам, например, страница оплаты. Но тут надо отдельно рассматривать. Либо в историю такую страницу не записывать, либо отдельную логику прописывать.
      У нас есть state, доступный через location, и мы при каждом переходе можем фиксировать откуда пришли. Соответственно, использовать эту информацию, в том числе и для возвращения на предыдущие шаги.

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

    Спасибо c:

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

    4 раза переписывал все вместе с видео и только потом догнал, как все работает. Ох, если бы не твой видос, наверное лысым стал бы.))))

  • @ТарасМ-х9ф
    @ТарасМ-х9ф 2 роки тому

    Благодарю пол дня искал как реализовать провайдер для протектед роута, одни идусы всякую хуйню выкладывают, и тут к тебе попал.

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

    Бля это потрясающе

  • @ЭдгарЕдигарян-ц3ъ
    @ЭдгарЕдигарян-ц3ъ 2 роки тому

    good

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

    Приветствую, Михаил. Отличные уроки! Конкретно в этом уроке не могу понять почему не срабатывает replace, когда логинимся. В итоге я могу попасть обратно на страницу логина нажав стрелку назад. Подскажите пожалуйста, в чем может быть причина?

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

    Работа с историей, локацией и приватными роутами в React-router 6

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

    Не зря я на Вас подписан)) уже не первый раз тушите пожар моего пе@дака

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

    В реальном проекте у нас не будет auth false или true, мы этот аuth получаем асинхронным способом, что делать в этом случае?

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

    Друг а ты не подскажешь как занулить поля в форме после нажатия кнопки submit в redux-form

  • @HowManyShrimps-g7z
    @HowManyShrimps-g7z Рік тому

    жаль, отсутствует код урока

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

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

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

      Приветствую.
      Не совсем понятна логика. Выглядит так, что попав на страницу с конкретной ссылкой (например с id 1) мы можем кликнуть на ссылку, никуда не перейти (id всё ещё один), но захотим сделать новый запрос на сервер? Не очень понятно зачем. Теоретически у нас компонент может иметь также гет-параметры, которые тоже можно добавить в зависимости и заодно сделать частью запроса к серверу.

  • @bodya5645-e5l
    @bodya5645-e5l 2 роки тому +1

    А какая разница между переадресацией через navigate('ссылка', {опции}) и через ?

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

      Компонент Navigate предназначен для переадресации мгновенно при попадании на страницу. Метод navigate для событий, вроде клика мыши.

    • @bodya5645-e5l
      @bodya5645-e5l 2 роки тому

      @@mishanep Спасибо за ответ!!!!

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

    Подскажите. Как это все дружить с редаксом?

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

    Здравствуйте. Подскажите, как зарегистрированному пользователю можно ограничить некоторые страницы?

  • @microgames18
    @microgames18 2 місяці тому

    Всем привет! Можете подсказать можно ли для перехода по истории не создавать новые кнопки, а повесить их на дефолтные браузерные кнопки. Я так понимаю они же не будут работать, если происходит постраничная пагинация? Например, я прокликал по порядку : 1,2,3,4,5 страница, а потом нажимаю дефолтную браузерную кнопку назад. Но она, я так понимаю не сработает без navigate(-1)?)

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

    7:43 вы добавили переадрисацию на другую страницу, в каких случаях это может быть полезно? Почему просто не изменить path ?

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

      При разработке нового сайта - не так очевидно. Но если сайт уже живет какое-то время, проиндексирован поисковиками и уже оказался в закладках у посетителей, то просто так менять адреса страниц чревато. И поисковики в ранге могут понизить, и пользователи 404-й не обрадуются.

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

    объясните подробнее пожалуйста кто знает
    13:46
    на 7строчке - зачем вот такие знаки вопроса после каждого слова?
    fromPage = location.state?.from?pathname

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

      оператор опциональной последовательности

    • @ВикторияЗапорожан-ф2в
      @ВикторияЗапорожан-ф2в Рік тому

      Вадим, это optional chaining. Простыми словами - мы пытаемся получить доступ к from только если state === true. В случае, если state не будет существовать, то у вас не упадет ошибка и не нужно такие кейсы проверять с помощью if, например. Аналогично с pathname - пробуем его достать только если from существует

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

      Этот код использует опциональную цепочку обращений (optional chaining) и считывает значение свойства from из объекта location.state, если оно существует, иначе возвращает undefined.
      Если значение location.state не является объектом или у этого объекта нет свойства from, то fromPage примет значение undefined.
      Две знаком вопросов (?.) - это оператор опциональной цепочки. Он позволяет безопасно обходить свойства объекта, которые могут отсутствовать, чтобы избежать ошибок Cannot read property 'xxx' of undefined.
      В данном случае, если location.state не определен или равен null, то вместо ошибки будет возвращено значение undefined, а дальше сработает еще одна опциональная цепочка для свойства pathname.

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

    как соединить connected-react-router middleware с react-router v6 в 18 версии реакта? и вообще как я понял conncted-react-router не работает в 18 версии реакта или я просто не могу настроить получая ошибку - Cannot read properties of undefined (reading 'pathname')

  • @ИванКарпинский-м6ж

    А пользователь не может подменить данные стейта на клиенте и получить таким образом доступ к приватным роутам? буду признателен если объяснишь

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

    Михаил, в первую очередь спасибо за проделанную работу! У меня вопрос, а как лучше поступить с приватными роутами, если есть общая разметка. Как обернуть общую разметку?



    Нужно обернуть element Layout в ? Спасибо за ответ!

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

      Приветствую, Амир!
      Если вы хотите, чтобы все страницы сайты были приватными, то тогда да, можно попробовать ваш вариант.
      В принципе не обязательно все страницы делать с одинаковой общей частью, подобных "родителей" может быть несколько для разных страниц.
      Хотя возможно вам просто нужно какую-то часть в Layout показывать по условию, а не делать весь сайт приватным (страница авторизации тоже может захотеть какого-то оформления). А скрывать можно по условию, проверяя авторизован ли пользователь, используя тот же хук useAuth.

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

      @@mishanep спасибо большое 🙏

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

    А что означает такая запись:
    ....
    зачем оборачивать в "пустой элемент" ?

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

      В JavaScript мы можем вернуть в качестве значения только одну сущность. Поэтому в случаях, когда сущностей несколько, их надо во что-то обернуть. Не всегда хочется создавать дополнительную разметку, поэтому существует такая штука как React.Fragment. В данном случае вариант является укороченной записью использования React фрагмента.

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

      @@mishanep дополнительная разметка - имеется ввиду типа блок ?

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

      @@metall1c да

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

    Меня почему то при обновлении страницы MainPage выкидывает обратно на Login

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

      в упрощённом варианте стейт живёт только в оперативке, и при обновлении авторизация слетает.
      В реальности мы хранили эту инфу в локал сторедж и синхронились бы с ним при обновлении страницы.

  • @maximaliev-lomach2994
    @maximaliev-lomach2994 2 роки тому

    и еще вопрос, как сделать так, что бы при перезагрузке страницы не оправлялся запрос на сервер об авторизации пользователя?

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

      а чтобы не терять данные авторизации, их обычно хранят в браузерной памяти. Об этом тоже есть видео ua-cam.com/video/sdlYNKjCGU0/v-deo.html
      В useEffect можно перед запросом на авторизацию можно проверить не авторизованы ли мы в настоящий момент.

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

    У меня вопрос, а если мне надо стилизовать страницу из папки pages и я хочу это сделать через css модули, то мне надо создаваать папочку под каждую страницу и туда уже складывать и саму page и css модуль? или в этом случае как-то по-другому делается?)) Спасибо за урок!)

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

      Чаще всего стили пишутся на уровне компонентов. А страница просто переиспользует их. При необходимости на уровне страницы могут быть дополнительные стили.
      Посмотрите в сторону css-модулей.

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

    Код урока бы...

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

      Есть репозиторий под плей-лист
      github.com/michey85/youtube-react-router-v6

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

      @@mishanep спасибо Михаил!

  • @МаксимНырков-у6г
    @МаксимНырков-у6г 2 роки тому

    Вот зачем убирать useHistory и заменять его на новое название? Нельзя было оставить название

  • @АндрейИльин-д6ж
    @АндрейИльин-д6ж 2 роки тому +1

    слыш ты. это хлам, а не видео. чё refresh не показал?

  • @НастяСорокина-з5и
    @НастяСорокина-з5и 2 роки тому

    Здравствуйте! Подскажите, пожалуйста, выскакивает ошибка:
    TypeError: Cannot destructure property 'signin' of 'Object(...)(...)' as it is null
    На строчке: const {signin} = useAuth() в компоненте Loginpage.js
    Может знаете, с чем это связано? проверяю целый час, все также как и у вас..

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

      Выведите в консоль, что вам возвращает хук. Скорее всего это null, из которого ничего деструктуризацией не вытащить. Полагаю, хук сделан некорректно.

    • @НастяСорокина-з5и
      @НастяСорокина-з5и 2 роки тому

      @@mishanep Да, убрала начальное значение null и действительно помогло), а еще неправильно передавала Context, исправила, теперь все работает! Спасибо большое!!😊

  • @ДаниилРинкевич-г2ю

    Всё отлично изложено и понятно, супер контент, спасибо вам большое

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

    Михаил, можете пожалуйста рассказать, как сделать так, чтобы все роуты требовали авторизацию, без бойлерплейта

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

    Михаил, очень понятная подача материала! У меня появилась одна проблема, которую никак не могу решить: хук useAuth предоставляет null значение для { user, signin, signout }. Пробовал и без хука, напрямую обернуть в , все равно не видит функции. После сабмита формы получаю [Uncaught TypeError: signin is not a function]. Не сталкивались с такой пролемой?

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

      Здравствуйте.
      С описанной ошибкой не сталкивался. Авторизация не обязательно в реактовском контексте будет жить. Вариантов много. Чаще встречается вариант с редакс.

  • @Roman-kn7kt
    @Roman-kn7kt 2 місяці тому

    Это ТОП!!! Спасибо большое!

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

    Огромное спасибо, по React много материала смотрю за последние время , и очень много искал как раз именно эту тему с роутами , авторизацией и работой с приватными роутами, очень круто и понятно объясняете!
    И благодаря вам теперь это как дважды два 😀
    Огромное спасибо за такой качественный и крутой материал 👍

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

    Чувствую, как ростуууууу. Спасибо. Помог разобраться.

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

    Спасибо, очень интересно посмотреть 😊

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

    Спасибо! Интересно, можно ли с помощью React router вызывать обновление страницы, например чтобы сайт увидел пришедшую с сервера куку, на spa

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

      Не сталкивался с подобной задачей. Обычно при таком подходе общение с сервером происходит либо посредством REST API/GraphQL, либо через WebSocket.

  • @ЕленаМ-ц2ъ
    @ЕленаМ-ц2ъ Рік тому

    Это не видео, это - золото. Вы супер

  • @МаксимМельников-и7б

    Шикарный канал. Спасибо вам!

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

    Спасибо огромное за ваши старания!

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

    Супер урок! Спасибо Михаил!

  • @serge-KSV
    @serge-KSV 2 роки тому

    Супер урок! Спасибо Михаил!

  • @moi-nick-zanyat
    @moi-nick-zanyat 2 роки тому

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

    • @ЕвгенийБорисевич-т6д
      @ЕвгенийБорисевич-т6д Рік тому

      Привет. Может ты решил данную проблему и можешь рассказать как ее обойти?

    • @moi-nick-zanyat
      @moi-nick-zanyat Рік тому

      @@ЕвгенийБорисевич-т6д если честно я уже и не помню))

  • @maximaliev-lomach2994
    @maximaliev-lomach2994 2 роки тому

    Добрый день. Вы говорите, что можно реализовать авторизацию через Redux. Как это можно сделать?

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

      У меня есть пример с Redux-Toolkit и авторизацией с Firebase ua-cam.com/video/ivtbRBEjLW8/v-deo.html