HomeVideos

React JS c Нуля – ПОЛНЫЙ Курс для начинающих (2025)

Now Playing

React JS c Нуля – ПОЛНЫЙ Курс для начинающих (2025)

Transcript

4764 segments

0:00

[музыка]

0:03

дамы и господа Всех приветствую Меня

0:05

зовут владилен Минин и я уже в it больше

0:07

11 лет 7 лет из которых я преподаю

0:10

JavaScript а также являюсь сейчас

0:12

основателем онлайн университета result

0:14

University который полностью посвящён

0:16

именно качественному образованию по

0:18

front-end разработке и я решил что

0:21

русскому Ютубу не хватает хорошего

0:24

базового материала именно по react react

0:27

- это библиотека которая написана на

0:29

языке JavaScript которая позволяет как

0:31

знаете из строительных блоков строить

0:33

пользовательский интерфейс и это самое

0:36

популярное сейчас решение на рынке труда

0:38

то есть эта технология требуется для

0:40

того чтобы устроиться на работу её чаще

0:42

всего спрашивают и многие начинающие

0:44

сталкиваются с тем что есть

0:45

некачественные материалы А вот эти вот

0:46

большие школы Они продают всё это дорого

0:48

и там очень плохое качество Поэтому я

0:51

решил что это будет большой ролик

0:53

который позволит вам вообще с нуля без

0:55

каких-то начальных знаний Ну кроме там

0:57

JavaScript вы кстати тоже можете найти

0:59

его его на моём канале полностью

1:01

погрузиться в react и понять как эти

1:04

базы работают Вы можете оценить вообще

1:06

качество подачи материала и способ Да

1:08

которым я доношу информацию и Обучаю вас

1:10

потому что это как раз-таки и есть

1:12

демонстрация того подхода и принципа

1:14

которым мы пользуемся в res Out

1:16

University То есть все программы которые

1:18

вы видите в этом университете они

1:19

построены Вот примерно по такому

1:21

принципу что мы прямо наглядно

1:23

показываем вам как это работает Ну и

1:25

дальше Вы уже можете применять это на

1:26

практике у нас безусловно там сделан

1:28

полный акцент на том что вы 20% как бы

1:31

времени Учите теорию на небольших

1:33

роликах а не на этих трёхчасовой

1:35

материалах а потом значит вы практикуете

1:37

большую часть времени и вас сопровождают

1:40

опытные наставники мы отбираем только

1:41

лучших это midle ПС уровень то есть эти

1:44

опытные действующие специалисты они

1:46

напрямую передают вам знания и

1:47

сопровождают вас именно до результата а

1:50

результатом является устройство на

1:51

работу что касается вообще этого курса

1:54

Сейчас вы с нуля будете смотреть как

1:56

работает react как он устроен там как вы

1:59

можете начать свои Первые шаги в нём

2:01

делать И это безусловно не весь контент

2:05

который есть по реакту в описании к

2:07

этому ролику вы найдёте ссылку где я

2:09

приложил дополнительные материалы

2:11

которые позволят вам понять А что вообще

2:13

делать дальше с этими знаниями то есть

2:15

во-первых там вы найдёте полный roadmap

2:18

который показывает какие есть технологии

2:20

в самом реакте которые потом ещё нужно

2:22

будет доучиться какие есть сторонние

2:24

библиотеки и также там есть полный

2:27

список актуальных технологий по разным

2:29

направлениям там от стейт менеджмента до

2:32

тестирования который вы просто можете

2:33

забрать себе и изучать уже по этой

2:36

инструкции также в этой ссылки я заложил

2:39

ещё дополнительный контент который

2:41

показывает а с какими задачами Вы можете

2:44

столкнуться на реальной работе на уровне

2:47

midle june или june П И как эти задачи

2:50

можно решить с помощью react на этих

2:52

примерах я вам хочу показать что вас

2:54

ожидает на реальном рынке труда и что

2:56

вам нужно выучить для того чтобы эти

2:58

задачи решить контент очень полезный

3:00

поэтому вы можете бесплатно его забрать

3:02

и если вам понравится подход который я

3:05

даю в этом ролике если вам понравится

3:06

материал то будем рады пригласить вас на

3:08

платную программу которая уже

3:10

профессиональная даёт знания нужные для

3:13

устройства на работу а наш HR отдел

3:15

позволит вам комфортно устроиться на

3:17

работу или попасть в компании партнёры

3:19

поэтому я желаю вам успехов на этом

3:21

этапе впереди вас ждёт очень много

3:23

интересного и полезного контента

3:25

внимательно его изучайте Кстати да что

3:27

касается ещё рекомендаций по изучению

3:29

вначале вы смотрите а тот материал

3:32

который я даю и в идеале вам нужно не

3:34

просто смотреть А ещё ставить на паузу и

3:37

самому писать ручками чем больше вы

3:38

будете писать ручками и решать задач или

3:40

просто хотя бы знакомиться с синтаксисом

3:42

и понимать как это работает сами это

3:44

реализовывать результат от просмотра

3:46

этого видео будет колоссальным Поэтому

3:48

Ещё раз желаю вам успехов и Давайте

3:51

переходить к обучению Итак давайте

3:52

теперь разбираться с тем что же такое

3:54

react И для этого Я перешёл на

3:56

официальный сайт технологии это react то

4:00

DF Кстати это новый обновлённый сайт

4:02

потому что до этого он по-моему

4:04

находился на reactjs.org В общем это уже

4:06

устаревший считается документация на

4:09

этом сайте есть информация про то что

4:11

такое react как с ним работать что он из

4:13

себя представляет Ну то есть вы можете

4:15

полистать я вам естественно Всё буду

4:17

сейчас рассказывать и показывать

4:18

Единственное что вот на сайте мы видим

4:21

главное определение реакта и нам в базе

4:24

очень важно понимать что он из себя

4:27

представляет это кстати его логотип

4:30

часто вы его сможете встретить в общем

4:32

здесь написано что это библиотека для

4:35

веб-разработки и для разработке нативных

4:38

пользовательских интерфейсов значит если

4:42

немного расшифровать это определение то

4:44

в первую очередь мы видим что react -

4:47

это

4:48

библиотека которая кстати написана на

4:51

языке JavaScript и это большой его плюс

4:53

Кстати если вы вдруг не очень хорошо

4:55

понимаете JS сейчас будет

4:58

подсказок альный курс на момент конца

5:01

двадцать третьего года по JS очень

5:03

хорошей будет базой для этого ролика и в

5:06

общем разработчики берут JavaScript

5:08

разрабатывают набор инструментов которые

5:10

нам позволяют автоматизировать или

5:12

упростить разработку Ну непосредственно

5:14

там в данном случае веб интерфейсов

5:18

веб-интерфейс - это сайты любые сайты

5:21

причём которые вы видите в мобильных

5:23

устройствах браузерах и так далее ну и

5:25

также разработка нативных

5:27

пользовательских интерфейсов под этим

5:29

подразумевается что с помощью реакта Вы

5:33

можете разрабатывать мобильные

5:34

приложения есть такая технология как

5:36

react native которая берёт и там потом

5:41

партией в общем понимая Как работает вот

5:44

эта библиотека Вы можете делать

5:46

довольно-таки много с точки зрения

5:48

интерфейсов но Фишка в том что react как

5:51

раз-таки отвечает за визуализацию и как

5:54

Сейчас мы посмотрим он нам сильно

5:56

упрощает разработку и путём того что

5:59

react работает с компонентами по сути у

6:02

нас будет большое количество

6:04

строительных блоков с помощью которых мы

6:06

сможем создавать там сайты ну Правильнее

6:09

будет говорить интерфейсы всё-таки любой

6:11

сложности и вот на этом этапе Давайте

6:14

закончим с сайтом остальное будет всё в

6:17

практике на примерах Я бы хотел

6:20

показать один пример на котором вы

6:23

сможете понять В чём разница между

6:26

например использованием чистого

6:27

JavaScript Ну и непосредственно react

6:31

потому что тут JavaScript тут JavaScript

6:34

Зачем нам ещё что-то нужно делать И для

6:36

этого значит я написал очень простой

6:38

сайт Как видите дизайн потрясающий

6:42

абсолютно Ну даже анимации какие-то

6:43

добавил в общем смотрите да То есть

6:45

можно кликать

6:47

и показывается там новый контент в табе

6:51

то есть в целом сайт довольно-таки

6:52

простой но Давайте посмотрим как он

6:55

реализован а написал я его на чистом

6:58

JavaScript чит Т что нас здесь

7:00

интересует Ну это стили

7:03

неинтересно с точки зрения Бади вот у

7:06

нас присутствует пустой тег UL То есть

7:08

это весь контент нашего сайта потому что

7:11

всё остальное генерируется уже с помощью

7:13

JavaScript дальше Я создаю контент А ну

7:18

это просто массив И после этого Вот мне

7:21

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

7:23

по этому массиву вывести его в дом

7:26

дерева как я это делаю получаю контейнер

7:29

потом вызываю функцию render Content Ну

7:32

то есть я пробегаю по контенту Каждый

7:35

элемент преобразовывать в

7:37

строчку вот здесь обычная строчка с

7:41

элементом Le Ну и всё и дальше складываю

7:43

это всё в контейнер А для того чтобы всё

7:46

это было

7:47

кликабельно значит Я обращаюсь к

7:49

контейнеру добавляю ему слушатель Клик

7:52

дальше я проверяю вот таким вот ифом что

7:56

Клик был совершён по правильному месту

7:59

Да потому что там можно попасть не

8:01

только вли но и внутренние элементы

8:02

непосредственно самого списка и в случае

8:05

если вс-таки я попал по элементу ли

8:07

тогда я удаляю классы а классы удаляются

8:10

также через контейнер мы получаем все

8:12

элементы ли прибегаем и для каждого

8:14

элемента удаляем класс и собственно

8:17

говоря только после этого мы добавляем

8:18

уже активный класс да то есть за счёт

8:20

этого вот поется такой

8:23

эффект кстати Раз уж мы рассмотрели

8:26

javas как реализован то вот это подход

8:31

что на самом деле отличается от того что

8:33

мы видим в реакте Да но это такое

8:35

последовательное выполнение команд Окей

8:38

Теперь давайте покажу тоже самое на ре

8:41

опять же пока вы не будете там понимать

8:44

весь код для этого и есть этот курс

8:46

после этого вы сможете намного сложнее

8:48

вещи делать Вам будет всё понятно но в

8:51

общем и целом Вот как это выглядит то

8:53

есть абсолютно тотже самый

8:55

функционал умещается вот в 29 к здесь у

8:59

меня ушло Ну тут 991

9:03

минус 46 Можете посчитать Короче больше

9:05

тут Получилось Да по функционалу видите

9:08

что абсолютно тоже самое Ну кроме того

9:10

что я стилем поменял цвет синий Да и

9:14

если здесь разобрать что происходит есть

9:17

абсолютно тот же самый контент что и был

9:19

в JavaScript Но дальше идёт так

9:22

называемый уже декларативный подход

9:25

подход Код да который вы видите то есть

9:28

мы создаём некоторое состояние для того

9:32

какой элемент будет активным Мы также

9:34

делаем Map по аналогии с тем что было в

9:37

JavaScript вот мы выводим Ту же самую

9:39

структуру но только здесь мы уже не

9:42

мучаемся там с этими кликами мы сразу

9:43

говорим что конкретно Если по этому

9:45

элементу Бул Клик мы просто меняем

9:47

состояние а не меняем что-то в коде за

9:51

это как раз-таки отвечает react потому

9:53

что он сам по себе реактивный и в этом

9:56

заключается его фишка что мы Просто

9:59

описываем некоторые

10:01

состояния как здесь и меняя их react уже

10:06

за нас перерисовываю интерфейс то есть

10:08

мы думаем здесь про логику а не про то

10:10

как это ещё реализовать в JS Поэтому вот

10:15

такая вот Разница есть можете с этим

10:17

поиграться но опять же мы сейчас всё

10:19

поэтапно будем разбирать и вот на этом

10:22

этапе следующий момент который я бы

10:24

хотел вам

10:25

объяснить Это то а как вы можете

10:28

стартануть вообще с

10:30

приложением react новым И как вы можете

10:34

в общем начать на нём разрабатывать

10:36

потому что есть несколько способов

10:39

А смотрите первый самый простой Вы

10:43

можете в

10:46

а строчки поисковый запрос где делается

10:49

написать react New в любом браузере

10:53

кстати нажать Enter и вы автоматически

10:56

попадаете на кон Sandbox это такой

10:59

онлайн-редактор кода где

11:02

можно сразу же разрабатывать и за нас

11:06

генерируется вот такой вот базовый

11:08

проект на react Ну который вот если вы

11:11

зайдёте в систему вы сможете уже

11:13

как-нибудь там редактировать и управлять

11:15

всем

11:16

этим вот видите тут всё обновляется

11:18

показывается результат и так далее То

11:20

есть это самый простой способ Ну ко

11:23

опять же Это просто один из онлайн

11:25

редакторов кода который можно

11:27

использовать хорошо для прототипирования

11:30

или для практики какой-то но зачастую

11:33

вам потребуется всё-таки и будет удобнее

11:36

разрабатывать на react локально то есть

11:40

для этого я буду в этом курсе

11:42

использовать такой редактор кода как vs

11:45

код Вы можете его найти здесь

11:47

в по такому запросу и первая ссылка

11:51

ведёт на данный редактор кода можете его

11:53

скачать стабильную версию и всё у вас

11:56

будет примерно тоже самое что и у меня

11:57

опять же существует другие редакторы

11:59

Если вы пользовались там каким-нибудь

12:01

вебшторм например пожалуйста это

12:04

абсолютно будет подходить он тоже

12:05

прекрасно работает с react но я буду

12:08

показывать опять же вот на этом это

12:10

бесплатное

12:11

решение помимо этого также я хочу

12:13

предупредить

12:14

что дальше нам потребуется ещё такая

12:17

программа как not JS Если вы ещё не

12:21

установили её Зайдите на этот сайт как я

12:23

показал сейчас и установите Вот эту вот

12:26

рекомендованную для большинства

12:28

пользователей ве просто его скачиваете и

12:32

устанавливаете как обычную программу

12:33

этого будет достаточно после этого

12:35

откроете терминал в macos это терминал

12:39

называется там в Windows cmd по-моему

12:41

или Shell точно уже не помню но смысл в

12:44

том что одинаковые команды будут для

12:46

начала можете прописать Note - V вот у

12:49

меня восемнадцатая версия стоит нас

12:51

конкретно будет интересовать такая

12:53

утилита как npm пишете npm Window V если

12:56

выдаёт Всё круто можно продолжать ть

12:59

опять же на канале У меня есть вводный

13:01

курс быстрый по nots постараюсь его

13:04

приложить если что вы можете в поиске

13:06

его найти там прям пошагово подробно

13:09

тоже рассказываю как всё это устроено

13:11

Чтобы у вас было понимание как

13:13

разрабатывать классное приложение и

13:16

Теперь смотрите для того чтобы нам

13:20

локально развернуть какой-либо проект на

13:24

react в начале Нам нужно будет

13:26

определиться с папкой я с помощью

13:29

команды CD перейду в папочку vs код и

13:32

здесь у нас есть на самом деле два

13:34

способа создания реакта Ну из простых Я

13:37

имею в виду смотрите есть такая

13:38

технология которая называется Create

13:40

react App у неё тоже есть свой сайт

13:44

Create react updf здесь можно посмотреть

13:47

документацию тоже по технологии Как

13:50

стартануть с ней но в целом всё что нам

13:52

потребуется это прописать вот такую вот

13:55

команду npx Create react App My App

14:00

значит здесь Давайте только мы правим не

14:03

My допустим inro давайте так вот

14:09

inro Project это просто будет название

14:12

папки где будет храниться уже весь

14:14

проект который относится к react значит

14:18

что происходит здесь мы Обращаемся по

14:20

сути к пакету который

14:22

называется локально вле устанавливается

14:25

иже

14:27

зано про где мы сможем сразу же

14:32

разрабатывать на react там уже настроена

14:34

вся инфраструктура нам не нужно уже ни

14:36

про что думать мы просто садимся и пишем

14:38

код это довольно-таки удобная

14:40

фича сейчас мы его установим то есть по

14:44

факту сейчас идёт установка зависимости

14:46

для работы react там

14:48

всякие ну если вы работали до этого то

14:51

это называется папка НОД модуля В общем

14:53

для того чтобы поддерживать

14:55

инфраструктуру и смотрите мы можем

14:59

перейти

15:02

react int

15:04

Project и дальше нам необходимо открыть

15:08

Это в нашем редакторе то есть я могу

15:10

написать Вот так вот код Точка И это у

15:12

меня

15:15

открывает ВС код Ну либо просто там

15:18

нажимаете

15:19

файл открыть папку и ищете Где вы е

15:29

па sce то здесь как раз таки

15:31

присутствует вот

15:34

базовая потом разберусь что это такое А

15:36

там какие-то проблемы с Дена базовая

15:38

структура для

15:39

react Ну и в принципе всё для того чтобы

15:42

стартануть Вам необходимо прописать

15:45

команду Старт как это выглядит здесь

15:47

наверху есть кнопочка создать терминал

15:49

он создаётся прямо в папке Где мы

15:52

находимся и мы просто пишем

15:56

nm после этого открывается Local Host

16:00

3000 и мы попадаем на вот главную

16:02

страницу ВС которую можно редактировать

16:04

опять же сейчас не про это речь потому

16:06

что буду показывать всё

16:07

поэтапно чтобы остановить процесс

16:10

нажимаем Ctrl C Ну и всё

16:14

останавливается сразу же отвечу на

16:16

вопрос Зачем нам вообще какие-то вот эти

16:19

вот огромное количество зависимостей

16:21

какие-то библиотеки там модули и по

16:24

факту то что мы делаем называется ну

16:26

создание

16:27

инфраструктуры процесса есть один

16:31

нюанс который специфичен для реакта суть

16:35

заключается в том что вот у нас есть как

16:37

бы JavaScript

16:40

файлы там есть код JavaScript который

16:43

понимает браузер если мы посмотрим на

16:46

какой-нибудь react код то здесь вы

16:48

увидите кое-что необычное например Это

16:51

то что мы без каких-либо кавычек просто

16:54

пишем здесь HTML теги по факту мы

16:57

естественно в этом курсе разм Как это

16:59

работает я вам покажу что происходит

17:01

после билда буквально вот скоро уже

17:03

достаточно по курсу но суть в том что

17:06

такой синтаксис браузер не понимает и

17:09

для того чтобы всё это работало мы

17:11

вначале должны пропустить это через

17:14

инструменты которые в данном случае

17:15

предлагает например Create react и

17:18

только после этого уже как бы

17:20

скомпилированный код jav скриптовый

17:22

отдать браузеру чтобы он работал да но

17:24

вот вы должны понимать что вот это не

17:26

совсем JavaScript

17:29

подробности дальше так и это

17:33

спойлеры значит то что вас ждёт потом и

17:36

следующий покажу момент как можно

17:39

сгенерировать по-другому приложение

17:41

которое мы будем использовать в этом

17:43

курсе есть такая технология как вид

17:47

очень

17:49

быстрый инструмент для сборки проектов

17:53

Вот можете тоже про него почитать у

17:57

него шаблоны очень мощный и быстрый

18:00

инструмент и например мы здесь можем

18:01

работать с react или Rea typescript но

18:04

опять же это продвинутая уже тема про

18:06

неё подробнее в большой программе мы там

18:08

даём контент а потому что в рамках туба

18:11

сложно такое дать вот и всё что нам

18:14

необходимо сделать Мы также переходим в

18:16

консоль здесь я выйду на верхний уровень

18:20

и напишу

18:25

npm L кстати вот эта вот собака latest

18:29

это означает что Ну есть же разные

18:31

версии пакетов там технология же

18:33

обновляется Да её постоянно там допили

18:35

так вот мы говорим что здесь мы работаем

18:37

как бы с последней версией доступной всё

18:40

нажимаю

18:42

Enter нам говорят что нам необходимо

18:45

установить вид здесь я нажимаю

18:48

Yes Project name давайте мы назовём его

18:52

react

18:54

Intro и дальше стрелочками Мы выбираем

18:57

ну нас интересует в данном случае react

19:01

здесь смотрите мы не выбираем там

19:02

typescript или tyt сево мы выбираем

19:06

JavaScript просто здесь я нажимаю

19:09

Enter всё После этого мы переходим в

19:12

папку react Intro дальше очень важно

19:16

дальше мы делаем npm

19:19

install

19:21

inst для того чтобы установить список

19:23

зависимо Потому что если в случае

19:27

с сам для нас их ставил Здесь нам нужно

19:29

их вручную поставить Вот и давайте тоже

19:33

открою я его в ВС

19:35

коде здесь мы видим немножечко иную

19:38

структуру и файлы но при этом суть

19:41

остаётся той же самой то есть

19:43

присутствует вот этот App GSX уже опять

19:47

же все эти там вещи мы разберём с вами в

19:49

курсе Почему так как это всё работает

19:52

вот и

19:54

HTML с другой стороны опять же всё это

19:56

Рабочая история и нам чтобы запустить

19:59

Этот проект открываю консоль здесь и

20:01

пишу npm Run

20:04

Def открывается Loc Host

20:07

5173 перехожу видите выглядит это

20:10

немножечко иначе Вот Но зато кнопку

20:12

можно нажимать и она будет работать а

20:15

такая вот вводная получается значит

20:17

попрактиковаться

20:28

для проекта который подготовил чтобы

20:30

было ещ проще нам нужно переходить к

20:33

следующей теме но сейчас будет маленькая

20:36

презентация потому что нам необходимо

20:38

разобраться А что такое компоненты Итак

20:40

для того чтобы нам прям эффективно

20:42

приходить к основному контенту данного

20:44

курса в первую очередь необходимо

20:47

разобраться А что такое react компоненты

20:50

и это такой как бы философский базовый

20:53

подход у библиотеки потому что ВС на

20:57

самом деле в м строе на компонентах это

20:59

Ключевая его фишка поэтому очень важно

21:02

понимать что это такое и как оно

21:04

строится Итак что такое компоненты

21:07

Давайте сразу же разберём это на

21:09

практике значит я зашёл на сайт своего

21:13

университета и здесь на главной странице

21:16

выбрал те места которые вот по факту мы

21:19

разрабатываем как отдельные компоненты

21:22

то есть мы можем видеть что отдельный

21:25

компонент - это логотип каж ссылочка -

21:28

это тоже а какой-либо компонент Да они

21:31

одинаковые как бы но видите у них разные

21:33

составляющие здесь сейчас мы разберёмся

21:35

с этим есть кнопочка она это тоже

21:38

отдельный компонент текст заглавный Да

21:41

это тоже отдельный компонент Ну и

21:42

картинка с текстом это тоже отдельные

21:45

компоненты которые могут быть объединены

21:47

в другой компонент то есть по сути это

21:51

такой строительный блок для интерфейса И

21:55

как вы понимаете интерфейс можно

21:57

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

21:59

строительных

22:01

блоков для того чтобы ими было проще

22:03

управлять то есть да я немного даже

22:05

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

22:08

что вам важно понимать Это маленькие

22:10

строительные блоки сайта значит какие

22:13

есть преимущество вот такого подхода да

22:16

Опять же как оппозиция есть например

22:19

Монолит Да когда мы всё пишем там в

22:21

одном JavaScript файле весь функционал

22:24

но с ростом объёма нашего приложения там

22:28

или его возможностей в файле становится

22:30

сложнее ориентироваться а вот у

22:32

компонентов есть определённые

22:34

преимущества во-первых они

22:38

переиспользовать Понятно В чём вообще

22:41

суть этого подхода дальше это разделение

22:44

и изоляция логики в этом курсе вы

22:47

поймёте подробнее в чём прикол вообще

22:49

этого подхода и почему он действительно

22:51

классный но смысл в том что мы дробим

22:55

как раз-таки вот следующая Да часть

22:57

проще разрабатывать Интерфейс Да мы

22:59

дробим получается вот какую-нибудь

23:01

большую задачу на

23:04

маленькие и точечно да разрабатываем

23:08

функционал для конкретного элемента

23:10

интерфейса и когда мы Вот решаем не

23:13

сразу же там задача всего сайта А

23:16

конкретно одного локального места это

23:18

конечно же намного проще с точки зрения

23:19

разработки И тем самым можно допускать

23:22

меньше ошибок быстрее разрабатывать и

23:24

так далее Вот ну как следствие проще

23:26

разрабатывать непосредственно с

23:28

использованием

23:30

компонентов следующий плюс это то что и

23:34

HTML и CSS и JavaScript Они лежат в

23:37

одном месте и то есть Представьте Да что

23:40

вот вы раздробили ваш сайт такие

23:41

маленькие как бы блоки и вам не нужно

23:44

там думать где CSS лежит там где

23:46

JavaScript вы просто переходите в нужный

23:48

необходимый блок быстренько его правите

23:50

с точки зрения стилей функционала или

23:52

структуры ВС у вас всё работает опять же

23:55

в этом вы сечас

23:56

Убедитесь соответственно последний плюс

23:59

основной - это то что компоненты на

24:01

самом деле используются сейчас везде

24:04

потому что вы можете встретить это в

24:07

других фреймворка таких как angular W

24:10

quid Solid там View

24:13

А вы сможете это использовать в

24:16

мобильной разработке потому что это

24:18

очень хорошая практика которая

24:19

действительно сейчас используется везде

24:21

при построения интерфейсов Теперь

24:23

смотрите что касается

24:27

зашёл в Яндекс музыку

24:30

и есть список треков Да которые у меня

24:33

там последние добавлены например И если

24:36

мы посмотрим внимательно с точки зрения

24:38

Вот именно разработчика фронтенд

24:40

разработчика сейчас на этот скриншот то

24:42

мы увидим не просто список треков а мы

24:45

увидим одинаковые компоненты Но вот я

24:48

красненьким подчеркнул верхние опять же

24:50

другие тоже относятся к этим компонентам

24:53

смысл здесь вот в чём то есть они

24:55

одинаковые по своей структуре то есть

24:57

видите есть картинка есть текст Есть ну

24:59

название трека Да есть автор есть к и

25:04

длительность Понятное дело что другой

25:06

трек он содержит себе другие данные

25:09

но у него точно такая же структура и на

25:12

самом деле мы же не будем вручную да

25:15

описывать там структуры для каждого

25:17

компонента Ну точнее для каждого трека

25:19

нет Мы один раз создали этот компонент и

25:23

Да передам в него памет того то есть

25:28

нужно ли нам отобразить буковку е или

25:29

нет но при этом структура вот для такого

25:32

компонента она у нас одинаковая и это

25:35

позволяет переиспользовать эти

25:37

компоненты один раз написав что

25:39

существенно упрощает разработку

25:41

интерфейсов для того чтобы вы заранее

25:44

понимали Примерно как это выглядит здесь

25:46

Кстати я показал Как выглядит

25:48

одновременно и JavaScript и CSS HTML вот

25:51

типичный react компонент это кстати

25:53

скриншот из курса Да который мы сейчас

25:56

будем проходить и

25:59

это простой код который Вы будете

26:00

понимать на самом деле там куда более

26:02

сложные вещи вот смотрите Да здесь идея

26:04

в том что есть CSS мы сразу же да задаём

26:06

стилистику для корневого элемента ли

26:10

есть JavaScript то есть мы сразу же

26:13

описываем какой-то функционал здесь и

26:15

есть HTML удобно удобно и Видите какой

26:18

маленький Это всего лишь элемент ли но

26:20

он при этом принимает параметры

26:22

ирисова примерно тоже самое что мы

26:24

только что видели с Яндекс

26:26

музыкой использование компонентов это

26:28

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

26:30

интерфейс и намного проще

26:32

программировать функционал который от

26:33

вас

26:35

требуется как я и говорил да react

26:37

позволяет создавать

26:49

переиспользовать То есть Вам вручную

26:50

ничего не нужно будет делать это очень

26:52

очень удобно тоже Убедитесь Ну

26:55

собственно говоря это я уже перечислил

26:56

Да что Всё лежит в одном файле опять же

26:59

покажу множество подходов в том числе со

27:01

стилистикой это достаточно удобно сразу

27:03

же так вот программировать и конечно же

27:06

вы должны понимать что чем сложнее

27:09

объёмнее там больше будет проект который

27:11

вы разрабатываете тем больше и больше

27:13

будет виден плюс от использования

27:16

компонентов Ну потому что когда

27:17

маленький проект его можно просто

27:19

написать когда проект Большой там уже

27:22

можно легко запутаться Ну и собственно

27:25

говоря да Про это тоже уже говорю что

27:26

компоненты они используются и в

27:28

мобильных приложениях в даже нативной

27:31

разработке в том числе там iOS cotl А и

27:36

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

27:39

фреймворка кстати видео на них Вы тоже

27:41

можете найти на моём канале Ну ладно мы

27:43

сейчас про react короче я думаю что я

27:45

вас заинтересовал Я надеюсь что вам

27:48

понятно пока и Давайте посмотрим как это

27:50

работает на практики потому что впереди

27:52

очень много увлекательной и практичной

27:55

полезной информации Итак Теперь давайте

27:57

раз как же работают компоненты но только

28:00

на практике И сейчас мы с вами будем

28:02

писать уже полноценный сайт с

28:04

использованием

28:05

reacts в первую очередь вам необходимо

28:07

будет скачать Исходный код данного

28:10

проекта он называется 01 react bic

28:13

по-моему старт и здесь вы получите вот

28:17

такую структуру то есть распакуйте

28:19

откроете в коде эту папку и в первую

28:23

очередь нам потребуется установить

28:26

зависимость ч библиотек с помощью npm то

28:29

есть Я просто пишу Здесь npm inst также

28:31

и вы делаете Это в консоли и получаете

28:34

папку НОД модули и теперь наш проект

28:37

готов к работе Давайте сразу же на него

28:39

и посмотрим для этого я напишу команду

28:41

npm

28:44

Run всё это работает на вид То есть он

28:47

довольно-таки быстрый и теперь наш

28:49

проект доступен на Local

28:51

Host

28:54

[музыка]

28:55

5173 и здесь мы видим потрясающее

28:58

абсолютно приложение где написано Hello

29:00

react и больше ничего нет но во всяком

29:02

случае мы теперь видим что это запущено

29:04

И сейчас я хочу разобраться А как вообще

29:07

мы в браузере видим Вот эту вот строчку

29:09

Как это работает и связано вот с тем

29:11

кодом который сейчас есть у нас в

29:13

проекте Давайте разбираться У нас есть

29:15

папка Source и здесь мы видим Ну

29:18

некоторый набор файлов сейчас вот мы не

29:20

будем рассматривать Икс CSS и Data это

29:23

обычные JavaScript CSS они не относятся

29:25

к реакту и Давайте откроем fil main.go

29:31

здесь внимание присутствует такое

29:34

необычное довольно-таки расширения jsx

29:37

не просто GS с ним мы разберёмся немного

29:40

позже пока мы видим что здесь

29:41

присутствует Ну в принципе более-менее

29:43

похожий на JavaScript synxis но как

29:46

видите здесь нет никакой информации о

29:49

том как выглядит структура нашего

29:51

проекта там как HTML теги из этого

29:53

складываются То есть просто какой-то

29:55

функционал что-то происходит

29:58

знакомую штуку можно выпить

30:02

здесь можем даже вот

30:05

перенести назвать например это То есть

30:09

это просто обычный дом

30:10

элемент скопировать его и вставить сюда

30:13

да то есть так вот немного

30:20

[музыка]

30:26

декомпозиции на react на самом деле если

30:30

посмотреть на другую папочку

30:33

Public Прошу прощения не здесь вот он

30:35

индекс HTML в паблике если не с витом

30:39

создавать А с Create Rea тогда он там

30:41

будет в Вите индекс HTML лежит здесь

30:44

Давайте мы его откроем То есть это то

30:46

что открывается вообще в браузере и где

30:49

работает react и вот что мы здесь можем

30:51

наблюдать видим title Ну то есть в

30:54

принципе знакома HTML структура нам но в

30:57

ба также присутствует с ID Root и он

31:01

абсолютно пустой но теперь мы понимаем

31:04

что вот сюда получается этот элемент мы

31:07

забираем и что-то мы делаем дальше с до

31:12

он там какой-то OT создаёт И после этого

31:14

уже выводится вот э непонятная строчка

31:16

сейчас мы с ней разберёмся то есть вот

31:19

где будет

31:21

инициализировать приложение

31:26

виф рассматриваем больше в HTML ничего

31:30

нет то есть всё остальное будет

31:31

проходить именно в react отлично с этим

31:34

я думаю мы разобрались Теперь давайте

31:36

разбираться вот с этой строчкой здесь мы

31:38

делаем рендер и дальше присутствует

31:40

довольно-таки необычный Синтаксис это

31:43

как будто бы тег но неизвестный нам Да

31:45

он называется App мы его также

31:47

импортируем из App GSX если мы его

31:50

откроем то наконец-то мы добрались уже

31:53

до Ну чего-то понятного это HTML теги

31:57

правда Если разобраться сейчас то как

31:58

видите они также находятся у нас

32:01

в JavaScript в формате GSX То есть

32:05

сейчас мы про это поговорим но в любом

32:07

случае здесь мы видим структуру что всё

32:09

наше приложение - это div и в нём есть

32:12

заголовок H1 где написано Hell react

32:14

причём если мы добавим например что-то в

32:16

заголовок Я нажму сохранить и посмотрим

32:20

в браузере То мы видим что вот

32:21

появляется этот восклицательный знак

32:23

если мы проинспектируйте

32:27

вот у на получается есть с ID Root и

32:30

дальше то что мы видели в GSX примерно

32:34

так это работает то есть больше у нас

32:36

таких файлов сейчас нет И теперь

32:39

действительно Я хочу прокомментировать А

32:40

что это вообще за такой синтаксис потому

32:42

что в JavaScript мы не можем писать

32:44

просто теги и в действительности это и

32:48

не является тегами на самом деле это

32:51

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

32:56

который функциями которые заложены в

32:59

react но так как браузер не понимает

33:01

такой

33:03

синтаксис Для этого нам нужен bu процесс

33:06

то есть для этого у нас там вид сделан

33:09

другие сборщики которые на самом деле в

33:12

фоне анализирует что мы здесь написали и

33:15

дальше преобразовывает это уже в

33:18

какой-то код который будет понятен

33:20

браузеру и в процессе разработки

33:24

действительно если у на есть вот такой

33:27

мы его обозначаем с расширением GSX то

33:30

есть оно так и называется вот этот

33:32

синтаксис по факту это просто обычный

33:35

JavaScript Но вот эти теги Они сделаны

33:37

для удобства разработки чуть позже по

33:39

видео я покажу как на самом деле это

33:41

выглядит сейчас не хочу

33:57

проект то есть Вид всё это собрал и

33:59

дальше уже отобразил в браузере То что

34:01

ему Понятно Окей и Давайте попробуем

34:04

теперь с этим поработать То есть как я и

34:06

говорил до этого react - это библиотека

34:09

которая служит для более удобного

34:12

создания пользовательских интерфейсов

34:14

путём декомпозиции на вот эти вот разные

34:16

компоненты Ну и так называемые UI блоки

34:19

то есть р интерфейс какие-либо блоки и

34:23

соответственно мы можем создавать

34:25

какую-то более нежели там заголовок H1

34:29

поэтому Давайте попробуем как это мы

34:30

можем сделать например для этого сайта Я

34:33

хочу создать header Ну то есть

34:35

какую-нибудь шапку я в принципе могу так

34:37

и начать писать header дальше я нажимаю

34:40

Tab в ВС коде Да это просто превращает в

34:44

готовый тег Ну и здесь например

34:46

там можно написать скажем заголовок

34:51

H3 здесь я напишу

34:55

University это собственно говоря курс

34:59

часть программы из университета который

35:01

мы разрабатываем по фнн разработке Ну и

35:03

Давайте здесь будет какой-нибудь Спан

35:05

там сейчас напишем здесь просто временно

35:08

тут будет время забавно что я сказал

35:11

временно и про время то есть мы создаём

35:13

просто какую-то структуру Да всё это

35:15

отображая в нашем а

35:17

компоненте смотрим И за счёт того

35:21

что у нас прописаны некоторые стили мы

35:24

вдруг получаем уже

35:25

готовый они не идеальные но скоро мы со

35:28

всем этим разберёмся и в элементах Мы

35:31

видим что действительно вот теги которые

35:33

мы прописали То есть пока я думаю

35:35

разработка выглядит Ну довольно-таки

35:36

понятным образом Теперь давайте вот э

35:39

вот часть нашего приложения оберн в

35:42

[музыка]

35:45

г Ну и просто здесь будет лежать

35:47

заголовок H1 кстати Обратите внимание

35:50

что вот

35:52

сейчас

35:55

завода то есть форматирование не было

35:57

соблюдено при этом я нажимаю Command S и

36:01

Как видите автоматически у меня

36:02

форматирование

36:03

а встаёт правильно Да это работает

36:06

притер в vs коде То есть вы можете Если

36:09

вдруг у вас такого нет поставить это

36:11

расширение вот здесь в маркетплейсе

36:13

притир называется код

36:16

форматер так Main мы сделали Да теперь у

36:19

нас получается Чуть более красивые

36:22

приятные отступы Ну и всё наше

36:24

приложение начинает уже оживать

36:26

прекрасно

36:27

Однако Как вы понимаете Ну то есть

36:29

хранить всю структуру нашего приложения

36:32

в одном только компоненте пока это

36:34

функция Up Ну не очень удобно потому что

36:37

тогда у нас будет очень много кода мы не

36:39

сможем разобраться в чём прикол а как

36:40

раз-таки опять же react он про такую

36:42

молекулярность то есть про декомпозицию

36:46

про изоляцию Да различных компонентов и

36:48

на этом этапе Давайте разберёмся вот со

36:50

второй частью то есть Что происходит

36:52

вообще в этом файле У нас есть функция

36:55

обычная функция в javas кото что-то нам

36:57

возвращает и дальше мы её экспортируем

37:00

Кстати я не всегда люблю отдельно писать

37:03

такие экспорты мы можем здесь в одну

37:05

строчку написать и немножечко сократить

37:07

коды но по функционалу это одно и тоже

37:10

то есть мы её экспортируем и дальше в

37:13

мене мы её получаем и Теперь смотрите

37:16

это функция у нас и мы её Превращаем как

37:20

бы в г путём Ну добавления вот такого

37:23

синтаксиса с треугольными ско

37:27

то есть в реакте получается чтобы

37:29

создать компонент нужно создать просто

37:31

функцию дальше вернуть в этой функции

37:34

какой-то шаблон и получится компонент

37:36

Давайте попробуем значит для этого вот

37:40

например в данном случае мне кажется что

37:42

хедер отлично подходит под компонент

37:44

который куда-то можно вынести в

37:45

отдельное место он логически объединён

37:48

функционалом хедера и мне кажется это

37:51

правильно Я создаю функцию и здесь я

37:54

назову е с большой буквы header сейчас

37:57

мы поговорим про нейминг После этого мне

38:00

необходимо сделать Return я пишу круглые

38:03

скобочки и сюда Вставляю то есть вырезаю

38:07

весь этот шаблон и Вставляю сюда опять

38:09

же сохраняю видите форматирование У меня

38:11

сохраняется и всё хорошо Отлично Теперь

38:14

если мы посмотрим на наш проект Мы видим

38:17

что РТО у нас пропал Потому

38:20

что почему мы не использовали эту

38:23

функцию то есть мы её создали но никак

38:25

не вызвали и теперь нам нужно вставить

38:28

её в правильное место только теперь мы

38:31

уже знаем да что функцию нам нужно

38:32

превратить в тег поэтому здесь я пишу

38:36

header и всё сохраняю сразу же могу

38:39

сказать что вот в таких ситуациях можно

38:43

использовать сокращённую запись для

38:45

этого

38:48

тега ровно такие же правила как в

38:51

обычном HTML Так теперь давайте

38:53

посмотрим работает ли это да И как

38:55

Видите вот у нас прекрасно отобразил Р И

38:58

если мы посмотрим по структуре опять же

39:00

в элементах то есть вот есть этот div

39:03

дальше внутренний div дальше header идёт

39:05

и Main то есть вместо вот этого

39:08

компонента header который мы только что

39:10

создали вставляется просто его структура

39:13

Да и получается что на этапе разработки

39:15

мы вот так вот можем дробить эти

39:17

элементы и создавать структуру нашего

39:19

приложения теперь Пару слов про

39:22

правильный нейминг этих

39:24

компонентов смотрите их нужно называть с

39:28

большой буквы Это сигнал реакту того что

39:32

этот компонент не встроенный там в HTML

39:35

или ещё где-либо этот компонент мы

39:37

создавали сами поэтому первое самое

39:40

важное правило для названия компонентов

39:42

это то что они вот именно начинаются с

39:44

большой буквы Это позволяет в том числе

39:46

как бы вот ну не перепутать те теги

39:47

которые есть

39:49

встроенные и сразу же на этом этапе Я бы

39:52

хотел ещё поработать над структурой

39:54

потому что да Безусловно мы сейчас

39:56

создали отдельный компонент но он всё

39:58

ещё хранится в одном файле и менеджери

40:00

это довольно-таки сложно поэтому Давайте

40:03

Поработаем над архитектурой для этого я

40:07

создам папку в папочке Source Я назову

40:10

её

40:11

components и здесь я создам новый файл

40:14

который назову с большой буквы тоже

40:17

header

40:18

GSX ещё раз Почему GSX потому что в этом

40:24

файле мы используем вот специальный

40:27

синтаксис в

40:29

реакте так Эр Def мы сделаем да то есть

40:33

Нам необходимо экспортировать данный

40:35

компонент но при этом в некоторых

40:39

проектах вы всё равно можете встретить

40:41

такую ситуацию

40:42

что скажем файл Да в котором будет

40:46

прописан jsx будет с расширением JS Дело

40:49

в том что нет какого-то строгого

40:51

регламента потому что вот нужно

40:53

использовать такое расширение или такое

40:56

больше это сделано именно для удобства

40:57

разработки то есть вот мы сразу можем

40:59

понять что например вот в дате у нас нет

41:01

GSX Да потому что это GS а в хедере у

41:04

нас есть GSX но если мы даже назовём его

41:07

GS в принципе функционал вот этого не

41:09

изменится то есть в разных проектах

41:10

существуют разные

41:12

гайды смотрите дальше мы header

41:15

экспортировали теперь нам необходимо его

41:17

импортировать То есть я пишу и header

41:22

From

41:24

header Теперь давайте посмотрим да

41:26

Видите Всё у нас работает и вот в доме

41:30

мы получаем следующую структуру то есть

41:32

ничего не изменилось но теперь видите

41:34

из-за изоляции этих

41:36

компонентов очень просто смотреть какие

41:39

части мы можем изменить как они работают

41:41

и как ими управлять

41:44

Поэтому я думаю что со статикой мы

41:46

разобрались наверное ещё пару слов скажу

41:49

про вот эти вот

41:50

компоненты мы его используем

41:53

в

41:55

функци если мы возьмём и продублируйте

42:01

посмотрим Мы видим что мы просто

42:04

получили дополнительную структуру с

42:06

точки зрения хедера конечно Это

42:08

неправильно для приложения Да что у нас

42:10

несколько вот так вот идёт подряд но тем

42:12

не менее Смысл в том что теперь да когда

42:14

мы вынесли вообще функционал в отдельный

42:16

компонент мы можем использовать этот код

42:18

как захотим и где захотим И сколько

42:21

захотим и это как раз таки есть огромное

42:24

удобство в реакте потому что Теперь у

42:27

нас есть такой один строительный блок на

42:29

основе которого мы можем вот формировать

42:31

целый Ну целое приложение и

42:32

переиспользовать его поэтому сейчас мы

42:34

будем с этим тоже разбираться подробнее

42:36

естественно я удалю все эти лишние

42:38

компоненты И как я и говорил то есть

42:40

сейчас мы разобрались со статикой Да мы

42:43

поняли примерно пока базово как

42:46

формировать HTML А что насчёт динамики

42:50

как вообще выводить какие-то

42:51

динамические значения давайте для этого

42:54

Поработаем вфа то

42:57

GSX и вот у меня здесь есть Спан да

43:01

давайте здесь напишем

43:02

допустим

43:05

время Сейчас двоеточие и вот здесь вот

43:08

нам необходимо вывести Ну что-то

43:09

динамическое потому что время оно

43:10

постоянно меняется так вот в react есть

43:14

специальный синтаксис когда мы находимся

43:16

в

43:17

GSX здесь мы пишем фигурные скобочки И

43:21

на самом деле вот в них мы можем писать

43:23

уже любой JavaScript и он будет

43:26

интерпретироваться

43:27

ретом как что-то динамическое он будет

43:30

выводить его в итоге в шаблон то есть

43:32

здесь мы пишем то что можно привести к

43:36

строке например мы можем здесь сложить

43:39

скажем 21 п 21 Угадайте что получится ну

43:43

те кто давно смотрит мои ролики

43:45

поймут естественно мы здесь получаем 42

43:49

и вот на самом деле тут мы можем тепер

43:52

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

43:54

вообще различные элементы там разли

43:56

сущности например деление

43:58

умножение какую-нибудь строчку написать

44:01

там например вот это вот Давайте лучше

44:04

другую например

44:05

Hello to upper Case Да мы получаем здесь

44:11

Hello то есть Поиграйте с этим поймите

44:14

Как это работает в принципе здесь нет

44:15

ничего сложного концепция в том что в

44:18

фигурных скобках у нас происходит

44:20

динамика и как следствие если мы хотим

44:22

получить время то мы можем создать

44:24

например

44:26

а константу Now равно New

44:30

Date Ну и сюда мы можем вывести

44:33

Now Однако если мы сейчас посмотрим мы

44:35

получим ошибку потому что мы передаём

44:39

сюда объект он по умолчанию не может

44:41

привести его к строке поэтому здесь

44:43

Давайте напишем to La Time

44:47

string обновляю страницу чтобы ушли эти

44:50

все ошибки Вуаля мы получаем текущее

44:53

время причём смотрите если я буду

44:56

ни то она будет показывать уже другое

45:00

время да потому что оно меняется то есть

45:02

мы разобрались как выводится здесь

45:05

динамика в реакте также я хочу сказать

45:07

что безусловно Вот эту вот константу мы

45:10

можем создать и внутри этой функции То

45:12

есть как бы изолировать тоже этот

45:13

функционал пока это база Но чуть позже я

45:16

покажу как работать именно уже

45:18

с меняющимися величинами более правильно

45:21

но тем не менее так може

45:24

делать Давайте разберёмся Как работать с

45:28

атрибутами потому что по сути Мы сейчас

45:31

что-то выводим в сам HTML но также есть

45:35

и второй способ вводить вот эту динамику

45:37

Давайте Я приведу пример с картинкой вот

45:40

у меня в папке Public и у вас тоже есть

45:43

лого name svg и мы хотим импортировать

45:48

эту картинку Причём я покажу как

45:49

правильно её импортировать и вывести вот

45:51

допустим вместо этого H3 то есть его я

45:54

закомментировать

45:56

Здорово что я это показал потому что

45:57

смотрите я нажал Command СШ и вот что

46:01

произошло то есть мы видите обернули

46:03

тоже как раз вот это вот фигурные

46:05

скобочки что говорит реакту о том что

46:07

дальше будет здесь динамика и просто как

46:09

обычный JavaScript мы закомментировать

46:22

картинки Мы можем написать следующим

46:24

образом

46:26

допустим я назову картинку

46:29

лого и дальше я говорю Откуда мы её

46:36

импортируем учитывая что она лежит в

46:38

папочке па то мы здесь ставим просто СШ

46:41

и пишем название того что нам нужно

46:44

сделать Log SG то есть по факту Мы

46:48

работаем с картинкой здесь как с обычным

46:50

JavaScript чтобы мы не думали где эта

46:52

картинка лежит какой у не правильный

46:54

путь когда наш проект будет собираться

46:56

он правильно поставили сюда название

46:59

файла его путь и всё нам не нужно будет

47:03

с этим заморачиваться то есть а с точки

47:05

зрения разработки видите довольно-таки

47:06

удобно получается и дальше Вот у меня

47:08

будет тег Image соответственно вот это

47:12

вот мне нужно положить в атрибут Source

47:15

и для того чтобы это было динамично Да

47:17

потому что мы не можем так вот написать

47:18

это будет неправильная картинка Вот то

47:20

есть видите тут ошибки должны быть мы

47:23

собственно говоря сделаем то же самое то

47:25

есть мы в качестве значения для этого

47:27

атрибута передаём фигурные скобки и сюда

47:29

указываем уже просто лого Теперь если мы

47:32

посмотрим всё наша картинка подгрузило И

47:36

теперь мы можем уже с ней работать она

47:38

нам украшает сайт что касается Альта то

47:41

смотрите тоже немного поиграемся с этим

47:43

мы можем просто написать здесь

47:46

а какой-то альтернативный текст и мы

47:50

абсолютно можем использовать это всё в

47:52

двойных кабы как мы это делаем в обычном

47:54

HTML но вдруг если скажем вот это вот

47:59

значение у нас будет

48:01

храниться в строчке Да и нам нужно его

48:04

вывести то мы абсолютно также можем

48:07

сделать вывести сюда строчку либо таким

48:10

образом либо вот таким вот образом то

48:13

есть так как опять же это лежит уже

48:15

внутри фигурных скобок то мы здесь

48:17

описываем JavaScript поэтому здесь мы

48:19

уже используем эти кавычки вот есть уть

48:23

этот момент сечас посмотрим видите

48:26

Отт Теперь давайте разберёмся Как мы

48:29

можем переиспользовать различные

48:31

компоненты и передавать в них параметры

48:33

потому что опять же сейчас мы просто

48:36

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

48:39

но никак с ним не взаимодействуем для

48:41

этого немножечко поправим структуру если

48:43

я добавлю SE з есть у меня будет

48:47

заголовок H3 здес напишу наш подход к

48:51

обучению Я честно говоря возьму сайт

48:54

своего университета и просто возьму

48:56

отсюда

48:58

информацию Ну вот отсюда будем брать да

49:01

то есть мы поговорим про наш подход к

49:04

обучению отсюда будет проще копировать

49:07

Итак Теперь давайте разработаем

49:09

какую-нибудь структуру например Здесь я

49:12

создам список у дальше будет

49:16

ли в ли я создам параграф P и вот у меня

49:20

здесь будет уже информация вначале будет

49:23

что-то в ге Ну и потом просто я буду

49:25

описывать текст вот таким вот образом

49:27

скажем фильтрация информационных

49:31

технологий информации и

49:34

технологий Ну я сейчас думаю про то как

49:37

про react рассказывать поэтому не сильно

49:39

читаю Да больше сосредоточен на

49:41

правильного донесение

49:45

информации дальше мы можем это

49:47

скопировать сейчас я поясню зачем мы всё

49:49

это

49:50

делаем вставим сюда формат

49:54

обучения

49:59

это кстати абсолютная

50:03

правда так ну и Давайте посмотрим как

50:06

это выглядит Вот то есть есть уже тоже

50:08

базовая вёрстка благодаря тому что мы

50:09

стили описали но теперь мы видим

50:13

очевидную проблему Что кода получается

50:15

довольно-таки много и он дублирует себя

50:18

Потому что Обратите внимание у этого

50:21

списка одинаковая абсолютно

50:24

структура корневой тегли есть параграф

50:27

есть тег STR только

50:30

вот данные внутри каждого из этих

50:34

элементов списка они отличаются то есть

50:36

на самом деле вот это вот чистый

50:38

компонент Да который мы как раз-таки

50:40

можем вынести и сделать его

50:42

универсальным для того чтобы сократить и

50:44

упростить нам работу а я создам

50:47

отдельную функцию которую назову

50:49

например Way To

50:53

teach у нас будет функция и здесь Я буду

50:56

что-то возвращать в круглых скобках

50:58

давайте мы возьмём тут структуру

51:00

скопирую и вставлю

51:03

сюда и мы уже знаем что теперь вместо

51:07

того чтобы описывать вообще

51:09

а каждый компонент мы можем превратить

51:13

наш компонент именно в ТГ да то есть

51:15

ставить его например три

51:17

раза если мы сейчас посмотрим то мы

51:20

получаем уже три компонента всё клёво

51:22

работает с точки зрения вёрстки Вот

51:24

только

51:26

одна и таже потому что мы пока е не

51:27

передавали дополнительных параметров Ну

51:30

и никак их не обрабатываем поэтому здесь

51:32

выводится статика на самом деле для того

51:35

чтобы нам взять данные Я подготовил этот

51:38

файл dats и здесь видите есть

51:41

именованный экспорт константы вот как

51:44

раз-таки ну это массив Да который

51:47

содержит в себе объекты у него два

51:50

свойст ко мы толь чтоли

51:54

и их немножечко больше Поэтому Давайте

51:57

просто мы возьмём этот массив

51:59

импортируем сейчас

52:01

ВТО

52:05

GSX импортируем что-то из Data и нас

52:09

интересует W то есть опять же Это просто

52:12

массив И

52:14

теперь как мы передаём параметры в

52:17

компонент на самом деле мы просто

52:19

придумываем какое-то название как будто

52:21

бы это атрибут Ну непосредственно для

52:23

этого тега только

52:25

комн на Ну например

52:29

и давайте пока временно со статикой

52:31

поработаем потом перейдём уже к дате

52:33

например напишу

52:35

11 и дальше передам Деп вот эти вот

52:39

названия я сам придумываю

52:41

сейчас Деп будет 222 Ну например в таком

52:45

формате А здесь давайте так вот сделаем

52:48

чтобы нам просто было проще это

52:50

вть есть я переда

52:54

эмет

52:55

в обк который называется опять же

52:58

технически Вы можете называть эту штуку

53:01

как угодно Хоть даже таким образом

53:03

просто это прям конкретное название из

53:06

самого реакта которые постоянно

53:07

используется поэтому Ну обычно вы

53:10

увидите вот такую запись это у нас

53:12

Объект который содержит в себе вот эти

53:14

вот ключи tle и des в этом мы можем

53:18

очень легко убедиться

53:24

вы рас прилетает объект А title

53:27

description ну и второй раз вызывается

53:30

уже с другим параметром соответственно

53:34

если например я здесь передам ещё

53:37

что-нибудь там скажем тест и например 42

53:41

то в первом концу и логе одну лю

53:44

страницу видите Мы также ещё получаем

53:46

здесь тест и Обратите внимание что оно

53:49

уже интерпретируется именно Как число да

53:51

то есть это вот к вопросу о передаче

53:52

параметрах в данном же случае это просто

53:54

строчки

53:56

вот естественно нам здесь тест не нужен

53:58

Но в любом случае вот мы уже можем как

54:00

бы получать эти пропсы то есть

54:03

сокращённо от

54:06

свойства и теперь мы можем их вывести то

54:08

есть вместо теперь этого статики я

54:11

выведу здесь props title а вместо этого

54:15

текста я выведу props то

54:20

description и теперь если мы посмотрим

54:23

мы получаем

54:25

динамический контент для данной страницы

54:28

то есть примерно Вот такая логика Как

54:30

это работает Давайте теперь выведем все

54:33

элементы из

54:34

массива их кстати четыре штуки 1 2 3 4

54:39

да то есть Четыре элемента должно

54:41

быть теперь вместо вот этой вот строчки

54:45

мы сюда выводим дата Обращаемся к

54:47

первому массиву то есть по нулевому

54:49

индексу Ну и точка tle здесь мы будем

54:54

выводить

54:57

description Ну и теперь мы можем просто

55:00

взять это и

55:00

[музыка]

55:05

продублировать только здесь мы меняем

55:07

индекс на

55:08

первый и у нас ещё есть два элемента

55:11

поэтому их тоже добавим то есть меняем

55:13

только

55:14

индексы дата 2 и дата

55:20

3 Так здесь у нас есть ошибка по той

55:22

причине что у нас называется не а Да

55:26

нужно было быть внимательнее

55:31

мне так сохраню обновлю страницу ошибок

55:35

больше нет и смотрите у нас получается

55:38

уже красивая вёрстка с необходимой

55:41

информацией и при этом мы знаем что

55:43

именно внутри самого реакта мы сделали

55:45

Всё это динамически то есть выглядит это

55:47

довольно-таки круто Однако здесь я хочу

55:49

обратить Ваше внимание что мы сейчас

55:52

довольно-таки много дублируем кода а то

55:56

есть Tile там tle дублируется

55:58

description и на самом деле есть Для

56:01

таких случаев более удобный способ

56:03

смотрите Да потому что в массиве Ways У

56:06

нас есть ключ title и description и

56:08

компонент Как раз-таки принимает title и

56:10

description то есть для того чтобы

56:12

упростить нам код мы можем вместо этого

56:14

написать таким образом здесь мы вводим

56:17

как бы динамику сами по себе и дальше с

56:19

помощью оператора spread мы Обращаемся к

56:22

waye Ну и в общем к

56:25

тому объекту который мы как бы хотим

56:27

развернуть и передать эти параметры

56:29

Теперь

56:32

смотрите я просто возьму

56:37

продублируйте

56:39

я оставлю эту запись но мы также можем

56:42

здесь написать там типа СД

56:45

и нулевой элемент просто вот э Вот

56:48

запись и вот э Вот запись в данном

56:50

случае она идентична мы в этом тоже

56:52

легко можем убедиться если Перезагрузи

56:53

страницу видите в ИО у нас здесь

56:57

выводится и также очень часто в

56:59

приложениях вы встретите следующую

57:01

запись то есть не обязательно обращаться

57:03

непосредственно сразу

57:05

к Мы можем с помощью такого синтаксиса

57:08

Это

57:09

называется как бы мы знаем что мы

57:11

принимаем здесь объект Поэтому мы можем

57:13

обратиться к конкретным полям которые мы

57:15

здесь хотим получить это у нас title

57:23

ИП

57:25

в самом компоненте теперь

57:27

становится более лаконичная и приятная

57:30

если мы посмотрим то как видите Всё у

57:32

нас работает то есть таким образом

57:33

выстраивается именно вот базовое

57:35

взаимодействие компонентов куда мы можем

57:38

передавать параметры на этом этапе

57:40

давайте мы сделаем теперь правильно и я

57:43

создам отдельный файл для этого

57:45

компонента Way To teach то

57:50

GSX сюда я Перенесу весь этот код только

57:54

буду его

57:58

экспортировать и в App Мы просто его

58:04

импортируем Да смотрим всё работает но

58:07

опять же теперь код этого компонента

58:09

находится в отдельном месте

58:12

и мы можем как бы если захотим точечно

58:15

его

58:16

исправлять Теперь давайте разберём

58:18

следующий функционал для этого я добавлю

58:20

немножечко вёрстки в наш главный

58:22

компонент там добавлю отдельный сек

58:24

здесь у меня будет за головок H3 опять

58:27

же я с сайта

58:29

возьму Вот чем Мы отличаемся от других

58:31

текст

58:33

будет и дальше Я хочу здесь показывать

58:37

там несколько блоков но для этого мне

58:40

потребуется такая отдельная кнопка

58:43

которую я хочу использовать дальше в

58:45

нашем проекте и я хочу чтобы это был

58:47

кастомный компонент кам Это значит что

58:50

мы сами его создам и это очень часто

58:53

используемая практика именно в react

58:56

когда мы выносим по сути вот функционал

58:59

для какого-либо компонента например

59:00

кнопочки в отдельный компонент чтобы он

59:03

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

59:05

им было удобно использовать Ани каждый

59:07

раз там прописывают какие-нибудь классы

59:09

функционал и прочее поэтому я создам

59:13

новый файл назову его с большой буквы

59:15

Button GSX если я буду

59:20

экспортировать по

59:22

дефолту функцию

59:25

опять же пишу с большой буквы То есть

59:27

это интерпретирует как именно наша

59:28

кнопочка и дальше я верну buton кстати

59:32

если это всё пишется в одну строчку то

59:34

круглую скоки писать необязательно Ну и

59:36

пока я здесь напишу

59:38

Клик дальше импортируют

59:44

компонент Если вы это слышали то там

59:46

соседи что-то делают наверху В

59:49

воскресенье ь наверно не знаю

59:53

и react здесь я как бы создаю Button

59:57

передаю его в шаблон Да если мы сейчас

59:59

посмотрим то вот у нас кнопочка есть

60:01

супер базовая но во всяком случае если

60:04

мы её опять же

60:12

проинспектируйте

60:14

О'кей А сейчас мы поговорим про

60:17

функционал потому что очевидно что

60:18

кнопочки нужны для того чтобы по ним

60:19

кликать Но мне бы хотелось чтобы она

60:21

была красивая для нашего проекта то есть

60:23

её нужно стилизовать

60:25

и сейчас в нашем проекте стили прописаны

60:28

очень просто они есть только в файле

60:30

index.css Ну я совсем базу написал здесь

60:33

импортируют работа для хедера какие-то

60:37

базовые стили добавил Для мейна Ну и там

60:40

чуть позже Да мы с вами разберём Но для

60:42

кнопочки здесь как бы ничего нет кстати

60:44

как вообще почему работает этот индекс

60:47

CSS потому что в main.js видите мы его

60:51

импортируем отдельно То есть когда

60:52

стартует наш проект мы

60:55

добавляем стили И поэтому они

60:56

считываются то есть мы тоже их как бы

60:58

как JavaScript рассматриваем смотрите

61:01

для того чтобы изолировать стили потому

61:03

что сейчас я буду их писать только для

61:05

компонента buton Я конечно же могу их

61:08

написать в икс CSS но правильно будет

61:12

если я напишу их в отдельном CSS файле

61:15

который предназначен исключительно для

61:17

нужного нам компонента Давайте покажу

61:19

как это делается сполер очень

61:22

просто CSS компонента Ну и здесь буду

61:26

уже описывать стили и дальше в этом

61:29

GSX я должен их

61:33

импортировать Button CSS Потому что если

61:36

я их не импортируют существовать но он

61:39

не будет работать Я думаю что с этим

61:41

понятно теперь в Button CSS я немного

61:45

срю я добавлю уже готовый код но оставлю

61:49

немножечко экран чтобы вы смогли его

61:51

перепечатать по Су задаю кае стилистики

61:55

для класса Button для Хара добавляю и

61:58

видите ещё есть активное состояние

62:01

кнопки То есть если мы добавляем клас

62:03

Active вот очень простые стили с точки

62:06

зрения функционала этого ролика оно нам

62:08

не повлияет но можете просто переписать

62:10

и теперь если мы посмотрим Я обновлю

62:14

страницу то стилей всё ещё нет а потому

62:17

что у нас всё это работает через классы

62:20

класс Мы не добавили для кнопочки то

62:22

есть для этого здесь нам нужно написать

62:25

класс и тут тоже есть следующая

62:28

особенность в реакте которую просто

62:30

нужно запомнить если мы хотим задать

62:32

атрибут CSS атрибут класс то мы

62:36

используем не ключевое слово класс как в

62:38

HTML А мы используем кла name причём

62:41

именно вот в кейсе Ну Дело в том что в

62:45

JavaScript присутствует ключевое слово

62:49

класс и так как здесь мы на самом деле

62:52

находимся не в HTML Мы здесь находимся в

62:55

JavaScript будет коллизия определённая

62:59

Поэтому в GS Мы всегда прописываем

63:02

именно но это тоже самое что и класс да

63:05

то есть сюда мы добавляем

63:07

buton и видите Всё теперь Ну я не скажу

63:11

что это самая красивая кнопка но она во

63:13

всяком случае есть то есть наши стили

63:16

успешно

63:17

сработали дальше

63:20

смотрите следующий такой момент есть

63:22

архитектурный архитектура - это способ

63:24

по сути построение структуры вашего

63:26

проекта чтобы потом было гибко и удобно

63:29

во всём этом

63:30

разбираться будет Неправильно если мы

63:32

будем так вот плодить вот эти вот

63:33

сущности там CSS GSX Представьте Да если

63:37

у нас будет 100 компонентов у каждого

63:38

компонента будет по CSS файлу мы просто

63:41

потеряемся здесь Поэтому правильно будет

63:43

если у нас есть какая-то группа создать

63:46

новую папку Я назову её по имени

63:48

компонента Button и в неё я Перенесу все

63:53

сущности

63:55

так нет здесь наж кнопочку Нет сейчас

63:58

всё вручную сделаю то есть видите теперь

64:00

уже получается у меня отдель папка под

64:03

компонент и Здесь есть всё что ну

64:06

относится непосредственно к нему

64:08

проверяем импорты то есть здесь у нас

64:10

относительный импорт Всё окей и дальше

64:13

ВТО GSX нам также необходимо поправить

64:17

этот импорт то есть Пока У нас компонент

64:19

отсутствует потому что мы перенесли его

64:21

в папку Так что здесь прописываем ещё

64:23

раз ба проверяем Да всё хорошо Супер

64:28

Теперь значит смотрите Мы создали Вот

64:31

эту вот кнопочку но Понятное дело что мы

64:34

не хотим постоянно выводить здесь текст

64:37

клик Ну вот условно я ещё раз выведу

64:39

кнопку она постоянно будет выводиться

64:41

Клик да то есть мы как-то хотим

64:42

кастомизировать вообще вот это вот текст

64:45

который в самой кнопке будет передавать

64:47

её как

64:48

параметр смотрите мы знаем один способ

64:51

Например я могу здесь передать параметр

64:53

текст Ну и там пока временно

64:58

будет А сюда Давайте передадим текст БА

65:02

2 опять же пока Если я обновлю страницу

65:05

ничего не изменилось потому что мы не

65:07

принимаем эти параметры но мы знаем что

65:10

сейчас сюда попадает некоторый текст и

65:12

вот мы его можем вывести то есть мы

65:15

можем спокойно это сделать Как видите

65:16

всё это успешно работает знаем это

65:19

способно иго спосо

65:23

в случае он будет более правильный

65:26

потому

65:27

что для этих параметров мы сюда другой

65:30

функционал будем передавать Я бы хотел

65:32

воспользоваться этим компонентом как

65:33

обычным HTML

65:37

тегом то есть Пусть он будет

65:39

закрывающимся и кнопочку точнее текст

65:42

для этой кнопки передавать между как для

65:45

как и в обычном HTML допустим первая

65:47

кнопка у меня будет

65:53

подход будет ещё две

65:55

кнопки

65:57

доступность и

66:03

концентрация пока мы такой способ не

66:05

разбирали если мы посмотрим то как

66:07

видите сейчас у нас текст отсутствует

66:09

потому что параметр мы не передаём и в

66:12

react Чтобы принять вот этот параметр

66:14

существует специальный прос который

66:16

называется

66:20

Children мы его явно не передаём но в

66:24

действительности Да когда мы передам

66:26

что-то вот внутри этого компонента оно

66:28

попадает ВС

66:30

В данный про если мы сейчас это всё

66:33

выведем то как видите у нас всё это

66:36

успешно получилось то есть это просто

66:38

другой способ передачи этих параметров и

66:41

он нужен для того чтобы ну вот именно

66:43

так описывать сам компонент при этом

66:46

сразу же забегая немного вперёд мы можем

66:48

здесь писа не только просто текст мы

66:52

можем зде

66:53

описывать

66:55

Спан

66:57

передать в спане там будет не знаю

67:00

заголовок H3 какой-нибудь здесь будет Ну

67:04

я сейчас как бы не то пишу что

67:07

соответствует здравой логике создания

67:08

приложений Но это нужно только для

67:10

демонстрации то есть видите более

67:11

сложную структуру какую-то я сюда

67:13

передаю Ну и в теории Вот видите мы

67:15

получаем эту кнопку она абсолютно

67:17

неправильно

67:22

эме успешно также вставляет То есть это

67:25

вот можно использовать мы естественно

67:27

делать так не будем там по-моему у нас

67:30

была доступность пусть она и остаётся а

67:34

подход что ж идём дальше теперь

67:36

поработаем с самой кнопкой потому что

67:38

кнопка которая не умеет обрабатывать

67:41

Клик бесполезная кнопка Значит мы хотим

67:44

сейчас чтобы при клике что-то

67:47

происходило и вот в обычном значит

67:50

JavaScript как мы делаем там мы пишем

67:52

doc

67:59

But потом там L Ну и так далее вы это

68:03

уже Я думаю Знаете в реакте всего этого

68:05

делать не нужно всё намного проще мы

68:08

добавляем специальный как бы атрибут Ну

68:11

в действительности это параметр для вот

68:14

этого компонента встроенного в

68:17

react этоша собы тое

68:20

с

68:22

ви

68:24

ско вообще Т присутствует различных

68:26

событий вариаций того что можно сделать

68:29

Ну по сути вот все события которые есть

68:30

в браузере в

68:32

JavaScript самые базовые который нас

68:35

интересует - это конечно же клик и здесь

68:39

мы можем уже создать какой-либо

68:41

функционал значит для этого я создам

68:44

отдельную функцию Ну вот Обычно она

68:47

называется мы называем handle cck

68:50

естественно называть её Вы можете

68:51

абсолютно как угодно но как бы

68:54

получается такая логика что здесь мы

68:56

добавляем слушатель при клике будет

68:59

выполняться функция которая в общем

69:01

ответственно за выполнение клика здесь

69:04

пока мы напишем cons Log

69:07

допустим Button

69:09

clicked и смотрите очень важный момент

69:12

эту функцию я передаю сюда в onclick но

69:16

не вызываю её это будет не правильно

69:18

потому что она сразу же один раз вызове

69:21

В такой момент и Клик больше работать не

69:23

будет То есть если мы хотим чтобы эта

69:25

функция работала только непосредственно

69:27

в момент клика то мы её передаём как

69:29

референс без

69:31

вызова

69:33

сохраню так и Теперь смотрите я нажимаю

69:36

и Как видите мы получаем действительно

69:38

вот этот вот консоль Лог при нажатии на

69:41

каждую из кнопок это успешно

69:45

работает Ну и уже первый интерактив есть

69:48

Ну как пример я также могу ещё вам

69:50

привести что мы можем добавлять

69:51

множество слушателей там на один из

69:53

элементов

69:56

скажем какой-нибудь возьму on Mouse

69:59

Enter Да например

70:03

handle Mouse

70:08

Enter кстати раз уж я показываю другую

70:10

функцию то мы можем создавать её

70:12

действительно и другим способом как

70:14

стрелочку функцию например в данном

70:16

случае нет никакой разницы только лишь в

70:18

синтаксисе Ну и здесь там напишу

70:20

например

70:22

Log

70:27

entered так

70:30

Смотрим смотрите теперь видите при

70:32

наведении у меня получается вот этот

70:33

enter то есть и вы можете посмотреть там

70:35

поиграться тоже Какие а слушатели

70:38

событий вы бы хотели добавить для

70:40

элементов там типа даблклик там правая

70:43

кнопка и прочее всё это вот работает

70:45

непосредственно с помощью такой логики

70:47

нам это не нужно Ну конкретно вот Mouse

70:50

Enter и так далее Короче я это всё удалю

70:51

а мы пойдём именно с кликом но концепция

70:55

добавления именно слушателей Такова Хотя

70:58

знаете правильно будет отметить

71:02

что есть ещё и другой синтаксис который

71:04

Вы наверняка встретите Мы тоже будем его

71:07

использовать давайте я в общем

71:09

продемонстрирую на примере даблклика

71:11

например

71:13

как это работает то есть мы можем ещё и

71:16

внутреннюю функцию здесь писать не

71:17

отдельно выносить там в константу или

71:19

функцию А как речную использовать таким

71:22

вот образом Sol

71:24

Log

71:26

dou то есть мы её можем так уже здесь

71:29

описать Ну и теперь просто проверим да

71:31

то есть если я два раза кликаю видите

71:33

два раза вызывается клик и потом один

71:35

раз вызывается Double то есть эта штука

71:37

тоже работает ошибки не смотрите Ани от

71:39

прошлого остались вот то есть это ещё

71:41

Илай

71:42

способ работы с функциями Ну и

71:46

естественно последний комментарий в этом

71:48

файле в том что ну точнее на этой теме в

71:51

том что да Безусловно мы находимся в в

71:53

функции сейчас по факту но внутри мы

71:56

создаём другие функции так вот в

71:58

JavaScript это абсолютно нормально и в

72:00

при работе с react вы постоянно будете с

72:02

этим сталкиваться Просто эта функция она

72:05

изолирована областью видимости только

72:06

этой функции и доступна только внутри

72:09

неё теперь говоря о самих кликах и

72:12

функционале смотрите А да Безусловно мы

72:16

сейчас обработали сам Клик Но что я хочу

72:18

сделать с этими кнопками Я хочу чтобы

72:20

это у меня работало как табы То есть я

72:22

нажимал на конкретную кно и у меня

72:25

показывался соответствующий контент Ну

72:27

какой-то

72:28

текст соответственно нам нужно понимать

72:31

а по какой кнопке мы кликали не просто

72:34

вот этот консоль получать а конкретную

72:36

какую-то информацию отсюда доставать и

72:39

правильно это будет сделать именно в App

72:42

GSX потому что здесь мы вызываем этот

72:45

компонент здесь у нас будет храниться

72:47

логика относительно того какой контент

72:49

показывать Потому что сама кнопочка про

72:51

это не знает

72:55

обрабатывать это Клик именно

72:59

в Ну смотрите пока логика такая же то

73:02

есть Я создаю просто обычную функцию там

73:04

назову

73:07

её параметры нам не нужны пока я напишу

73:10

здесь тоже самое то

73:14

есть И вот этот Hand Мы

73:19

[музыка]

73:22

хотим

73:24

значит это мы убираем Да потому что он

73:26

нам здесь не

73:29

нужен и в действительности нам всё равно

73:33

вед нужно как-то обрабатывать вот этот

73:35

вот оклик но мы можем передавать функцию

73:37

как параметр от родительского элемента

73:40

до дочернего в данном случае

73:42

родительским является jsx и отсюда мы

73:46

передадим параметр вот эту функцию и

73:48

пусть она уже

73:49

обрабатывается есть это называтся переда

73:52

имен и Давайте придумаем название для

73:55

этой кнопки ой точнее для этого

73:57

события

73:59

допустим удивитесь но можно его назвать

74:02

оклик опять же это параметр А это

74:05

атрибут который позволяет Добавить

74:08

события то есть вот этот вот онклик вы

74:11

часто увидите именно такое название но

74:13

его можно там назвать о tch например или

74:22

одем что называть этот параметр можно

74:25

абсолютно как угодно и вот мы его

74:27

передаём вот этот параметр как функцию

74:30

как референс в онклик это

74:32

зарезервированное название это название

74:34

мы придумаем самостоятельно Я надеюсь

74:37

это будет понятно но всё-таки я назову

74:39

это

74:40

Оли И сейчас я объясню почему потому что

74:43

это просто интуитивно будет понятно да

74:45

что вот у нас есть кнопка и мы не

74:47

придумываем какой-то сторонний параметр

74:49

со сторонним названием замыслова нет мы

74:51

просто

74:52

пишем и просто это мы знаем что наш

74:54

компонент у которого там своя Логика

74:56

есть и сюда мы уже передаём этот

75:01

Клик всё сохранили Обратите внимание что

75:04

в батоне у нас нет больше никакого

75:06

функционала но при этом если мы

75:08

обновляем страницу мы всё равно получаем

75:10

buton cck пока нам сильно это не помогло

75:13

ещё ну потому что мы не определяли по

75:16

какой кнопке мы кликаем но в любом

75:18

случае знаем что ври мы это

75:22

Поли

75:24

Перед тем как мы пойм

75:26

дальше у кнопочки с точки зрения C есть

75:30

ещ

75:33

класс который вот выглядит Именно таким

75:36

образом вы вот на текущем этапе в

75:38

качестве такой небольшой самостоятельной

75:40

работы можете попробовать добавлять этот

75:42

класс как параметр То есть вы будете

75:45

передавать какой-то параметр из батона и

75:48

случае есно будет

75:52

авре

75:53

пока я оставлю чтобы ну просто

75:55

по-другому как бы выглядел у нас

75:57

экран Окей значит смотрите дальше нам

76:01

нужно понять А по какой кнопке Мы в

76:04

итоге кликаем Потому что сейчас у нас ну

76:06

постоянно один и тот же

76:08

текст оказывается в консоли и для того

76:12

чтобы вот при клике передавать в эту

76:14

функцию параметр который у нам уже будет

76:16

сигнализировать о том куда мы нажимаем

76:18

мы можем сделать следующим образом то

76:20

есть мы знаем что паме

76:23

функцию А что если мы сюда и передадим

76:26

эту функцию таким вот образом вы очень

76:29

часто будете встречать именно такой

76:30

паттерн в реакте да то есть мы формируем

76:35

замыкание в данном случае и здесь уже Мы

76:38

можем вызвать эту функцию с

76:40

фиксированным параметром Давайте

76:42

посмотрим как они называются у нас что

76:44

мы сечас этим

76:45

поработаем E и

76:48

PR знат сюда мы будем

76:52

передавать

76:56

у нас

76:58

будет

77:00

Easy и

77:04

Program Давайте посмотрим работает ли

77:07

это да Видите мы нажимаем и оно всё ещё

77:09

работает но нет этого параметра потому

77:13

что мы его передали в саму функцию но

77:16

никак не обработали то есть здесь я

77:18

назову его например Type и дальше уже

77:20

буду его сюда

77:22

выводить обновляю страницу и видите Да

77:26

теперь кликая по одной из этих кнопок мы

77:29

чётко понимаем какого она была типа

77:31

опять же вы сюда можете передавать любые

77:33

параметры Ну просто для текущей задачи у

77:36

нас здесь была именно строчка это могут

77:38

быть там объекты массивы числа и так

77:43

далее дальше Вот мы получаем уже Тип и

77:47

теперь давайте вот выведем ну

77:48

какой-нибудь контент в зависимости от

77:52

типа кнопки на которые мы нажали для

77:55

этого значит после батонов я добавлю

77:58

параграф п я напишу Нажми на

78:04

кнопку и значит Ну как мы можем сделать

78:09

А давайте подумаем я могу создать

78:10

например какой-нибудь Let Content да

78:13

пусть он будет в

78:15

начале так и называться Нажми на

78:19

кнопку да Опять же мы этот контент можно

78:22

спокойно вывести вот таким вот образом и

78:26

видите у нас всё это успешно работает да

78:28

то есть вот он

78:30

показывается и в случае Например если

78:33

мы кликнули на кнопочку нашу Давайте

78:37

этому контенту мы

78:39

присвоить он выводится то есть мы знаем

78:42

что Тап меняется поэтому поменяли

78:44

контент Ну и всё он будет Значит у нас

78:46

рендерится такой пла нажимаю на

78:49

доступность вот мы получаем здесь а Easy

78:54

там Program Way а кнопочка точнее текст

78:57

не меняется что-то пошло не так и здесь

79:01

мы подошли на самом деле к одной из прям

79:04

ключевых фундаментальных концепций в

79:06

реакте которая называется State и вот в

79:09

чём заключается идея

79:12

react он реактивный ну даже по названию

79:15

Вы можете посуди То есть он

79:18

автоматически следит за каким-то

79:20

изменением которые происходят в коде

79:23

если это как-то влияет на изменение

79:25

шаблона то он берёт и перерисовываю

79:28

конкретное место в шаблоне таким образом

79:31

его

79:32

оптимизируя но что пошло не так потому

79:35

что в целом-то вот мы изменили как бы

79:37

константу точнее переменную а он её

79:40

почему-то не изменил в шаблоне так вот а

79:45

в реакте для того чтобы он понимал Зачем

79:48

нужно следить а зачем не нужно следить

79:51

есть такое понятие как й то есть

79:54

состояние вашего там приложения

79:56

компоненты и так далее

79:58

и мы должны сами вручную сигнализировать

80:02

реакту о том что является стейтон А что

80:05

является Ну просто какой-то статикой и в

80:08

случае если это у нас состояние то тогда

80:11

реакт будет это всё перерисовывать если

80:14

это не состояние то он просто это про

80:17

игнорирует и

80:20

способ с помощью которого мы можем

80:22

создавать это состояние я вам сейчас

80:24

покажу Но прежде давайте мы ещё сделаем

80:27

следующий момент то есть по дебажить

80:28

немножечко здес я напишу а cons Log Up

80:33

допустим Up

80:35

component

80:38

render и Давайте посмотрим когда этот

80:40

рендер вызывается то есть ну рендер -

80:43

это помещение по сути вот этого GSX

80:45

прямо в шаблон я обновляю страницу и

80:47

Видите вот у меня один раз он вызывается

80:50

если я нажимаю на кнопочки кнопочки они

80:52

как бы нажимают

80:54

есть то что я и говорил как ки состояние

80:58

мы не обозначили поэтому ре его и

81:01

игнорирует при этом кстати вот у нас

81:03

есть внутренние компоненты

81:06

скажем Да мы же здесь тоже можем

81:10

написать

81:12

buter видите он три раза у нас как бы

81:15

рендерится

81:18

ного

81:21

проходит react не перерисовываю э всю

81:24

историю она статическая остаётся сейчас

81:26

так что теперь поговорим про то как мы

81:29

правильно работаем со стей в

81:31

реакте для этого я

81:37

импортируют и это что-то называется

81:42

use State значит US State - это функция

81:47

и она начинается со специального такого

81:49

префикса use что сигнализирует нам о том

81:52

что это

81:54

к с помощью которого мы можем создавать

81:57

локальное состояние для

81:59

компонента Сейчас я вам покажу как это

82:01

работает

82:03

значит в самом App компоненте мы

82:06

вызываем эту функцию use State

82:10

и здесь на самом деле не принципиально

82:12

что мы получим из этого тейта ну в том

82:15

плане это будет констант или LED Мы

82:18

всегда получаем один и тот же

82:20

формат допустим State

82:23

я его назову это у нас всегда будет

82:25

некоторый массив значит Перед тем как мы

82:28

будем разбирать что это такое Как это

82:29

работает сразу же несколько обязательных

82:33

правил по использованию вот

82:35

этого стейта ну и вообще хуков в реакте

82:39

Первое правило нельзя писать их вне

82:43

компонента Вот например как здесь это

82:45

будет ошибкой то есть мы используем вот

82:47

эти вот хуки в данном случае только

82:51

внутри опонента либо другого хука но

82:54

опять же пока не берите в голову Просто

82:57

дело в том что мы можем самостоятельно

82:58

создавать некоторые хуки про это мы вот

83:01

подробно рассказываем там уже в большом

83:03

курсе да где не для начинающих потому

83:05

что это более-менее продвинутая тема но

83:08

опять же То есть сейчас что вам нужно

83:11

запомнить usate мы используем а внутри

83:15

компоненты и он всегда должен находиться

83:18

на Верхнем уровне то есть ну нельзя

83:21

скажем написать там типа If 1 1 ра 2

83:26

неважно И какой-то да и вот если так то

83:28

тогда мы создадим стоит ошибка Нельзя

83:31

так делать никаких иов То есть если мы

83:33

используем вот эти вот й то только на

83:37

Верхнем уровне теперь что касается вот

83:41

этого State Давайте пока для начала сюда

83:43

я передам

83:44

42 ладно не 42 пусть будет будет текст

83:47

Нажми на ноп и Давайте посмотрим что

83:51

есть

83:55

если мы Ну посмотрим в консоли то мы

83:58

видим что нулевой элемент Ну по первому

84:00

индексу это у нас как раз таки то

84:02

состояние начальное которое мы передали

84:05

Нажми на кнопку а второй элемент - это

84:06

функция и действительно то есть вот то

84:09

что попадает в нулевой элемент только

84:12

как бы это значение присвоения только

84:14

уже в формате стейта а второй Эмен это

84:18

функция позволяющая изменять

84:21

это

84:23

по факту мы можем вот так вот

84:26

написать

84:30

равно нулевой

84:33

индекс и

84:35

дальше а ви тут коллизия есть небольшая

84:38

давайте это контент я закомментировать

84:52

й контент и дальше мы добавляем Set это

84:55

не обязательно но это вот та практика

84:57

которая используется вообще во всех

84:59

приложениях с любым гадом Поэтому просто

85:03

запомните потому что это как раз-таки

85:05

метод позволяющий

85:09

изменить Конкретно этот й Но каждый раз

85:13

если мы прописывали вот всё для й таким

85:16

образом Было бы очень неудобно поэтому

85:19

мы можем воспользоваться синтаксисом

85:21

JavaScript и сделать деструктуризация

85:23

самого вот этого вот массива State array

85:26

Мы всегда знаем что первый

85:28

элемент это само значение которое мы

85:31

сможем использовать а второй элемент -

85:33

это функция позволяющая изменять это

85:35

значение Set Content всё И теперь вот от

85:39

трёх строчек Мы пришли к одной строчке и

85:42

именно вот такую запись вы постоянно

85:44

будете видеть А вот это вот состояние

85:46

это начальное состояние А вот это вот Ну

85:50

в данном случае контент который мы

85:51

назвали

85:54

Ну теперь что мы можем здесь вывести

85:57

контент посмотреть что оно

86:00

показывает Нажмите на кнопку чётенько

86:04

работает и теперь в теории смотрите Так

86:07

у нас есть эта функция Если при клике на

86:10

кнопку мы вызовем этот Set контент и

86:15

сюда передадим Type да то есть мы не

86:17

напрямую пишем опять же Обратите

86:19

внимание это очень важно не напрямую

86:20

пишем Котен рано это Не сработает потому

86:24

что для правильного изменения стейта нам

86:26

нужно пользоваться вот этой вот функцией

86:28

Только таким образом react поймёт что

86:30

ага что-то изменилось и поэтому мне

86:32

нужно это отрендерить

86:35

обновляем страницу вот смотрите сейчас у

86:38

нас есть component render один раз три

86:40

раза кнопки потому что у нас три кнопки

86:43

и дальше я нажимаю например на

86:45

концентрацию смотрим Что произошло

86:48

произошло следующее мы кликнули на

86:51

кнопку дальше снова вызвался рендер Up

86:54

компонента потому что мы изменили

86:56

состояние в этом компоненте и за счёт

86:59

этого он перерисовал нам контент потому

87:02

что мы Его изменили Ну а кнопки они

87:05

снова рендерится потому что рендерится

87:07

весь а компонент Ну Поэтому нужно и

87:10

кнопочки отрендерить и теперь видите мы

87:13

получили первую динамику с первым

87:15

состоянием нажимая на эти кнопке

87:16

по-моему очень круто то есть с этим

87:19

дальше уже можно идти и работать на этом

87:21

этапе я предлагаю избавиться сейчас от

87:24

этих всех консоль логов потому что они

87:25

нас заспамить ти вот всякие клики там

87:28

батоны то есть ну будем без них короче

87:31

работать Всё видите сейчас трушно

87:34

никаких консолей нет И теперь так как в

87:38

дате У меня есть объект

87:42

differences Это наше отличие в

87:45

университете от других университетов Ну

87:49

нативная реклама вы понимаете это очень

87:51

важно что там ещё ссылка в описании

87:53

ладно суть не в этом да то есть есть

87:55

объект differences и видите у него

87:58

совпадают ключи с типом Да который мы

88:02

прописали для кнопочек То есть я сейчас

88:04

хочу выводить уже не сам тип Я хочу

88:06

выводить

88:07

э контент который есть в этом

88:11

объекте вначале я его

88:16

подключу так знаете проще сделать

88:21

копировать и здесь вместо контента мы

88:25

выводим differences и сюда

88:28

передаём

88:31

контент обновляю страницу видите по

88:34

умолчанию ничего нет Кстати что

88:37

интересно но если я нажимаю на кнопочку

88:39

вот у нас эти табы видите успешно

88:42

отрабатывают и показывают разный контент

88:44

то есть ну довольно-таки просто

88:46

получилось Перед тем как мы двинемся

88:48

дальше я бы хотел ещё кое-что

88:49

прокомментировать значит смотрите это

88:52

тоже очень важный момент есть рано Я

88:55

избавлюсь от консоль логов Но это важно

88:58

тоже

88:58

пояснить а render в общем здесь

89:02

Да так это нам не

89:06

нужно что я хочу вот мы вызвали Клик по

89:08

кнопке Да изменили контент Давайте здесь

89:11

мы посмотрим на то что такое

89:16

контент мы вот изменили его и сразу же

89:19

выводим в консоль то есть вот происходит

89:21

у нас анр я нажимаю здесь допустим на

89:24

доступность и Давайте изучать то есть мы

89:28

здесь дальше вывели Нажми на кнопку и

89:31

после этого произошёл анр Окей давайте

89:34

нажмём на

89:37

подход видите теперь получается Easy Up

89:40

render А если снова на доступность

89:43

короче здесь я думаю вы видите следующую

89:46

картину что при

89:49

нажатии на самом деле Несмотря на то что

89:51

изменили этот контент здесь в консоль

89:54

логе показывается предыдущее

89:57

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

90:00

изменяем й он будет изменён вот в самом

90:04

вот этом состоянии только При следующем

90:06

рендере А поэтому сейчас вот ну бывают

90:11

такие ошибки Да у начинающих которые

90:13

работают с react что вот они сделали

90:14

типа са контент и хотят работать с новым

90:16

значением так вот нет пока не произойдёт

90:18

заново рендер инициализация там вот этой

90:21

вот строчки и прочее а тогда состояние

90:24

не изменится поэтому тоже имейте это в

90:26

виду Всё я рад что я это пояснил потому

90:28

что это важная история

90:30

была и А сейчас хочу немножечко

90:34

попрактиковаться смотрите было бы вообще

90:36

круто да если бы у нас время вот оно Ну

90:39

само менялось В общем мы уже знаем как

90:41

динамику выводить правильно поэтому вы

90:44

можете попробовать это сделать Я

90:46

буквально секунду ещё подожду и покажу в

90:48

общем-то вместе с вами как это можно

90:50

реализовать

90:52

Надеюсь вы

90:53

успели значит самостоятельная Практика -

90:56

это то что позволяет вам становиться

90:58

программистом на самом деле И вот

91:00

смотрите да то есть как мы можем вот

91:02

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

91:06

это

91:07

работало в первую очередь мы должны

91:10

импортировать use ой Видите сколько я

91:13

спойлеров вам сейчас кидаю сколько на

91:14

самом деле этих хуков есть в реакте но

91:17

пока мы работаем с м дальше Да вот мы

91:20

забираем некоторые значения

91:26

по умолчанию здесь будет да значение эту

91:29

штуку мы

91:30

удаляем вообще можно выпилить её и

91:33

дальше

91:37

интервал здесь мы будем каждую секунду

91:39

её

91:42

выводить так и здесь мы делаем просто

91:50

се на текущую дату и

91:54

время и теперь так как это у нас йт

91:57

видите мы больше ничего особо здесь не

92:00

делаем у нас пошли часики то есть Так

92:03

это и работает да если мы посмотрим

92:05

кстати

92:08

то видите Спан постоянно у нас

92:10

рендерится но только Спан то есть имидж

92:13

там сам хедер не трогаются потому что ре

92:16

умный за счёт этого идт большая

92:17

оптимизация скорости его работы что он

92:19

видит что состояние которое изменилось

92:22

оно аффектив то есть влияет только на

92:24

этот Спан поэтому он вместо того чтобы

92:26

перерисовывать там весь этот блок он

92:28

перерисовываю только нужные нам Спан и

92:30

но это не занимает так много ресурсов

92:32

вот а супер Давайте пойдём дальше

92:35

поработаем с кнопочками Потому что

92:37

сейчас всё ещё это выглядит Ну

92:39

немножечко не до конца рабочей историей

92:42

так как ну вот например по умолчанию у

92:44

нас не показывается никакого контента

92:50

да

92:52

Почему не показывается потому что в App

92:55

по умолчанию здесь написано Нажми на

92:57

кнопку но мы забираем ключ у объекта нет

93:01

такого ключа у объекта поэтому он нам

93:03

ничего и не

93:04

выводит и поэтому Как мы можем решить

93:07

Данное состояние в действительности мы

93:10

можем не указывать здесь строчку мы

93:12

можем начальным состоянием этот

93:14

контент Давайте кстати тоже чтобы

93:18

правильно было чтобы вы привыкали это у

93:19

нас будет всё-таки Котен Type Да а не

93:22

сам

93:23

контент тоже здесь напишем Set Content

93:27

Type Set Content Type потому что мы

93:30

всё-таки с типом здесь работаем И это

93:32

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

93:34

кода

93:36

А мы можем проверить если у нас в

93:39

контент тайпе Ну вот по умолчанию Да

93:40

null стоит нет ничего то тогда нам нужно

93:43

вывести там вот эту строчку по умолчанию

93:46

И для этого есть как бы вот условные

93:48

операторы которые мы можем использовать

93:49

Давайте покажу как это работает то есть

93:52

в первую очередь мы можем написать

93:54

тернарное

93:56

выражение Например если Content

93:59

ty в нём что-то есть то тогда мы будем

94:04

показывать вот этот параграф а иначе Ну

94:08

давайте для разнообразия здесь покажем

94:10

Спан где будет

94:13

написано Нажми

94:16

на

94:19

кнопку такт у нас Находи и примерно

94:23

одинаково будет выглядеть то есть вот в

94:26

принципе как в обычном JavaScript мы

94:28

можем выводить условные операторы там

94:29

через тернарные Так давайте посмотрим

94:32

видите у нас появляется здесь Нажми на

94:33

кнопку Вот Но при этом если мы нажимаем

94:36

на подходы то всё успешно

94:41

отрабатывает всё-таки нужно параграф P

94:43

делать чтобы по стилистике совпадала Но

94:45

почему я менял г потому что хотел

94:48

показать что Вы можете абсолютно разный

94:50

контент сюда влять и в целом это не

94:52

принципиально это как бы вот первый

94:54

вариант я вам покажу несколько вариаций

94:56

просто чтобы вы примерно к ним привыкали

94:58

и запоминали

95:00

А например сейчас

95:02

вместо М давайте вот так вот вообще

95:06

напишем с нуля то есть по-другому да

95:08

терник можно использовать скажем если не

95:11

Котен

95:12

Type тогда мы будем показывать скажем

95:15

вот этот вот параграф типа Нажми на

95:17

кнопку а иначе Нам ничего вообще не

95:19

нужно выводить например мы можем здесь

95:21

указать Ну когда мы передам ну в GSX то

95:25

это означает что он просто ничего не

95:27

будет выводить но при этом если Котен

95:30

Type есть то мы будем выводить уже вот

95:32

этот

95:34

параграф а иначе ну ой случайно сафри

95:40

включил смотрите обновляю страницу Да у

95:43

нас сейчас дублируется потому что вот

95:46

эту штуку я

95:50

заком

95:52

Нажми на кнопку нажимаем в бы

95:55

отрабатывает то есть ну по сути Это

95:57

тотже самый подход Вот но в целом хотел

96:00

пример с лом показать значит но есть ещё

96:04

более краткая запись на самом деле

96:05

которую чаще вы встретите в

96:09

react значит если не Котен typ то тогда

96:14

мы используем имы показываем какой-то

96:20

контент

96:21

а если

96:25

ty то тогда мы показываем

96:29

уже параграф с необходимым контентом

96:33

обновляю страницу видите всё тоже

96:36

самое это на самом деле один из способов

96:40

работы там в JavaScript То есть если

96:42

выражение слева оно принимает значение

96:45

True то тогда мы будем тоже это

96:47

отображать Но если это будет то тогда мы

96:51

будем здесь выводить то есть оно не

96:52

выполнится это как бы особенность

96:54

синтаксиса именно JS это вот ещ один

96:57

способ который вы наиболее часто Я думаю

96:58

увидите при работе с

97:00

react но также есть ещё один

97:05

способ Давайте мы его назовём как T

97:09

Content Что такое T кон это то что мы

97:12

сами создадим где-нибудь

97:17

здесь полни

97:20

будет и дальше мы можем

97:23

спросить

97:28

если Content Type Ну в нём вообще

97:32

что-либо есть тогда в Tab Content мы

97:37

добавляем

97:40

GSX А если там ничего

97:43

нет

97:45

то в Tab Content мы

97:48

добавляем Ну контент какой-нибудь там

97:51

для отсутствующего

97:53

материала то есть мы спокойно на самом

97:55

деле можем GSX здесь использовать там

97:58

складывать его в какие-то переменные и

98:01

так далее да если мы посмотрим то есть

98:03

сюда мы уже отдельно выводим какой-то

98:04

шаблон то всё равно функционал остаётся

98:08

тот же самым Вот Но эти все способы

98:11

часто используются в react вы обратите

98:13

на них внимание Поиграйте с этим я же

98:16

для нашего приложения сейчас пойду вот с

98:18

этим так как это наиболее кратко и

98:20

понятная

98:24

запись это нам всё не нужно

98:26

закомментировать для того чтобы Вы могли

98:27

в дальнейшем это

98:29

использовать Так что нам ещё нужно

98:32

сделать для этого приложения в базе

98:35

смотрите у нас пока все кнопки активные

98:37

хочется как бы вот понимать на какой

98:39

кнопке мы находимся Помните я короче

98:41

давал эту задачу Поэтому в первую

98:43

очередь мы для Баттона сделаем ещё один

98:48

параметр Я назову его из Active

98:51

это у нас будет либо True либо

98:54

false и

98:58

дальше мы в зависимости от этого должны

99:01

добавить что-то Ну как бы либо добавить

99:04

класс Active либо

99:06

нет На самом деле делается довольно

99:08

просто существует естественно несколько

99:12

способов всё что вам нужно понимать Это

99:14

просто обычный If То есть если это True

99:18

мы добавляем один набор классов если это

99:19

fse мы добавляем другой набор классов

99:21

классы - это просто строчки то есть

99:23

здесь можем написать если из Active мы

99:25

добавляем такие классы Button и Active а

99:29

иначе

99:30

просто

99:32

Button вот в принципе так можно было

99:34

решить эту задачу ну и теперь

99:36

естественно о только нужно передать этот

99:38

параметр из Active равно как нам это

99:41

Определить если Content Type равняется

99:47

Way

99:50

копирую

99:52

добавляю для каждого элемента и меняю

99:54

только вот эти

99:56

вот значения всё то есть ну по какой

100:00

кнопочки кликнули Да мы перенесли это

100:02

получается в State Content Type Ну и

100:05

дальше сравниваем что если вот на

100:06

текущем этапе рендера он равняется этой

100:08

строчке тогда мы показываем активный

100:10

класс видите по умолчанию обновлю

100:12

страницу видите по умолчанию как бы

100:16

нет ну не выбрана никакая кнопочка

100:19

Однако если я кликаю на доступность ВС

100:21

доступность активная концентрация подход

100:25

кайфово мне вот вообще очень нравится на

100:27

самом деле

100:28

сейчас покажу ещё один способ создания

100:31

вот этих вот классов То есть можно

100:33

создать какую-нибудь переменную L cles

100:37

мы знаем что для каждой кнопки в любом

100:39

случае будет клас Button и дальше Мы

100:43

можем с помощью обычного Иа спросить

100:45

если из AC то тогда в мы добавляем

100:48

строчку AC Обратите внимание на этот

100:52

пробел Ну потому что если я его не

100:54

напишу С контини просто со строчкой

100:57

Button и такого класса у нас нет то есть

101:00

можно и так вот сделать это я вырежу и

101:03

сюда Я добавляю

101:04

classes функционал

101:07

будет не такой же как и до

101:10

этого

101:13

Почему Потому что здесь я написал равно

101:16

А нужно написать было плюс равно чтобы

101:18

произошла конкатенация обно

101:21

доно концентрация Выбирайте любой способ

101:24

который вам

101:25

подходит я оставлю здесь следующий Как

101:29

по мне в данном случае более интуитивно

101:30

понятный Ну меньше требует опять же там

101:32

строчек кода и

101:34

прочего Так что я вам хочу следующем

101:38

рассказать на самом деле вот у нас сайт

101:40

довольно-таки неплохой получается уже но

101:43

присутствует вот э вот конструкци

101:46

которая

101:47

см

101:49

с вот смотрите у нас есть четыре

101:53

элемента которые мы вручную как бы

101:55

каждый индекс прописываем и представьте

101:58

вот если я допустим добавлю какой-нибудь

101:59

там ещё Да а подход к обучению вот в

102:03

этой дате То есть у нас будет там новый

102:06

title и новый description Ну давайте

102:09

собственно это и

102:11

сделаем какой-нибудь там про Наставников

102:17

расскажем наши наставники

102:22

клёвые Кстати у нас ребята midle плюс

102:25

уровня по факту вообще всё обучение в

102:28

реу это именно такое менторство от более

102:31

опытных специалистов это абсолютная

102:33

Правда Мы очень ну как бы это вообще 70%

102:36

программы

102:37

непосредственно опять нативная

102:39

интеграция друзья мои Короче мы добавили

102:41

новый элемент в массив Ну и естественно

102:44

мы ожидаем что он добавится сюда но нет

102:47

да потому что вручную надо прописывать

102:49

то есть что мы делаем

102:52

копируем элемент добавляем сюда ещё один

102:54

индекс Ну и вот оно уже получается В

102:56

итоге конечно Это неправильно делать

102:59

потому что ну вручную слишком долго не

103:02

гибко не

103:08

масштабируемость итерацию вот этого вот

103:10

массива чтобы в автоматическом режиме

103:12

выводить все эти элементы я это Т заменю

103:16

и смотрите временно покажу

103:19

вот

103:21

если мы выводим

103:24

массив такой вот например

103:26

то видите мы получаем просто строчку 1 2

103:30

3 4 Да Посмотрите элементы вот вот у нас

103:33

как бы весь этот массив он не массив а

103:35

просто в строчки превратился То есть

103:38

если дальше масштабировать эту историю

103:41

то в вопервых здесь мы работаем с

103:45

массивом то есть вме этих число написать

103:47

Сразу

103:49

же в JavaScript присутствует метод Map

103:52

позволяющий преобразовать его в другой

103:57

массив вызываю

103:59

его и здесь на каждой итерации я получу

104:03

какой-то Way и

104:08

преобразуют Way To

104:10

teach куда я уже передам вот этот Way

104:15

потому что на каждой итерации он будет

104:16

соответствовать новому

104:18

индексу Если я сохраню такую

104:23

запись и обновлю

104:26

страницу то как видите всё уже у нас всё

104:29

отлично работает а все элементы

104:32

выводятся и мы знаем что внутри вот у

104:35

нас прописана такая строчка кода опять

104:38

же здесь хотелось бы немного уточнить Да

104:40

что мы используем обычную стрелочку

104:42

функцию естественно Мы можем поставить

104:44

фигурные скобочки и написать Return да

104:47

то есть это одно и то же Мы обязаны

104:49

что-то вернуть в методе Map ну точнее во

104:51

внутренней функции Видите вот то же

104:52

самое получается

104:55

но так как синтаксис позволяет Если

104:59

возвращаемое значение пишется в одну

105:01

строчку то мы можем сразу же так вот

105:03

написать Окей

105:06

и сейчас у нас есть ошибка Вот она

105:10

Давайте в консоли на неё посмотрим

105:12

ошибка говорит

105:14

следующее каждый Чад в списке должен

105:18

содержать себе уникальное значение

105:22

я не буду сейчас даваться в сильные

105:24

подробности почему это так работает

105:26

вероятно я об этом курсе расскажу или Мы

105:29

точно рассказываем про это в деталях на

105:31

Большом курсе по react но смысл в том

105:35

что если происходит итерация

105:37

то нам нужно добавить такой невидимый

105:40

как бы

105:41

параметр который всегда должен содержать

105:44

себе уникальное

105:46

значение и в нашем случае уникальным

105:48

значением будет title например на самом

105:51

деле

105:52

description но вот сейчас я укажу так

105:55

видите функционал не изменился и при

105:58

этом ошибка тоже ушла Хотя если мы

106:00

посмотрим на этот элемент то мы видим

106:03

что никакого параметра ки нет потому что

106:05

этот параметр он нужен для внутренней

106:09

работы реакта благодаря ему он правильно

106:11

Может трекать где находятся элементы и в

106:14

случае если мы например изменяем массив

106:16

А это очень частая задача то react не

106:18

столкнётся с никакими сложностями и у

106:20

него это легко

106:23

получится Теперь смотрите Мы это

106:26

можем удалить и ну Остальные комментарии

106:32

сами Удалите на текущем этапе получается

106:34

мы разобрали вот эти вот базовые основы

106:37

поработали со списками с активными

106:39

состояниями с условными

106:41

м операторами и написали уже какое-то

106:45

первое более-менее осмысленное

106:46

приложение Окей с базовой частью курса

106:49

мы завершили но при этом курс ещ не

106:50

заканчивается Я думаю вы видите по

106:52

таймингу мы переходим к более

106:54

продвинутой его составляющей и Первое

106:57

что я хочу здесь сделать это безусловно

106:59

удалить комментарии чтобы наш код был

107:01

чистый красивый не было ничего лишнего

107:04

Ну и мы могли уже

107:06

разрабатывать приложение

107:08

дальше всё вроде почистил остальное

107:11

берём в процессе в первой очередь я хочу

107:15

с вами поговорить вот о чём мы написали

107:17

сейчас уже ну более-менее полноценный

107:20

сайт однако я считаю что Тема с

107:24

декомпозиции на компоненты она ещё не

107:26

разобрана потому что вот если мы зайдём

107:28

в наш главный компонент App и посмотрим

107:31

на его структуру то явно виден хедер

107:34

явно видна секция Main Но дальше

107:38

присутствуют вот эти вот секшен Как

107:41

видите Они похожи друг на друга и они

107:44

занимает довольно-таки много

107:45

пространства то есть в целом каждый из

107:48

секв он содержит себе какую

107:52

и Почему бы нам по правильному вообще не

107:54

декомпозировать также это на компоненты

107:56

и не вынести их Давайте посмотрим как

107:59

это будет выглядеть и как наш код будет

108:02

смотреться уже после такого

108:04

рефакторинга значит я создам новый файл

108:07

который будет объединять себе Вот этот

108:10

наш подход к обучению назову я его

108:16

teaching что

108:19

покам так

108:22

как мы делаем код более

108:27

понятным так

108:30

teaching

108:33

section то чем мы с вами сейчас будем

108:35

заниматься называется рефакторинг то

108:38

есть по сути У нас есть какая-то основа

108:40

кодовая и мы берём и уже разрабатываем

108:44

так чтобы его улучшить значит здесь я

108:47

делаю Return и просто беру и выношу

108:51

всё что относится к этой секции значит

108:54

смотрите когда я сохраню естественно это

108:56

не будет работать по той причини что

108:58

здесь отсутствует в файле компонент Way

109:01

To teach и также здесь отсутствует

109:04

Константа Ways соответственно Нам

109:07

необходимо их импортировать М давайте

109:10

скопирую

109:13

дату differen нам здесь не нужны и

109:16

единственное что так как этот компонент

109:18

находится в папочке components то нам

109:20

необходимо подняться на верхний уровень

109:22

для того чтобы перейти уже в дату да то

109:24

есть это первая часть рефакторинга здесь

109:27

соответственно нам больше не нужны и мы

109:30

можем вырезать этот

109:33

компонент вставить сюда только опять же

109:35

здесь мы немного правим путь потому что

109:37

он лежит уже рядышком с этим компонентом

109:40

Так теперь значит сюда мы

109:43

вставляем

109:46

te по какой-то причине он у нас не имр

109:50

поэтому импортируем его вручную А

109:53

From components и teaching section так и

109:58

Давайте

110:00

посмотрим всё ли у нас хорошо Как видите

110:02

Да ничего не сломалось То есть это была

110:04

первая часть рефакторинга неплохо А

110:07

кстати Вы можете поставить сейчас видео

110:09

на паузу и попробовать сделать то же

110:11

самое с этим секшен тут будет чуть

110:13

сложнее но Попробуйте Я думаю это

110:15

хорошая практика дал буквально секунду

110:19

погнали покажу как это делается значит

110:22

создаём следующий файл Пусть он будет у

110:24

меня называться

110:29

differences section jsx мы экспортируем

110:33

здесь по дефолту

110:36

функцию differences

110:40

section так и здесь мы возвращаем

110:43

некоторый GSX который

110:46

вырезаем абсолютно смело

110:49

отсюда

110:51

вставляем сюда и здесь мы добавляем

110:54

компонент почему-то не импортируется

110:57

автоматически

111:05

О сейчас если мы посмотрим то по идее

111:08

код не должен

111:11

работать так как у нас есть

111:16

ошибки

111:18

изго компонент здесь отсутствуют нужные

111:22

нам импорты Ну и как следствие ещ

111:24

какой-то функционал с кликом и так далее

111:28

первое что мы можем сделать мы можем

111:29

естественно

111:31

импортировать бан

111:33

из

111:35

buton

111:38

Button отсюда мы можем его убрать дальше

111:42

смотрите у нас есть уже какой-то йт

111:45

который в А компоненте сейчас не

111:47

используется Да потому что он

111:48

соответствует локальному

111:50

в differences section поэтому я беру

111:53

также это всё вырезаю

111:56

отсюда Вставляю сюда и нам остаётся по

112:00

сути только импортировать отдельно здесь

112:02

ещё US State То есть я тоже отсюда это

112:05

вырезаю сюда Вставляю

112:10

и также если мы посмотрим здесь мы

112:13

используем обк differences то есть Нам

112:16

тоже здесь потребуется поэтому его Я

112:17

тоже вырезаю и Вставляю в наш компонент

112:21

только правлю

112:22

путь Супер Теперь если мы посмотрим на

112:25

наш а компонент то как видите здесь у

112:28

нас присутствует чёткая и понятная

112:31

структура того что происходит на сайте и

112:33

очень легко теперь ориентироваться Что

112:35

относится Там к обучению Что относится к

112:38

отличиям от конкурентов и так далее И

112:40

этим сайтом намного проще и удобнее

112:43

управлять Однако Я бы хотел ну уже как

112:46

следующая тема сакцентировать внимание

112:48

Вот на чём значит на страниц всё

112:50

нормально проверяем видите кликается Всё

112:53

круто Давайте

112:57

проинспектируйте

113:00

значит вот сюда перейду есть Бади есть

113:04

вот этот вот ди с ID Root и дальше если

113:07

мы посмотрим то дальше присутствует ещё

113:09

один ди И на самом деле он абсолютно

113:12

бесполезный и бессмысленный потому что у

113:15

него нет никаких

113:17

стилей он ничего не делает нет никаких

113:20

классов вообще идеи никакой за ним нет

113:22

но при этом он присутствует Почему а

113:26

потому что в А компоненте мы всё

113:28

обернули в div и Казалось бы ну раз он

113:32

не нужен то почему бы его просто не

113:34

удалить вот таким вот образом сохранить

113:37

и тут начинаются ошибки если мы на них

113:40

посмотрим то тут очень много какого-то

113:42

Лога

113:44

непонятного да И честно

113:46

[музыка]

113:48

говоря

113:50

Нет вс-таки есть адекватная

113:52

ошибка Нам ре пытается подсказать что у

113:55

нас отсутствует какой-то корневой

113:57

элемент Возможно мы имели в виду GSX

114:00

Frag пока мы не знаем что это такое но

114:03

давайте я объясню почему возникает такая

114:04

ошибка почему при использовании GSX нам

114:08

всегда нужно иметь какой-нибудь корневой

114:10

элемент Ну вот например самый простой

114:12

вариант -

114:13

этос храним работает

114:18

успешно на самом деле мы вот буквально

114:22

через пару минут разберёмся более

114:23

подробно с jsx Ну просто Представьте что

114:26

у нас есть какая-нибудь функция там

114:29

скажем Get Number без разницы и она там

114:33

возвращает

114:36

нам здесь я

114:38

создам переменную а она возвращает нам А

114:41

например да то есть это обычный

114:44

JavaScript мы можем группировать в

114:47

JavaScript какие-то элементы ну орава

114:49

единстве что меня при при сохранении их

114:51

удаляет Вот но Круге скобочки в

114:54

JavaScript - это просто некоторая группа

114:56

да то есть мы можем их объединять Но что

114:59

мы не можем делать Мы не

115:03

можем возвращать здесь два значения Это

115:07

будет

115:09

ошибка Да потому что возвращаемое

115:12

значение должно быть всегда одно Ну то

115:13

есть Мо Попробовать там какой-нибудь

115:16

написать

115:18

ROM хочу как-нибудь чтобы притер мне не

115:21

удалял эту всю историю там например

115:23

Ma

115:26

ма Да в общем нельзя так делать И если

115:31

мы посмотрим как бы как работает эта

115:33

функция то она по идее должна выдавать

115:34

нам ошибку изза своего

115:38

синтаксиса

115:40

Get Number он выдаёт нам ВС равно двойку

115:45

но очевидно что поведение здесь

115:48

непредсказуемо

115:50

и в действительности То

115:53

есть если мы вс-таки хотим получить оба

115:56

из этих значения да то нам как минимум

115:58

нужно взять их например в массив то есть

116:01

в таком случае в такой интерпретации да

116:03

давайте тоже

116:09

протестируем видите мы всё-таки уже

116:11

получаем более предсказуемый какой-то

116:13

ответ

116:15

идется в

116:18

том если Мы удалим вот этот корневой

116:21

элемент Да и попробуем возвращать

116:22

несколько а одинаковых как бы детей в

116:25

GSX то получается вот это как раз ошибка

116:28

из-за того что А по факту это не теги А

116:31

это просто результат работы определённых

116:34

функций но всё же в реакте есть

116:37

механизмы позволяющие избавиться от

116:38

этого лишнего тега Ну как минимум потому

116:40

что это а всё равно некая нагрузка на

116:43

приложение там больше элементов больше

116:45

всего трекать надо Ну и как следствие

116:48

оно медленнее работает и вот как это

116:50

решается мы можем

116:53

импортировать что-то из react и это

116:56

что-то

116:59

называется

117:02

фрагмент Судя по тому что мне сейчас не

117:04

подсказывает в коде крутится такая

117:07

штучка нужно будет его перезагрузить но

117:09

я вам сейчас всё равно покажу смотрите

117:11

фрагмент - это встроенный компонент в

117:13

реакте который с точки зрения работ

117:18

быт

117:20

но если мы посмотрим сейчас на результат

117:22

того что происходит в

117:25

браузере То мы видим что теперь пропал

117:28

этот див то есть с точки зрения кода с

117:30

точки зрения разработки элемент есть но

117:33

в дом дерево он не идёт Да потому что мы

117:35

сразу же получаем здесь уже header Main

117:38

и дальше идут секции то есть вы можете

117:42

частенько встретить в приложениях именно

117:44

такую конструкцию

117:47

но все е импортировать потому что в

117:51

реакте есть удобный синтаксис

117:53

позволяющий работать именно с этими

117:54

фрагментами мы можем удалить вообще этот

117:56

импорт и просто описать его как пустой

118:00

тег пустой тег открывающийся и

118:02

закрывающиеся я думаю что это интуитивно

118:04

даже понятно ну и соответственно

118:06

результат будет тот же

118:08

самый как мы видели до этого вот поэтому

118:11

имейте в виду эту запись мы будем те

118:14

периодически

118:15

использовать тепер Дава да сечас я вам

118:19

хочу показать что же по-настоящему из

118:22

себя представляет вот этот вот GSX для

118:26

этого Давайте создадим новый файл

118:28

который я назову например

118:30

inro section GSX как обычно это у нас

118:36

будет

118:38

экспорт функции

118:40

inro

118:44

section и Давайте здесь будет что-нибудь

118:47

очень простое есть верхний уровень будет

118:50

section будет заголовок H1 Ну и будет

118:53

заголовок H3 А в качестве текста зайду

119:00

в и возьму основной

119:04

заголовок Ну только для

119:11

наполнения Отлично Теперь мы Давайте

119:13

добавим этот интерсек после сразу же

119:18

мейна

119:20

in section ВС видите я Перезагрузил код

119:23

теперь о меня потягивается автоматически

119:25

Да если мы

119:27

посмотрим то вот у нас в принципе есть

119:30

какой-то контент здесь Давайте немного

119:33

поработаем со стилистикой чтобы приятнее

119:35

было то есть в index.css я

119:39

добавлю класс

119:45

Cent и здесь я добавлю

119:48

ласс

119:50

centered тоже самое для H3 и кстати я

119:55

немножечко забегу вперёд но давайте мы

119:56

добавим ещё Inline стиль сюда Style он

120:00

добавляется следующим образом то есть

120:03

смотрите как бы я описываю атрибут Style

120:08

дальше Я указываю что здесь будет

120:10

некоторая динамика да то есть я не

120:12

прописываю таким вот образом как это

120:14

обычно делается в HTML в реакте так

120:16

нельзя делать и дальше мы в в качестве

120:19

объекта да то есть первые скобочки они

120:22

отвечают Именно за то чтобы указать что

120:24

будет динамическое значение а второй

120:26

объект указывает на то что дальше в нём

120:29

мы уже перечисляем стиля да то есть в

120:31

теории я могу взять этот объект и

120:33

описать вообще где угодно но мы чуть

120:35

позже поработаем с этим и здесь я напишу

120:38

Color со значением в объекте пусть будет

120:47

666 Вот то есть Как по мне теперь секция

120:50

выглядит лучше и что я хочу показать

120:52

теперь этим примером то что мы на самом

120:56

деле не обязаны использовать GSX мы

120:58

можем писать на обычных функциях и

121:00

сейчас давайте опишем тот же самый

121:02

компонент я его закомментировать

121:10

смотрите в первую очередь мне

121:13

потребуется

121:14

импортировать сам реак из реакта потому

121:19

что на самом деле Вот любой тег который

121:23

мы видим в GSX это производная от react

121:28

и его метода Create

121:31

Element метод Create Element он

121:33

принимает в себя на самом деле три

121:35

параметра Первый параметр - это название

121:38

тега который мы хотим внедрить например

121:42

H1 второй параметр отвечает за кстати е

121:46

я ошибся вс-таки же Корневой

121:49

правильно второй параметр отвечает за то

121:53

какие опции мы передам в этот тег Ну

121:55

конкретно SE У нас сейчас пустой поэтому

121:57

сюда мы можем передать Ну а третий

122:00

параметр

122:01

указывает на то какие дети будут у

122:06

данного тега Ну например Здесь я могу

122:08

написать Hello неправильно сейчас всё

122:11

равно

122:14

уберём вот видите он у нас появляется Да

122:17

если мы на него посмотрим внимательнее

122:20

то вот у нас есть сек и внутри

122:22

действительно хранится эта строчка О'кей

122:25

значит Теперь попробуем продублировать

122:27

всё-таки нашу структуру и так как

122:30

следующим у нас идёт H1 то сюда мы и

122:33

передаём react Create

122:36

Element H1

122:40

А теперь уже не нул будет да теперь уже

122:43

Бут здесь определённые параметры и

122:44

дальше указываем Котен в моём случае

122:47

result University

122:50

Теперь если мы

122:52

посмотрим вот у нас появляется здесь

122:54

заголовок но он не содержит себе ла

122:57

Center за счёт чего опять же он

122:59

находится в левой части поэтому вот во

123:02

втором параметре в объекте мы можем

123:03

указать как раз таки параметр name ключ

123:08

и сюда указать

123:13

cer Теперь если мы посмотрим как Видите

123:16

вот у нас появляется уже г с

123:19

а центральным

123:22

позиционированием Ну и остаётся

123:24

получается Только добавить

123:25

H3

123:27

О'кей Но здесь возникает вопрос А как в

123:31

качестве третьего параметра Да

123:34

передать на один уровень с заголовком H1

123:37

ещё H3 в действительности делается всё

123:40

это очень просто если там несколько

123:41

объектов то мы их оборачиваем в массив И

123:44

собственно

123:46

говоря здесь я просто лиру функционал

123:49

сюда передаю H3 и сюда

123:54

передаю Давайте са с

124:01

копируем сюда передаю

124:04

контент примерно так это

124:10

выглядит

124:12

отлично но также здесь ещ были стили до

124:15

этого Да поэтому мы можем сюда передать

124:17

стили а вот в этот объект то есть sty ну

124:23

и здесь также описываем в качестве

124:27

значения решётка по-моему там было

124:32

666 всё Как видите выглядит Это точно

124:35

так же как выглядело до этого но теперь

124:38

вы можете сравнить Как в

124:40

действительности выглядит этот синтаксис

124:43

и что происходит с ретом после того как

124:46

проходит процесс да который в данном

124:49

случае поддерживается именно витом Ну и

124:51

то как нам удобно разрабатывать то есть

124:54

этот код полностью идентичный и это на

124:57

самом деле очень многое объясняет с

124:59

точки зрения того там почему Например

125:01

стили именно так работают да да потому

125:03

что просто мы их передаём как объекты

125:05

Вот

125:07

и вы крайне редко я думаю встретите в

125:09

продакшене именно такую запись её

125:12

немного можно оптимизировать там да

125:14

например

125:16

лучше это не делать не в

125:19

отдельно допустим Con E равно Create

125:24

Element Да мы просто сохраняем референс

125:26

Этой функции Ну и теперь там можем

125:28

просто писать здесь везде е такое в

125:31

принципе Вы можете встретить тоже и би

125:33

процесс именно так оптимизирует вот но

125:35

суть это не меняет то есть всё что

125:38

происходит в реакте оно приходит вот к

125:40

этому на самом деле это просто некоторый

125:42

такой слепок вообще

125:44

из объектов которые описывает то что

125:46

потом происходит в браузере

125:49

Надеюсь что это было интересно

125:52

разобраться можете с этим поиграться

125:54

полезно будет очень Давайте перейдём

125:56

дальше к разработке нашего приложения

125:58

потому что нам нужно разобрать очень

126:01

много ещё различных функций которые есть

126:03

в react с точки зрения его базы давайте

126:07

мы сделаем следующим образом

126:12

значит я хочу показать вам

126:15

дополнительный функционал и хочу как бы

126:17

переключаться между грубо говоря

126:19

страницами на самом деле это будет

126:20

неполноценный роутинг как работает

126:23

роутинг там в деталях и так

126:26

далее мы рассказываем на в большом курсе

126:29

уже там подробно про вся эта секция

126:31

сейчас мы не Ну в этом курсе Мы не

126:33

сможем эту затронуть тематику она

126:34

довольно-таки объёмная Но с другой

126:36

стороны я вам покажу

126:38

как вы можете эмулировать роутинг и

126:41

показывать различные страницы на примере

126:43

этого приложения но перед этим пока я

126:46

говорил Я заметил что в консоли У нас

126:48

есть

126:49

ошибка которую мы уже видели с вами

126:51

недавно каждый ребнок в списке должен

126:54

иметь уникальный

126:57

ключик Ну точнее свойство ки Откуда

127:01

берётся эта ошибка и очень клёво что она

127:03

всплыла я её заметил потому что когда мы

127:06

в

127:07

Inter во второй

127:10

Element точнее Вот он передам массив то

127:14

помните как работают массивы кажды эже

127:19

для того чтобы рек правильно трека

127:21

параметр ки поэтому здесь для того чтобы

127:24

не было ошибки Так как это одинаковые по

127:26

уровню свойства мы передаём уникальный

127:30

ключ значение его может быть каким

127:32

угодно В данном случае Главное чтобы они

127:34

отличались Да теперь если мы обновим

127:36

страницу то всё хорошо о'кей

127:39

а Итак давайте разработаем наши кнопочки

127:44

позволяющие переключать страницу я

127:46

создам для этого отдельный файл назову

127:47

его какой-нибудь

127:51

TS пусть

128:02

будет то есть в прямом смысле я хочу

128:05

создать ещё одну

128:08

секцию которая будет содержать себе уже

128:11

кнопочки позво пере горя такая

128:17

вот включу наш уже компонент

128:23

Button Нам необходимо его

128:29

импортировать

128:31

Button

128:34

Button и пусть первая кнопка будет с

128:37

текстом главная например и пусть у меня

128:40

будет другая страничка которая будет

128:42

называться обратная

128:45

связь Значит теперь мы используем этот

128:47

компонент в App Давайте после in

128:53

section tabs

128:56

section Давайте посмотрим как он

128:59

выглядит вот у нас есть эти кнопочки Ну

129:02

и теперь при клике Нам необходимо

129:04

показывать те или иные блоки да то есть

129:07

Давайте создадим ещё один блок это будет

129:10

Ещё один компонент я его назову

129:13

fid

129:15

Back SE jsx

129:27

здесь Мы возвращаем также section

129:32

H3 з мы напишем обратная

129:37

связь Ну пока в принципе нам этого будет

129:40

достаточно да то есть и теперь А при

129:43

клике на какую-то из кнопок в tabs

129:45

section Я хочу показывать либо

129:48

Вот эту вот страничку да то есть

129:50

состоящую из двух секций

129:54

либо edb section Как нам это сделать для

129:59

этого в первую очередь нам потребуется

130:02

State потому что мы будем что-то

130:04

нажимать что-то будет меняться и

130:06

соответственно рендерить Так что я

130:08

создам в а компоненте и именно в А

130:10

компоненте да не в T А здесь так как

130:15

именно этот компонент отвечает за

130:17

рендеринг

130:19

страниц создаю

130:21

State и я его назову следующим образом у

130:24

меня будет Tab и Set Tab да то есть это

130:29

будет активная какая-то у нас таба

130:31

которая сейчас есть Ну и с помощью этой

130:33

функции Мы будем её менять Пусть

130:35

активная пока будет у нас фидбек то есть

130:39

мы сразу же будем переключать её вот на

130:41

эту страницу значит Как мы можем

130:45

показывать различные элементы в react По

130:47

условию мы уже знаем то здесь мы можем

130:49

спросить если T равняется например

130:52

M то тогда мы будем показывать вот эти

130:56

вот два компонента как их объединить Мы

130:59

только что разобрали мы можем для этого

131:01

использовать

131:03

фрагмент То есть он не создаёт никаких

131:05

доп элементов но при этом он их

131:06

объединяет вот и притер мне их

131:09

сформировал таким

131:10

образом и в другом случае если T

131:14

равняется

131:17

к

131:19

то тогда мы

131:20

показываем

131:22

SE Теперь если мы

131:25

посмотрим Мы видим что мы по умолчанию

131:29

Ну видим обратную связь Единственное что

131:31

хочется какого-то отступа здесь

131:34

добавить Мы это можем

131:36

сделать в T SE здесь добавить in

131:47

стиль

131:49

З И тут тоже одна маленькая такая

131:51

особенность видите ВС написано именно в

131:55

кейсе то есть в оригинальном CSS мы

131:58

пишем там marg Def Bon но такая запись

132:02

невозможна в JavaScript поэтому мы

132:06

трансформируем его в Ну и сюда пишем

132:10

О всё красота дальше у нас пока не

132:15

работают кнопки то есть давайте мы тоже

132:17

это обработаем

132:20

вот наш компонент то есть Нам нужно

132:21

сейчас связать функционал который

132:23

находится в T и Конкретно этот й Давайте

132:27

посмотрим что мы можем здесь сделать мы

132:30

будем сюда принимать некоторые параметры

132:35

допустим и там какой-нибудь

132:43

теперь при клике на

132:47

кнопочку

132:48

вызывать метод onchange со значением

132:53

Main то есть мы будем переходить на

132:56

главный таб А здесь при клике мы будем

132:58

переходить на

133:00

фидбек ну и соответственно нам Остаётся

133:03

только пометить кнопочку активный

133:08

м Значит мы можем сюда передать параметр

133:12

из Active и если Active равняется Main

133:16

то тогда всё хорошо и соответственно мы

133:19

дублируем этот

133:21

функционал на вторую кнопку только здесь

133:23

мы уже добавляем

133:26

фидбек Отлично Теперь нам остаётся

133:29

передать эти параметры то есть Active у

133:31

нас Tab Да он относится к стей Ну и on

133:35

change это у нас

133:38

будет то есть здесь мы принимаем

133:42

получается строчку по какой кнопке мы

133:45

нажали и мы можем сразу же

133:49

изменить состояние текущего таба с

133:51

помощью этой функции например в Илай

133:54

режиме даже то есть здесь мы принимаем

133:55

параметр какой-нибудь Active Ну и Set

134:00

Tab или Давайте лучше назовём его

134:04

current то есть текущий и Set

134:08

current теперь при обновлении

134:12

страницы видим что по умолчанию обратная

134:14

связь у нас подсвечивается активным это

134:16

из-за того что по умолчанию в usate мы

134:20

передаём активный этап это фидбек но

134:22

если мы его переключаем то как видите у

134:24

нас открывается уже необходимые страница

134:27

Здесь всё работает и таким нехитрым

134:29

образом на самом деле мы смогли вот

134:31

реализовать новую страничку

134:34

а также я хочу отметить следующую

134:37

концепцию которая вот мы только что на

134:40

самом деле

134:41

разобрали почему Например мы в этом

134:44

компоненте Tab section не создавали

134:46

State Хотя по факту он здесь меняется Да

134:48

мы стойт сделали здесь в теории вам

134:52

нужно стремиться к тому чтобы

134:53

компонентов которые используют состояние

134:55

было как можно меньше вот этот компонент

134:58

который содержит в себе состояние

134:59

называется

135:00

умным компонент же который не содержит в

135:04

себе состояние а только работает с

135:06

входящими параметрами называется глупый

135:08

Ну это дословный перевод с английского

135:10

языка Dum и идея в том

135:14

что чем более точечно вы управляете

135:18

стейтон а не распределяется его на

135:20

внутренние компоненты тем лучше работает

135:22

ваше приложение вот поэтому нужно

135:24

стремиться к тому чтобы не было никаких

135:25

внутренних состояний и это хорошая

135:28

практика и хорошая оптимизация для

135:29

работы

135:31

приложения О'кей идём дальше и перед тем

135:35

как мы будем углубляться уже в Feedback

135:38

section там будет очень интересный

135:40

контент про работу с формами Я бы хотел

135:43

сделать небольшое отступление и

135:45

поговорить про стили

135:49

Аа давайте мы возьмём для примера наш

135:55

Button в

135:58

Button мы Ну сгруппировать весь

136:01

компонент в папочку и здесь присутствует

136:04

и CSS и GSX А здесь мы прописываем

136:07

классы как бы импортируем их в

136:09

компоненте всё прекрасно и чудесно но

136:12

если мы посмотрим непосредственно на

136:13

этот компонент то мы видим что стиль Он

136:17

общий для всего приложения и если вы не

136:20

первый день во фронтенде вы понимаете

136:22

что когда есть глобальные стили и

136:25

отсутствует какая-то изоляция то шанс

136:28

того что у вас будет коллизия по классам

136:31

вы там перетрясово

136:34

практикой считается определённая

136:37

изоляция классов которая работает там

136:39

только в рамках одного компонента А не

136:40

выходит в глобальный скоуп

136:44

и Давайте Я приведу пример Как можно

136:47

прямо из из коробки сделать так чтобы

136:50

стили были локали Зро только для одного

136:52

компонента но теперь уже Баттон мы

136:54

оставим Как пример А таких глобальных

136:57

стилей давайте мы возьмём header Потому

137:00

что

137:02

м Здесь нет как бы дополнительных стилей

137:05

единственное что я их описываю в индекс

137:08

CSS вот есть стиль для хедера и

137:11

предположим Мы хотим их локализовать как

137:13

это можно сделать я а создам новую папку

137:17

р буду значит сюда всё это группировать

137:22

давайте обновим импорты но чтобы вы

137:24

понимали импорты обновляются только в

137:27

GSX потому что здесь мы используем я

137:30

сохраню видите ВС теперь и значит

137:33

давайте создадим новый файл header CSS в

137:39

этом CS я вырежу отсюда сти и вставлю

137:44

сда

137:46

пори по что мы их не подключили давайте

137:49

мы их

137:50

импортируем Head CSS и Как видите всё

137:54

хорошо Вот Но проблема мы не решили

137:56

Потому

138:00

что так ошибок нет всё хорошо Да потому

138:04

что стили как были глобальные так и

138:05

остались Единственное что мы их

138:06

расположили с точки зрения кода в нужном

138:09

месте но есть такая фишка если мы

138:13

возьмём и

138:15

перемену CSS header то

138:19

Mod

138:22

CSS именно вот зарезервированное

138:24

название такое то давайте смотреть что

138:26

изменится В первую очередь я

138:36

импортируют

138:39

отсюда

138:41

Объект который обычно называется classes

138:44

и Давайте посмотрим что же это такое за

138:46

объект

138:55

Значит мы написали Коль Log А вот мы

138:58

переходим и видим здесь пустой объект

139:01

А дело в том что когда мы используем

139:05

модуль кстати Обратите внимание что на

139:06

самом деле вёрстка не сломалась возможно

139:08

я выбрал сейчас не самый удачный пример

139:10

с точки зрения того что я начал

139:12

показывать хедеры так как здесь нет

139:14

классов и может быть стои его показать

139:17

На кнопочки давайте наверное пока мы

139:20

далеко не ушли покажу на кнопочки сори

139:23

немножечко не подумал бу Не внимателен

139:26

но в общем эту штуку мы можем

139:31

оставить давайте мы вот просто оставим

139:34

header

139:36

CSS эту этого парня Мы переименую в

139:40

header

139:42

CSS и разберём на примере

139:45

кнопочки потому что здесь есть классы

139:48

там Вся фишка в классах В общем buton

139:51

модуль CSS Всё мы переименовали сиску И

139:57

теперь я

140:02

импортируют видите всё кнопки потеряли

140:05

свои стили хотя у них всё ещё есть

140:07

батоны но всё больше они не определяются

140:09

Отлично мы пришли в нужную точку С вами

140:12

сейчас когда мы работаем с модулями мы

140:15

на самом деле должны импортировать

140:16

отсюда объек

140:19

назвать естественно эту штуку можно как

140:21

угодно Но обычно принято е называть

140:23

именно Давайте посмотрим теперь

140:26

наконец-таки что она из себя

140:30

представляет Мы видим что мы получаем

140:35

объект он одинаковый в данном случае

140:36

потому что кнопка два раза рендерится их

140:38

две и мы видим что ключи

140:46

сот у них вот какие-то такие

140:48

криптографические странные и

140:51

действительно теперь для того чтобы

140:53

добавлять

140:54

классы смотрите Да вот допустим buton мы

140:57

здесь добавляем здес Я могу написать

140:59

теперь classes то Button вот эта вот

141:03

штука название оно полностью идентично

141:06

тому как мы описываем это в CSS то есть

141:10

вот это вот название

141:11

классов ну и соответственно чтобы

141:13

продублировать этот функционал здесь я

141:16

воспользуюсь

141:46

шаблонизатор криптография Да которую мы

141:48

не прописывали Но это Как раз-таки идёт

141:50

за счёт вот этих модулей и теперь

141:52

коллизия имён она практически невозможна

141:54

Ну на самом деле невозможно Да потому

141:56

что Всё теперь эти стили будут

141:58

применяться только в рамках этого

141:59

компонента что довольно-таки

142:01

круто и я вам покажу ещё один способ

142:05

стилизации элементов в react он уже идёт

142:08

с дополнительной библиотекой Вот теперь

142:10

уже мы поговорим про header Я думаю

142:12

настало время смотрите есть такая

142:15

библиотечка которая называется

142:20

components Да мы прописываем

142:24

npm которая кстати делает тоже самое что

142:28

мы сейчас разбирали то есть это задача

142:31

по локализации именно стилей

142:35

и значит давайте так вот всё закрою не

142:38

люблю когда много открыто

142:40

путаешься допустим разм это на

142:46

примере то мы будем прописывать

142:49

стили непосредственно в JavaScript и для

142:53

того чтобы это всё сработало Мне нужно

142:55

импортировать что-то которое Что

142:58

называется sty из библиотеки sty

143:01

components Теперь у нас есть этот объект

143:04

и мы можем его

143:06

использовать вот смотрите дальше важный

143:09

момент у объекта ST присутствует большое

143:13

количество то есть это JavaScript объект

143:15

правильно но у него есть свои ключи

143:18

которые совпадают с названиями HTML

143:22

тегов и так как мы работаем в рамках

143:25

хедера то мы можем использовать здесь

143:28

header И после этого присутствует Вот

143:31

такая вот Необычная штука для начинающих

143:32

возможно

143:34

А как синтаксис позволяющий вот напрямую

143:38

по сути передавать параметры в функцию э

143:42

можете сильно не заморачиваться по этому

143:44

поводу просто вот привыкнете что есть

143:46

такой синтаксис да то есть я здесь не

143:48

вызывал функцию там ничего я просто

143:50

именно вот эти вот обратные кавычки могу

143:52

таким образом передать и всё что я

143:54

пропишу вот здесь сейчас оно будет

143:56

применяться Ну что мы здесь будем

143:59

смотреть давайте мы просто возьмём все

144:00

эти стили и Я вырежу вообще их вырежу

144:05

вставлю сюда header CSS Теперь давайте

144:09

мы не будем его удалять Но я просто

144:12

видите оставлю его пустым да то есть на

144:14

текущий момент у нас

144:17

сломался Т потому что я установил

144:19

библиотеку остановив кстати его Ctrl C

144:22

командой Теперь мы опять делаем PM

144:26

RDF обновляю страницу всё видите хедер

144:29

отлетел То есть тут нет никаких стилей

144:32

А дальше что мы делаем то есть на самом

144:35

деле вот этот

144:37

а объект ST он

144:41

возвращает что-то что мы можем поместить

144:43

в константу Например я могу назвать её

144:46

header

144:48

контейнер и по факту это уже готовый

144:51

компонент Кстати я могу так

144:53

закомментировать даже чтобы вообще

144:54

наверняка не было мы получаем готовый

144:57

react компонент у которого уже есть вот

145:00

эти вот стили И теперь мы просто можем

145:03

его использовать в

145:04

коде с

145:07

локали стилями видите функционал не

145:10

изменился но при этом если мы посмотрим

145:13

то вр добавляются два Вот таких вот

145:17

класса Да который содержит в себе

145:20

необходимый набор стилистики то есть вы

145:23

тоже можете это увидеть я хотел вам

145:26

показать чтобы вы понимали что это за

145:27

синтаксис Как это

145:29

работает поэтому я думаю что теперь мы

145:32

можем идти дальше опять же можете

145:34

поиграться с этим Давайте ещё последнее

145:36

слово скажу да что например если мы

145:38

используем здесь не header а

145:39

какой-нибудь там ди например то в общем

145:42

и целом картина не изменится для нас

145:44

Однако теперь вместо хедера видите мы

145:46

уже получаем элемент div да то есть тут

145:49

мы выбираем Ну как бы Как будет

145:51

называться

145:52

итоговый

145:55

тег

145:57

Супер Теперь давайте перейдём к фидбек

146:01

сек ну и наконец-таки поработаем с

146:05

формами значит я добавляю Tag form и

146:09

здесь добавлю Input Type

146:12

Tex Ну и в принципе

146:15

всё дальше в ик CSS давайте я добавлю

146:20

небольшие стилистику для наших инпутов

146:23

Ну чтобы они по приятнее выглядели то

146:25

есть называется это Ctrl и сразу же

146:27

добавлю этот класс с помощью параметра

146:29

Class name к

146:31

инту так если мы теперь посмотрим то вот

146:35

довольно-таки неплохой обычный инпут

146:37

получается давайте мы также его

146:39

как-нибудь подпишем например добавлю

146:41

здесь Label кстати здорово что мне эт

146:44

сразу же подсказал что вместо обычного

146:47

атрибута for в jsx это называется html4

146:51

Да чтобы сразу же соединять их допустим

146:53

я назову это name и должен дать шник

146:57

тоже здесь можно написать там ваше

147:03

имя видите теперь это всё

147:06

работает и давайте для примера также я

147:09

добавлю здесь

147:11

[музыка]

147:15

ещё нам не потребуется

147:19

здесь

147:21

name ID будет Reason соответственно и у

147:25

него

147:27

будет Reason Ну типа причина обращения

147:30

давайте так и

147:33

напишем и здесь Перечисли некоторые

147:38

опции options там

147:41

допустим сть будет

147:45

ошибка

147:47

нужна

147:49

помощь и предложение Ну какие такие

147:52

опции Давайте их озом как-нибудь

147:57

Help

148:00

и так теперь для сек также ещё добавим

148:05

Control класс Ну по идее всё должно быть

148:08

красиво сейчас да Как видите мы получили

148:11

в принципе неплохую

148:14

[музыка]

148:15

форму е но я предлагаю опять же

148:18

использовать наш универсальный компонент

148:21

Button

148:23

допустим

148:25

отправить Единственное что его нужно

148:34

импортировать Button

148:38

From Button

148:42

Button всё отлично кнопочка У нас тоже

148:44

есть и теперь

148:47

мы не будем пока отправлять никакую

148:49

форму но тем не менее мы разберём Ну

148:51

типа я имею в виду там на сервер или в

148:53

базу данных мы разберём на этом примере

148:55

Как работает react именно с таким

148:57

функционалом

148:58

а и я вам покажу много полезных кейсов

149:02

значит в первую очередь нам

149:06

потребуется какой-нибудь й то есть

149:09

состояние позволяющее следить за

149:11

изменением что происходит там в инпуте и

149:13

в селекте но мы можем это очень легко

149:16

сделать это мы уже знаем то есть use

149:19

State давайте для имени Да я

149:22

создам состояние name и Set name и также

149:28

будет ещё одно состояние для

149:30

причины

149:32

Reason и Set

149:37

Reason по умолчанию имя у нас

149:41

будет пустой строчкой а Reason мы

149:45

выбираем какой-то один из трёх там

149:47

допустим пусть будет

149:50

помощь То есть это начальное состояние

149:53

естественно обозначение стейта и его

149:55

определение инициализация она ни на что

149:57

не влияет Поэтому нам теперь необходимо

150:00

соединить это состояние с HTML Ну jsx в

150:04

данном случае в первую очередь для того

150:07

чтобы передавать сюда состояние значит я

150:10

использую параметр value и сюда указываю

150:13

Какой конкретно йт Я хочу здесь

150:15

использовать в моём случае

150:18

это Теперь смотрите что получается я

150:20

обновлю

150:21

страницу и теперь если я попробую что-то

150:24

вписать Вот видите я нажимаю Ну я не

150:26

знаю вы не видите и не слышите возможно

150:28

но я прямо очень старательно нажимаю

150:30

ничего не происходит тоже

150:33

проверьте у вас не получится Почему

150:37

Потому что когда мы Соединяем

150:40

состояние с интом мы что-то вписываем но

150:45

состояние

150:47

и поэтому не перерисовывать его то есть

150:49

мы в прямом смысле отменили Поведение по

150:53

умолчанию Да видите он даже ругается что

150:56

вы предоставили свойство val но не

150:58

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

151:00

нам нужно следить за изменениями каждым

151:03

изменением конкретного

151:05

контрола самый простой способ - это

151:08

сделать вызвать Ну передать ещё параметр

151:11

on

151:15

допустим

151:18

CH этой функции у нас нет я её

151:23

создам и в эту функцию мы естественно

151:26

принимаем Event самый обычный Ну

151:29

практически самый обычный не буду сейчас

151:31

усложнять ивент который вы встречаете в

151:34

до если мы на него

151:38

посмотрим

151:45

Event

151:47

консоли Я начинаю что-то прописывать

151:50

видите у меня не меняется состояние но

151:52

при этом мы как минимум видим какую

151:53

кнопочку я нажал да то есть теперь я

151:55

подтвердил свои слова что я по ней по

151:57

клавиатуре нажимаю соответственно для

152:00

того чтобы у нас менялось что-то в

152:02

отображении Нам необходимо изменить

152:04

состояние поэтому здесь я делаю Set name

152:08

Да именно с помощью этой функции мы

152:10

меняем состояние Ну и сюда уже

152:12

Передаю

152:14

то что есть в нашем

152:17

инпуте И теперь наконец-таки мы можем

152:20

что-то вписывать и оно будет меняться

152:22

потому что теперь мы меняем состояние и

152:25

как следствие состояние теперь

152:26

синхронизируется с

152:28

отображением даже давайте мы вот как

152:31

поступим временно а может быть и нет я

152:35

добавлю здесь г пре где буду дебажить

152:39

Что у нас там вообще происходит то есть

152:41

я буду вводить сюда name и Reason

152:46

будем

152:49

отслеживать Вот видите Теперь у нас есть

152:52

полное соединение да то есть наше

152:55

состояние меняется и как следствие

152:56

меняется Вот и в данном случае а по

152:59

умолчанию у нас Reason Help то есть всё

153:02

с интом мы здесь разобрались но не

153:04

разобрались с хелм как его сделать А

153:07

честно говоря также то есть в Select Мы

153:10

также передаём значение val только здесь

153:13

уже

153:15

указываем

153:16

состояние

153:19

Reason и в

153:22

onchange мы можем создать также

153:24

отдельную функцию handle Reason change

153:27

например но можем Inline её прописать то

153:29

Здесь мы получаем некоторый Event и

153:31

говорим Set Reason равно Event Target

153:36

value в принципе это Inline как бы стиль

153:39

а не всегда имеет смысл выносить всё в

153:41

функцию и так далее То есть можно так

153:44

прописывать Теперь смотрите видите по

153:46

умолчанию уже помощь у нас теперь я

153:48

делаю предложение и меняется у нас на

153:51

sug прописываю что-то в имени Как видите

153:54

это всё плюс-минус начинает работать то

153:56

есть вот какая идея на самом деле

153:59

заключается за Two Way Банго так

154:01

называемым в реакте это когда

154:04

связывается им функционал и сам шаблон

154:08

но теперь давайте идти дальше Значит мы

154:11

немножечко уже успели познакомиться с in

154:14

стилями и

154:16

Давайте попробуем пока очень простую но

154:19

ВС же добавить валидацию в случае если у

154:22

нас что-то неправильно заполнено Ну

154:24

например если значение у нас пустое мы

154:28

тогда не можем это всё пропустить для

154:30

этого я могу добавить иль и опять же

154:33

первые фигурные скобки указывают именно

154:36

на то что дальше будет динамика

154:41

в имен втоми фигурными скобками

154:45

указываю уже определённый объект

154:49

и давайте мы укажем параметр Border да

154:52

то есть будем задавать границу в случае

154:56

ну будем делать её красненькой Короче

154:57

если у нас нет ничего в неме мы можем

155:01

как написать name удалим пробелы потому

155:04

что в конечном итоге это просто строчка

155:06

а дальше спросим длину этого состояния

155:11

если в длине что-то есть тогда мы ничего

155:14

не будем добавлять просто нул

155:16

или там даже und да можно сделать

155:18

Давайте Ну оставим а иначе мы будем

155:21

добавлять один пиксель

155:24

Solid Давайте тепер посмотрим наю

155:29

страницу и видите теперь по умолчанию у

155:32

нас Красная граница есть потому что как

155:35

раз таки выполнило это условие то есть в

155:37

имени ничего нет если мы что-то

155:39

пропишет но не очень на самом де ког Мы

155:44

заходим сразу что мы неправильно что-то

155:46

запомнили мы может быть даже не

155:48

планировали ничего делать поэтому мы

155:50

можем поступить немного иначе Давайте

155:52

создадим отдельное

155:54

состояние для наличия

155:57

ошибки оно будет

155:59

называться Error Ну например

156:03

Set Error и по умолчанию оно будет

156:07

находиться в

156:14

значении дальше когда мы начинаем что-то

156:17

менять уже в инпуте то здесь

156:21

а также мы можем изменить Set has Error

156:24

и спросить ели что-то в

156:28

name

156:30

triam length если это равняется нулю да

156:33

тогда ошибка у нас есть но если Вы

156:37

внимательно смотрели предыдущую часть

156:39

курса то сейчас Можете подумать А почему

156:42

этот код работать не будет интересный

156:45

очень момент

156:46

я специально небольшую паузу

156:48

сделаю Но надеюсь что вы короче

156:51

поработали самостоятельно объясню ещё

156:53

раз

156:54

что когда мы меняем состояние с помощью

156:57

хуков

156:58

то сразу же автоматически ещё стейт не

157:02

поменяется до тех пор пока не выполнится

157:04

оставшаяся часть функции только после

157:06

этого А когда выполнится вот весь этот

157:10

код а будет новый цикл рендеринга

157:12

непосредственно самого компонента и так

157:14

далее То есть вот на этом этапе

157:16

оно не совпадает с тем что находится

157:18

здесь Поэтому в данном случае можно вот

157:21

так вот написать это будет более

157:24

правильно давайте мы также выведем

157:29

этот eror сюда то есть теперь можем

157:32

написать если has Error тогда мы будем

157:36

показывать красную границу а иначе

157:39

ничего не будем

157:44

выводить Вот теперь видите что по

157:46

умолчанию ничего нет но если мы начинаем

157:48

что-то вписывать и удаляем то всё теперь

157:52

Красная граница получается в принципе я

157:55

доволен этим функционалом и теперь на

157:59

основе него

158:00

А давайте мы пробуем заблокировать

158:03

кнопку Потому

158:05

что нельзя давать ей возможность

158:08

отправляться если что-то неправильно У

158:10

нас есть для этого мы можем добавить

158:14

параметр и он будет работать только в

158:18

том случае если у нас есть ошибка Если

158:20

есть ошибка тогда disable должно быть

158:22

True но смотрите тоже такой есть нюанс с

158:25

кнопочками этими То есть у нас уже есть

158:27

определённый набор параметров Да которые

158:29

мы сюда передаём

158:30

А теперь нам нужно добавить получается

158:33

disabled и этот ED нам нужно добавлять

158:37

Теперь сюда равно disabled Ну в общем то

158:39

есть делат довольно-таки большое

158:40

количество манипуляций если мы захотим

158:43

передавать сюда ещё какой-нибудь ID там

158:45

класс нем и прочее намм придётся каждый

158:47

раз это вот всё прописывать сюда и так

158:49

далее но по факту мы дублируем просто

158:51

эту историю потому что название

158:53

параметры название атрибута одинаковые и

158:56

в данном случае я хочу показать а способ

158:59

который вы часто встретите в реакте для

159:02

таких ситуаций чтобы вручную не

159:04

прописывать вот эти вот все свойства и

159:05

так далее в том числе кстати он Клик

159:08

Потому что видите он дублирует здесь его

159:10

тоже можно

159:11

выпилить мы можем прописать вот эти вот

159:14

входящие параметры они кастомные у нас в

159:16

данном случае то есть мы сами их

159:18

добавляем и здесь мы можем

159:20

воспользоваться оператором rest То есть

159:24

он выглядит как сд Но это вы понимаете

159:27

JavaScript сюда мы

159:32

собираем Значит все оставшиеся входящие

159:36

параметры которые нам поступают мы не

159:38

знаем сколько их будет Вот момент вызова

159:40

как бы jav будет понимать И теперь у нас

159:43

есть

159:44

обект который мы можем уже взять уже с

159:49

помощью оператора spred и развернуть в

159:52

компонент онклик теперь можем

159:56

убрать потому что он совпадает Ну и

159:58

Теперь смотрите

160:02

аэ Ну да Нужно ещё

160:06

добавить для

160:11

Button disabled стиль там пусть будет

160:14

курсор

160:22

not всё хорошо если Мы удалим видите он

160:25

у

160:27

нас получается можем в качестве теста

160:30

для сейчас чтобы не много этому времени

160:33

уделять по умолчанию поставить что у нас

160:35

есть какая-то ошибка опять же как

160:37

правильно работать с формами это

160:40

отдельная история там довольно-таки

160:41

много функционала и можно использовать

160:44

там и сторонние библиотеки и прочее

160:46

угадайте где мы подробно про это

160:47

рассказываем естественно на полном курсе

160:49

все ссылки будут в описании а просто

160:52

если сейчас всё про это рассказывать Ну

160:54

буде бесконечный YouTube ролик

160:56

получается нам нужно основу разобрать

160:59

поэтому видите по умолчанию сейчас

161:01

кнопочка у нас дебт то есть всё работает

161:03

и вот это он клики они также сохранились

161:06

Вот то есть тоже очень классный как бы

161:08

паттерн есть который часто вы использу

161:11

увидите при разработке на react

161:14

рекомендую Итак с этой частью Мы тоже

161:18

разобрались Кстати мы можем ещё вот так

161:20

вот сделать у нас же есть ещё параметр

161:21

из и можем поставить его из Active будет

161:25

валидный в случае если у нас нет

161:30

ошибки вот видите теперь красивая

161:33

кнопочка получается Ну в общем мне

161:36

нравится теперь Значит я хочу отдельно

161:40

показать вам другой функционал который

161:43

очень важен для рабо в

161:47

Ну опять же при взаимодействии со стей

161:49

для этого я придумаю искусственный

161:50

какой-нибудь пример скажем у меня будет

161:53

кнопочка

161:55

здесь я даже не буду по-русски её

161:57

описывать Я назову её

162:00

ER и при

162:03

клике я буду вызывать метод tog

162:13

eror то есть функция о будет

162:16

искусственно переключать наше Вот это

162:18

состояние что у нас есть ошибка в форме

162:21

значит очевидно если мы работаем с Том

162:25

да то есть с переключателем то мы должны

162:28

основываться Ну в случае с боле

162:30

назначениями на предыдущем состоянии это

162:32

самое простое то есть ну если нам нужно

162:34

переключить мы

162:37

делаем вот у нас есть состояние на котом

162:39

мы основа Дава сто возм

162:44

ение отрицание от buan будет

162:46

противоположное его значение тут я думаю

162:49

тоже всё довольно-таки просто Давайте

162:51

посмотрим работает ли

162:53

это нажимаю tog Error видите работает

162:56

нажимаю tog Error вот мы можем

162:59

переключать Ну как бы я понимаю пример

163:00

такой но он очень важен Сейчас вы

163:02

увидите Почему

163:04

А всё классно работает

163:08

но что

163:10

если мы вызовем этот метод

163:14

дважды по логике получается да вот у нас

163:17

по умолчанию оно находится в True то

163:18

есть ошибка есть Когда мы это вызовем

163:20

оно должно быть в значении fse но мы

163:23

вызываем же его ещё раз мы должны

163:26

получить здесь Т то есть по факту ничего

163:28

не должно

163:29

измениться Давайте посмотрим наю

163:32

страницу специально нажимаю

163:35

eror и оно меняется нажимаю ещё раз

163:39

меняется Почему

163:41

так

163:44

опять разобрались что

163:48

А когда мы вызываем этот has Error сам

163:52

State ещё не поменялся Да и поэтому мы

163:54

заново вызываем Р С тем же самым

163:57

значением и многие начинающие делают

163:59

большое количество ошибок при работе с

164:03

вот подобным функционалом поэтому я вам

164:06

покажу как правильно это сделать это

164:08

вообще рекомендация там Best practice

164:10

непосредственно от самой команды в

164:12

реакте Вот как это выглядит значит э

164:15

временно комментирую в эти вот функции

164:19

которые меняют наше состояние мы не

164:21

всегда можем точнее мы не всегда обязаны

164:24

передавать Просто обычное значение мы

164:26

можем сюда передать

164:30

функцию Давайте вот так заново напишу мы

164:32

сюда передаём

164:34

функцию которая как параметр принимает

164:37

предыдущее значение тко предыдущее

164:40

значение

164:41

этого и в данном случае вернуть здесь

164:46

а новое состояние основывающееся на

164:50

предыдущем только уже не беря этот стейт

164:54

который фиг знает когда поменяется Да а

164:56

Конкретно А как это заложено в

164:59

механизмах реакта И если мы сразу же да

165:03

поменяем дважды это

165:05

состояние обновлю

165:08

страницу видите я нажимаю и не меняется

165:11

ничего потому что мы дважды изменили Ну

165:13

и очевидно что оно также находится в

165:15

значении True то есть теперь наша ошибка

165:18

ушла

165:19

и это то как на самом деле правильно

165:22

работать с предыдущим состоянием то есть

165:24

учтите этот момент Я как раз-таки хотел

165:27

бы вам предложить сейчас с этим

165:28

потренироваться немножечко а разобрав

165:31

при этом параллельно ещё один

165:36

концепт который а тоже относится к

165:40

стей запомните этот код Потому что

165:42

сейчас мы его сильно

165:45

смотрите Вы можете меня спросить а вот

165:48

почему мы несколько раз создаём usate

165:51

там для каждой строчки свой usate Кстати

165:54

да Как видите это всё вполне возможно и

165:56

реально Почему бы нам просто например не

165:58

сделать состояние объектом например из

166:00

группировать всё в один объект Но что я

166:02

вам скажу Вполне себе мы можем это

166:04

сделать Ну примерно вот таким образом то

166:07

есть Давайте перепишем теперь наш

166:11

компонент теперь наше состояние оно

166:14

будет единственное будет называться

166:16

иф и это у нас будет объект содержащий

166:20

себе по умолчанию пустая строчка

166:24

потом Ну да у нас оно стоит по умолчанию

166:28

и по умолчанию да то есть Всё теперь

166:32

один usate и вот это вот всё Мы можем

166:36

убрать Какие тут есть особенности Да

166:39

теперь у нас получается вме вот этих вот

166:41

многообразия

166:44

различных присутствует один форм Ну вот

166:48

смотрите значит здесь мы должны изменить

166:51

имя и мы должны изменить здесь да то

166:54

есть можем так вот

166:59

написать равно evet name

167:03

и у нас будет равняться вот всей этой

167:06

конструкции и давайте пока что это мы

167:11

заком потому что будет

167:13

ошибка нужно поменять видите value name

167:16

у нас теперь отсутствует Но он теперь

167:18

доступен в form name да то есть опять же

167:21

я наверное не сказал Хотя это важно было

167:23

сказать мы можем любые состояния

167:24

начальные передавать в usate это вполне

167:27

себе Рабочая история

167:29

а то есть мы получаем объект Да просто

167:31

дальше его группируя в

167:33

нём так form

167:38

Reason reon мы сейчас сделаем Ну здесь

167:41

мы вводим form

167:43

name

167:46

reon Давайте проверим Удалось ли мне не

167:53

удалось находится у нас в бане не дол Я

167:57

бана то здесь тоже У нас должен

168:06

быть Так теперь Давайте вспомним по

168:10

функционалу то есть вот мы

168:13

скаже изме Давайте

168:16

попробуем и давайте Вы наверное не

168:19

увидели Обратите внимание Вот на этот н

168:22

то есть по учению Help всё чётко всё

168:24

понятно круто но как только мы начинаем

168:26

вписывать н по какой-то причине

168:29

пропадает Почему так мы можем

168:32

попробовать теперь в пре вывести

168:35

следующую конструкцию То есть попробуем

168:38

J string привести к строке нашу

168:43

форму

168:46

это будет такой дебаг у нас видите по

168:48

умолчанию у нас как бы полноценная форма

168:51

То есть со всеми необходимыми

168:53

состояниями Но как Только мы начинаем

168:55

вписывать пропадает Рим по какой-то

168:57

причине и в этом как раз-таки

168:59

заключается такая вот некоторая

169:02

проблема использования объектов в йте

169:07

Почему зачастую вы увидите именно вот

169:10

этот Потому что когда мы вызываем сефо

169:13

видите мы вроде меняем и name меняем и

169:16

Error но мы не добавляем

169:18

Reason да то есть по правильному нам

169:21

нужно написать здесь Reason равно

169:25

form Reason и тогда это должно

169:28

работать видите он остался прежним но

169:32

как вы понимаете там чем больше будет

169:34

этих полей короче это не очень удобно

169:36

будет но тем не менее так можно работать

169:39

потому что мы теперь то уже знаем да что

169:42

вот есть предыдущее состояние поэтому мы

169:45

можем описывать это следующим образом мы

169:47

основывается на предыдущем состоянии и

169:50

здесь возвращаем круглые скобки они

169:53

группируют в фигурных скобках полностью

169:57

предыдущий объект

170:00

Но дальше для него мы

170:04

заменяем два поля Ну сколько нам нужно

170:07

полей столько и меняем Теперь мы н

170:09

конкретно не описываем и нам неважно

170:11

сколько там других полей было в

170:13

состоянии всё будет хорошо видите он

170:16

остаётся У нас вот теперь соответственно

170:18

каждый раз Да когда

170:20

мы меняем там то же самый Reason

170:23

А здесь у нас будет Set

170:28

фом prf группируя возвращаем все

170:32

предыдущие состояния и Reason мы меняем

170:35

на Event Target

170:37

value так есть ли Тут ещё у меня

170:40

какие-нибудь места Ну tog Error честно

170:43

говоря нам больше вообще не нужен то

170:44

есть мы с ним разобрались поэтому всё

170:46

покойся с

170:50

миром

170:52

функция вроде бы всё да то есть обновлю

170:55

Да как видите всё успешно работает

170:57

теперь нет никаких проблем меняем ны всё

171:01

вводится соответственно

171:04

А теперь давайте этот прит тоже

171:07

закомментировать

171:14

того что у меня это учебный ролик могу

171:16

себе позволить

171:17

немножечко бунтарства определённого В

171:20

общем мне нужно отдельный компонент

171:21

создать для того чтобы вам

171:22

продемонстрирую следующую фичу А я не

171:25

буду его выносить там отдельную функцию

171:26

и прочее потому что по логике он сюда

171:28

Классно вписывается В общем компонент у

171:31

меня будет называться State vs RF есь я

171:35

буду

171:39

возвращать

171:41

м Дайте какой-нибудь div

171:47

H3

171:49

Input value Ну и какой-нибудь ипу то

171:53

есть Сейчас я вам всё объясню потому что

171:56

ну более-менее состо этом мы

171:59

разобрались Однако есть ещё А в реакте

172:03

механизмы позволяющие управлять Ну

172:06

взаимодействовать например с тем же

172:07

самым

172:10

инпутов

172:13

ну

172:15

предположим что

172:17

нормально давайте для красоты Я хочу вот

172:21

так вот сделать здесь я укажу fse чтобы

172:23

оно красно не подсвечивать

172:25

и тоже вот для этой кнопки добавим

172:31

Style margin

172:36

Bom Слушайте а это нет это будет

172:39

лишнее потому что мы можем просто

172:42

перенести Вот это стоит в срф сюда и HR

172:45

сюда Всё я думаю что будет так намного

172:50

красивее всё-таки

172:53

нужно добавить какой-то отступ на форму

172:57

это ни на что не влияет с точки зрения

172:59

функционала Но это влияет на некоторую

173:01

эстетику эстетика тоже очень

173:06

важна всё Ура так да и для инпута Мы

173:10

также добавляем ещ и

173:13

класс

173:15

всё отлично значит давайте быстренько

173:18

сделаем рефреш того что мы уже прошли с

173:20

йм опять же вы можете попробовать это

173:22

самостоятельно сделать обработать этот

173:24

инпут и вывести вот сюда значение того

173:26

что сейчас прописано в инпуте да то есть

173:28

хочу здесь динамически получать это

173:32

значение маленькую паузу выдержал могу

173:35

писать да то есть мы знаем US State помо

173:38

учение пустая строчка там здесь у нас

173:40

будет какое-то value Set value

173:45

сюда мы

173:47

вводим мы привязываем

173:49

к много дах

173:52

и здесь у нас

173:55

Event

173:58

evet то есть быстро я написал то что мы

174:03

уже в принципе с вами делали и как мы

174:06

управляли с

174:08

помощью

174:13

эмп экранах называется Two Way binding

174:16

да то есть ну шаблон связан

174:17

непосредственно с функционалом и вот он

174:19

в динамическом режиме так вот

174:20

отображается выглядит это ну реально

174:22

классно но а что допустим если мы хотим

174:26

чтобы вот это вот значение которое мы

174:28

сюда писали сейчас Оно отображалось

174:31

только если я нажму

174:34

Enter Ну мы можем придумать какие-нибудь

174:37

там различные флаги например

174:46

какой-нибудь

174:48

Show Set Show Да и дальше спрашивать

174:53

если

174:54

Show то

174:57

тогда мы будем показывать здесь

175:02

value и при нажатии на enter то есть

175:06

он Ke Down

175:10

handle Ke

175:12

Down нужно создать эту функцию

175:16

принимаем некоторый ивен спросим

175:20

если

175:23

Event Ke равно

175:27

Ender тогда мы делаем Set Show на True

175:32

Ну вот какая-то такая логика

175:34

получается обновляю

175:37

страницу да Видите прописываю нажимаю

175:39

Enter всё оно добавляется то есть в

175:41

целом задача Ну как бы Вполне себе

175:43

решена но есть проблема то есть Enter я

175:47

нажал уже

175:48

а соответственно стоит продолжает

175:51

меняться и Да мы можем добавлять ещё

175:55

какие-нибудь стей чтобы это как-то

175:58

отобразить

175:59

но в общем это будет не совсем корректно

176:03

Поэтому вот для таких ситуаций и Ну я

176:06

просто как базу опять же сейчас вам это

176:07

обрисуйка

176:14

Когда нам не нужно вот так вот в

176:15

динамике постоянно следить за

176:18

всем Мы

176:20

импортируем другой к который называется

176:24

usf и Теперь смотрите как его

176:28

использовать я создам и и просто вызову

176:31

метод

176:34

US дальше у меня вот есть эта константа

176:38

и я могу е с помощью специального

176:40

параметра в jsx который называется

176:43

добавить

176:45

Теперь мы можем удалить вообще

176:48

этот можем удалить

176:52

Он можем удалить этот у нас есть только

176:55

и и

176:57

теперь для того чтобы его отобразить Мы

177:00

здесь указываем

177:03

И у него есть одно свойство о называется

177:08

Cent это

177:13

сво привязан это и ну в нашем случае это

177:17

соответственно и в общем я где-то вместо

177:20

РФА нужно было сказать и Но вы поняли я

177:23

думаю идею да то есть inp curent в

177:25

данном случае это вот этот инпут опять

177:28

же в более продвинутых вариациях это

177:30

может быть ещё и кастомный компонент

177:32

который мы используем но вы знаете да

177:35

где уже это всё посмотреть там где

177:37

готовят к профессии рек разработчика вот

177:40

мы же с вами пока занимаемся основами на

177:43

тубе

177:44

и как следствие так как это у нас дом

177:47

элемент инпута то у него есть значение

177:51

для того чтобы получить это

177:53

значение если я обновлю

177:56

страницу начинаю что-то вписывать там

177:59

допустим владилен нажимаю Enter видите

178:02

владилен у меня отобразил да И теперь

178:05

всё он один раз

178:07

зафиксировал такая вот

178:12

истон

178:16

до смотрите да то есть если мы посмотрим

178:19

в консоль L на то что такое ИТ у нас по

178:23

умолчанию

178:24

и

178:26

И до тех пор пока мы не перешли ещё там

178:29

в GSX и не связали это с

178:33

фом то мы видим что мы получаем объект

178:37

Cent

178:39

Но данже определ что это потому

178:42

прол далее но да то есть покажу тоже

178:46

лайфхак если мы вызовем здесь Deer

178:49

специальное ключевое слово в JavaScript

178:51

позволяющее остановить процесс

178:52

исполнения то это к вопросу о том как

178:56

дебажить

179:01

react то нет он всё равно показывает

179:04

здесь

179:08

inpol вот видите в карте

179:12

находится

179:15

ладно не получилось быстро

179:17

продемонстрировать эту всю

179:20

историю Однако вот на самом деле он

179:22

правильно Показывает То есть пока не

179:24

произошёл рендеринг пока мы не связали

179:26

короче всю эту историю с

179:29

шаблоном Cent он будет undef если вы

179:32

где-то в шаблоне будете обращаться там

179:34

скажем к пусть будет здесь

179:41

H1 к и Cent Да я думаю что так можно

179:45

показать

179:49

это то мы получаем кучу ошибок потому

179:52

что канто ещё не определён то есть мы

179:55

ещё не дошли вот до этого места и не

179:58

связали его то чтобы и соответственно мы

180:01

Обращаемся смотрите это вот у нас undef

180:04

И undef value это всё ошибка беда Вот

180:07

это красны страни смерти поэтому Чтобы

180:10

исправить эту ошибку Мы можем поставить

180:12

знак вопроса

180:14

это просто на будущее небольшой Хак

180:15

видите оно исправляет всю ошибку Вот

180:19

теперь оно как видите

180:22

работает всё это я убрал Это я хотел вам

180:27

продемонстрировать Ну и конечно же если

180:30

говорить уже более профессионально там и

180:33

правильно Да с точки зрения того Чем

180:35

отличается usf от й

180:40

то когда меняет чтоли в рек компоненте

180:44

он вызывает новый цикл рендеринга И за

180:47

счёт этого мы как бы обновляем UI use RF

180:51

же в своём случае он не вызывает цикл

180:54

рендеринга и поэтому мы можем его менять

180:56

он на самом деле меняется сейчас но

181:00

компонент не рендерится есть как бы

181:02

разные Так я опять сломал что

181:06

ли а в общем

181:09

есть продвинутые м моменты Когда мы

181:15

можем сохранять допустим определённое

181:16

состояние в рефе И тем самым как бы

181:21

делиться этой информацией между

181:23

различными компонентами То есть это тоже

181:24

довольно-таки более продвинутая история

181:27

Вот Но пока мы чуть позже ещё вернёмся к

181:30

фам кстати вот сейчас уже скоро будем

181:32

подходить А я вам покажу ещё кейсы

181:34

которые с ним есть но перед этим перед

181:37

этим нам нужно разобраться со следующей

181:40

такой очень важной конструкцией которая

181:43

называет э в это то что идт в базе это

181:47

то что необходимо понимать и поэтому мы

181:50

создадим новый

181:52

компонент который я назову например

181:59

Effect GSX и здесь мы добавим ещё один

182:04

значит компонент

182:12

реакторс

182:18

давайте мы так его назовём

182:19

эффект эк и Давайте в нашем ато

182:27

G добавим ещё один

182:30

T

182:34

эфект Effect

182:37

section по умолчанию у нас

182:40

будет

182:42

э

182:48

я добавлю новый T

182:50

экт эффект и

182:55

эффект так вот как выглядит код Ну и

182:58

теперь по

183:00

умолчанию мы находимся на страничке

183:02

эффектов значит для демонстрации вообще

183:06

того что является у нас эффектами в рете

183:09

Я хочу показать несколько м

183:12

примеров начнём с одной интересной

183:15

задачи в Effect section я добавлю нам

183:19

уже привычную

183:20

кнопочку

183:25

Button

183:26

так тайпинг покинул меня н обещал

183:30

вернуться а

183:32

Ир

183:37

Button Button Button А значит

183:44

открыть

183:48

информацию будет текст на этой

183:51

кнопочки и что я хочу сделать вообще я

183:54

хочу чтобы при нажатии на эту кнопку

183:56

вызывалось модальное окно параллельно я

183:59

вам ещё покажу различные концепции

184:01

которые присутствуют в реакте Ну для

184:04

того чтобы там более жирный получился

184:06

кусок контента Вот Но основной будет

184:09

акцент направлен на эффекты именно чит

184:11

что нам здесь нужно да то есть Давайте

184:13

добавим здесь

184:19

клик и здесь у нас будет функция Open

184:27

Mod пока мы не можем открыть никак

184:30

модельное окно поскольку у нас нет этого

184:32

компонента Так что давайте мы его

184:34

создадим я добавлю папочку Mod заодно

184:37

рассмотрим как Мы это можем сделать Ну и

184:41

будет будем эпо деф новую функцию

184:45

которую назову

184:46

Mod и здесь мы будем возвращать

184:50

специальный

184:52

HTML г который называется Dialog Чуть

184:56

позже я покажу вам Почему именно его так

184:59

как у него есть дополнительный

185:00

функционал связанный с модальными окнами

185:03

в качестве контента мы будем сюда

185:05

передавать именно

185:10

children

185:12

есть-то для это диалога Ну и Давайте

185:15

здесь я его

185:18

добавлю

185:20

Mod будет какой-нибудь здесь очень

185:22

простой контент например

185:26

H3 H From

185:29

Mod

185:33

параграф Можем написать нажимаю T и он

185:36

мне генерирует какой-то базовый

185:40

текст в при посмотрим как это

185:48

выглядит А пока это никак не выглядит

185:51

потому что по умолчанию моду у нас не

185:53

открыт а то есть если мы перейдём и в

185:56

Dialog добавим параметр

185:59

Open то как видите у нас получается вот

186:02

эта вот красота не неимоверная Давайте

186:06

добавим какую-то базовую стилистику для

186:07

этого

186:09

модалка То есть я создам здесь файл

186:14

там допустим будет Model

186:16

CSS сюда вставлю базовые стили для

186:19

диалога Ну

186:21

и просто пока

186:28

импортируются оно теперь более-менее

186:30

красивым Уже получилось а опять же тут

186:32

не про стилистику сейчас да то есть у

186:34

нас есть параметр Open который позволяет

186:36

этим всем манипулировать Почему бы нам

186:38

не создать State в Effect Action который

186:41

будет отвечать за отображение модального

186:42

окна

186:46

Т по умолчанию будет не виден у

186:50

нас Давайте наом просто

186:54

и по правильному писать из

186:58

Open Open Ну что-нибудь в этом духе но

187:02

мы не будем этим заниматься потому что

187:04

выглядит просто красиво так и

187:12

теперь м Model А в функции которая

187:16

позволяет открыть моку мы будем делать

187:18

Set Model

187:20

на True и в моке нам также нужно принять

187:25

этот параметр который будет называться

187:29

Open мы его передаём то есть вот это вот

187:32

нативный H атрибут да который

187:34

присутствует в опиш тега

187:37

Dialog так обновляю

187:40

страницу видите сейчас ничего не видно

187:42

но если я нажимаю открыть информацию то

187:44

появляется наше модальное окно выглядит

187:47

честно говоря так себе Почему Потому что

187:52

если мы посмотрим на стилистику которая

187:53

есть в модальном окне точнее Тут даже

187:56

так скажу две причины есть я прописал

187:59

очень простые стили типа Ман топ и бам

188:02

10М Да из-за этого мы видим что модалка

188:05

она отталкивается короче вот кнопочки Но

188:08

вообще - это такой компонент который

188:11

должен находиться над всеми

188:13

и мы можем это сделать именно через CSS

188:17

Но вообще правильно Даг складывать

188:21

куда-нибудь наверх Там типа вот в по

188:23

HTML структуре чтобы ну он правильно

188:25

находился и мы можем это сделать с

188:27

помощью реакта с помощью специальной

188:29

такой фишки которая называется

188:31

порталы Давайте покажу как это работает

188:34

на самом деле очень простая

188:36

фича Мы импортируем что-то из react дома

188:40

кстати уже наконец-таки дошли до него и

188:43

это что-то называется Create Portal

188:45

теперь вместо того чтобы возвращать

188:47

здесь вот этот GSX я буду возвращать

188:49

здесь Create Portal и первым параметром

188:52

я сюда добавляю GSX а вторым параметром

188:55

Я указываю дом элемент Куда мне

188:57

необходимо за рендерить всю эту историю

189:00

там Get Element by ID Давайте назовём

189:02

его какой-нибудь Mod У нас сейчас нет

189:05

этой молки поэтому точнее этого айдини

189:08

Поэтому мы его можем создать где-нибудь

189:12

здесь

189:15

и теперь если я обновлю страницу и нажму

189:17

открыть информацию видите модалка у меня

189:19

открывается уже в div с ID Model именно

189:23

по этой причине она находится над

189:24

остальными элементами и выглядит это уже

189:26

более правильно то есть безусловно react

189:28

он рисует как бы дерево компонентов но

189:32

благодаря порталам мы можем часть

189:34

функционала вынести из этого древа Ну

189:36

вот например как в случае с мадай

189:39

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

189:40

полезная

189:41

фича О'кей с этим мы разобрались очень

189:45

быстро причём Здорово

189:47

Однако есть другая проблема потому

189:51

что Да у нас открывается модальное окно

189:54

Но нет так называемого бэк дропа это вот

189:56

это затемнение знаете которое появляется

189:58

когда Ну есть всплывающие элементы и у

190:01

дало оно на самом деле присутствует То

190:03

есть можно даже написать так вот

190:08

mdn Dialog mdn - это документация Да а

190:12

которую следует читать периодически тут

190:15

очень много полезной информации есть

190:21

И если мы

190:26

здесь посмотрим в доки то давайте

190:30

перейдём в дом интерфейс сейчас я

190:33

объясню что я

190:35

ещё видите у него есть определённые

190:38

методы есть метод Close есть метод

190:41

Show

190:44

а есть Show Model и он показывает диалог

190:47

модальное окно поверх любых других

190:49

диалоговых окон то есть это то что мы

190:51

хотим использовать сейчас то есть если

190:53

мы А мы как бы сейчас не вызываем на

190:56

самом деле этот метод мы просто

190:57

показываем или не показываем Да с

190:59

помощью State of react но если мы

191:02

вызовем метод

191:04

а Show Model то тогда будет кдп ну

191:09

проблема-то не очень большая на самом

191:11

деле то есть мы можем как написать

191:13

если параметр Open равняется то тогда

191:18

нам нужно сделать F получается этого

191:21

диалога да

191:24

давайте я создам здесь

191:27

Даг равно

191:30

use да то есть опять же Он позволяет

191:34

нам взаимодействовать как раз с

191:40

Эмен да обратиться То есть если Open то

191:45

тогда Di

191:50

curent Mod а иначе Di

191:57

curent там да

192:02

называется Давайте посмотрим исправил ли

192:05

эту

192:08

ситуацию видите у на есть в данном

192:11

случае

192:15

шибки Давайте посмотрим а Да он

192:19

называется ошибки пока связаны с

192:22

неправильным вызовом

192:24

метода так да

192:27

И обновляю

192:30

страницу и всё равно мы видим некоторые

192:33

ошибки в данном случае Почему Потому что

192:36

мым

192:41

про

192:43

справедливое на самом деле замечание у

192:45

реакта

192:46

поскольку Даг Мы создали Но помните я

192:49

показываю Да что вот на текущем этапе он

192:51

ещё равняется

192:53

то есть в данном случае пустой потому

192:57

что он ещё не пришёл

193:00

к работе с шаблоном и не

193:04

привязал и поэтому наша логика в данном

193:07

случае Она работает и

193:11

ки

193:13

нужны эффекты которые позволяют как раз

193:17

таки разобраться с этой ситуацией значит

193:19

Как это работает Значит мы

193:23

импортируем который называется

193:26

use и КТ мы должны использовать

193:30

исключительно в компонентах ну или в

193:32

кастомных хуках мы разберём базу этой

193:35

теории в этом видео чуть дальше но вли

193:41

пока й или от рефа use Effect он ничего

193:45

не возвращает то есть мы просто его

193:47

вызываем и он принимает в себя два

193:49

параметра Первый параметр - это callback

193:53

то есть функция которая

193:56

м как бы будет выполняться когда

193:59

выполнится сам эффект сейчас я поясню а

194:02

второй параметр - это массив массив

194:05

зависимостей вот мы кстати видим он

194:07

называется deps ну dependency list а

194:10

сокращённо то есть от чего должен

194:14

зависеть этот эффект концептуально чтобы

194:17

вы понимали что такое эффект мы с

194:19

помощью этой функции регистрируем

194:22

определённые задачи которые реак

194:24

компоненту необходимо будет

194:26

выполнить и use Effect он начинает

194:30

работать не в момент когда вот react

194:32

прочитал компонент начал что-то там

194:34

выполнять он зарегистрировал эту задачу

194:38

Дальше Он всё это тут делает и как

194:40

только всё это вот завершило

194:43

он уже там зандер всё закончил Тогда он

194:45

начинает делать эти эффекты и теперь вот

194:50

этот история то есть мы Обращаемся здесь

194:53

к диалогу да то есть Нам нужно чтобы

194:55

диалог был определён поэтому мы этот код

194:59

вносим в

195:01

эффект Ну и Давайте

195:04

смотреть как это у нас работает нажимаю

195:06

открыть

195:10

информацию Так секунду

195:13

Да в коде Давайте ещё уберём вот этот

195:15

Open Всё потому что он нам будет сейчас

195:18

мешать нам нужно открывать модал именно

195:21

за счёт РФА обновляю страницу смотрите

195:24

нажимаю открыть

195:26

информацию так ещё

195:29

раз и всё равно пока не работают и здесь

195:34

Также мне сразу же стоит вам объяснить

195:36

одну очень важную вещь именно про

195:38

эффекты то есть видите сейчас у нас

195:40

здесь пустой список зависимостей

195:42

но в зависимостях Мы указываем те

195:46

состояния которые являются реактивными

195:49

Ну и которые влияют именно на

195:51

перерисовка компонентов в нашем случае я

195:53

убрал вот этот параметр Open из диалога

195:56

Да потому что мы будем работать

195:59

самостоятельно открывать мо давку через

196:00

опиш браузера но этот эффект он зависит

196:04

от

196:06

она и поэтому нам этот Open необходимо

196:10

добавить в список зависимости то есть

196:12

теперь эффект будет смотреть Когда

196:14

меняется эта штука и уже выполнять этот

196:16

код такая логика здесь Давайте попробуем

196:19

Да видим уже мода очку Но я ещё раз

196:22

нажимаю открыть информацию Ура У нас

196:25

появляется здесь БК дроп да то есть

196:27

затемнение и появляется сама модалка

196:30

Давайте сразу же чтобы не идти далеко а

196:34

мы добавим в

196:36

модал кнопку позволяющую

196:40

закрывать я

196:44

это модальное окно там при

196:52

клики Set Mod на по можно прямо в

196:55

онлайне

196:57

записать информацию закрыть лку видите

197:00

Всё у нас прекрасно работает то есть это

197:03

первый ну необходимый кейс который важно

197:06

понимать при работе с use

197:09

эффектом но также присутствует и другие

197:12

кейсы которые я прямо сейчас вам

197:14

продемонстрирую так

197:17

как даже два У нас есть помните ещё с

197:21

самого начала ролика вот это

197:23

вот место в приложении где у нас

197:27

работает интервал постоянно и показывает

197:29

текущее

197:32

время на самом

197:35

деле Здесь нам по правильному То есть то

197:38

что мы написали это не совсем корректно

197:39

с точки зрения разработки Да и нам по

197:41

правильному Здесь тоже нужно

197:42

использовать эффект И сейчас я объясню

197:44

почему да давайте тоже сюда перейдём в

197:46

header jsx какой-то код

197:49

есть Смотрите дело в том что мы в

197:53

каком-то компоненте берём и создаём

197:55

интервал всё работает вроде бы успешно и

197:58

нет никаких проблем но а что будет если

198:01

Ну вдруг по какой-то причине мы возьмём

198:04

там и удалим хр как

198:06

компонент опять же вы можете придумать

198:08

какой-нибудь другой компонент не но суть

198:11

в том что мы его там допустим

198:13

переключаем та то есть Он исчезает из

198:15

дом дерева но таймер мы не Чистим и

198:19

получается что у нас происходит утечка

198:21

памяти потому что таймер Постоянно

198:22

работает а функционала нет мы потом

198:26

заново его открываем появляется новый

198:27

таймер и так далее То есть нам по

198:30

правильному всегда нужно чистить эти

198:33

таймеры и в данном случае нам на помощь

198:35

может прий

198:38

ки

198:41

это добавляем к нам необходимо его

198:45

импортировать и дальше мы говорим что

198:49

этот код мы оборачиваем

198:51

как задачку мы говорим что список

198:54

зависимости в данном случае у

198:57

нас будет пустой массив потому что этот

199:00

эффект мы вызовем в момент инициализации

199:03

данного компонента Ну я могу здесь

199:05

консоль

199:07

написать пер

199:09

header экт

199:13

обновлю страницу Вот видите он у нас

199:16

один раз появляется но больше у нас его

199:19

нет потому

199:21

что список Ну как бы этот эффект он ни

199:24

от чего не зависит и поэтому он один раз

199:27

вызывается сколько бы раз хедер у нас не

199:30

рендерится эффект больше не

199:31

затрагивается это тоже очень важный

199:33

момент понимать что эти вещи не

199:35

связаны

199:41

поэтому можем в use перенести весь этот

199:44

код да то есть мы создаём интервал уже в

199:47

нём

199:49

и я его вынесу в константу интервал и

199:53

теперь чтобы нам почистить этот интервал

199:56

Давайте даже я попробую сымпровизировать

199:59

я это не готовил но мне кажется это

200:01

важно объяснить вот у нас видите хедер

200:03

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

200:06

временно Я создам ещ

200:10

один помоча будет

200:14

True visible и Set

200:17

visible и сделаю какой-нибудь

200:20

тайм

200:22

бездушный где я скажу что через 3

200:25

секунды Мне необходимо будет удалить А

200:28

ну точнее поменять лаг visible на false

200:31

да то есть я делаю Set visible на false

200:34

меняю состояние и теперь р я буду

200:37

показывать вот по этим вот условиям Да

200:39

если visible тогда header вот нам это

200:43

поможет сейчас немного рассмотреть

200:44

ситуацию хр по умолчанию есть но через 3

200:47

секунды Он исчезает Да но таймер мы

200:49

сейчас Не чистили поэтому таймер

200:51

продолжает

200:52

тикать и вот ну бывают такие ситуации и

200:59

поэтому

201:01

А для того чтобы при удалении компонента

201:05

очищать вот эти всякие там слушатели

201:08

интервалы тайм-ауты и так далее в Ю

201:10

эффекте

201:12

с пустым списком зависимости Да потому

201:15

что опять же этот эффект отработает

201:18

когда компонент будет за рендере мы

201:20

можем

201:22

вернуть

201:24

функцию которая будет это всё дело

201:26

очищать то есть здесь мы можем написать

201:28

функционал позволяющий очистить всякие

201:32

там опять же интервалы и прочее вот то

201:34

есть я могу здесь написать

201:39

клинг Теперь смотрите ждём 3 секунды

201:43

И как только у нас исчезает р видите у

201:45

нас появляется строчка cleaning то есть

201:48

вместо коло Да теперь мы можем написать

201:50

Clear инвал и сюда передаём экземпляр

201:54

этого интервала теперь у нас не будет

201:56

утечек памяти то есть теперь это

201:57

правильно написанный код Вот это тоже

202:00

одно из

202:02

применений Ю эффекта вот естественно

202:08

давайте мы не будем удалять наш р но

202:11

таким образом вы тоже можете тестировать

202:14

вернёмся в Effect Action и здесь я хочу

202:17

показать следующий пример использование

202:20

ю эффекта для того чтобы делать Запрос к

202:23

серверу к Кэн и асинхронно выводить

202:26

какие-либо элементы а сразу же покажу Ну

202:30

это у нас большая тема такая достаточно

202:32

покажу как это

202:34

делать с разными лоде и прочим Давайте

202:37

заведём состояние значит динг и Set

202:43

н по умолчанию он будет равняться лсу То

202:47

есть у нас не будет никакой загрузки

202:49

происходить

202:50

это этот функционал чтобы он нам не

202:53

мешал мы можем

202:55

вынести вот сюда в одну строчку чтобы

202:57

всё это было как мы будем делать запрос

203:00

Давайте перейдём на

203:03

J просто пишем в Гугле и переходим на й

203:06

ссылки предположим мы будем получать

203:09

здесь

203:10

пользователей сюда и вот наша ссылочка

203:14

значит как не нужно делать запросы в

203:16

реакте Ну мы можем подумать что

203:21

А здесь когда определяется компонент мы

203:25

вызываем ч вставляем сюда URL Ну и там

203:28

дальше начинаем уже

203:30

делать функцию

203:33

асинхронной ждать пока там фч выполнится

203:36

и так далее так делать точно не нужно

203:38

Почему Потому что механика реакта

203:40

устроена таким образом что каждый раз

203:43

когда меняется стейт компонент заново

203:45

создаётся он рендерится и каждый раз мы

203:47

будем делать эти запросы который будут

203:50

улетать на сервер в лучшем случае мы

203:53

заспамить забанены в худшем случае мы

203:56

войдём в рекурсию из-за постоянной

203:58

перерисовки и всё наше приложение просто

204:02

сломается Поэтому в данном случае мы

204:05

используем

204:10

use с пустым набором параметров потому

204:13

что пока мы не зависим ни от какого

204:15

состояния и здесь мы уже можем

204:18

а делать запрос Значит сам запрос я пишу

204:23

В отдельной асинхронной функции которую

204:26

я назову fch

204:30

users здесь мы делаем А ну с помощью

204:33

нативного ча я буду делать запрос

204:36

получаем

204:37

НС и дальше мы получаем данные

204:42

Да рано A resp J то есть мы их приводим

204:46

непосредственно

204:48

к жена вот у нас есть

204:52

данные и после

204:55

этого можем даже назвать их users потому

204:58

что мы точно здесь получаем

204:59

пользователей нам потребуется ещё одно

205:03

состояние

205:05

users Set users по умолчанию это будет у

205:09

нас пустой массив то есть пока

205:12

пользователей нет но как только мы их

205:14

загрузили мы будем делать Set users

205:18

на users После этого мы можем сделать

205:25

Set А как только начали грузить мы

205:27

сделаем Set на видите как точечно мы

205:31

управляем вот этими

205:32

состояниями в каждый момент того что

205:35

происходит но я хочуть ше внимание на то

205:38

что здесь я только описал

205:40

функционал запросу на

205:43

сервак я не вызываю эту функцию эту

205:46

функцию я вызываю в самом use эффекте

205:50

таким образом если её вызвать где-то вне

205:53

то Ничего работать не

205:55

будет И теперь нам осталось

205:58

только это всё визуально отобразить но

206:02

здесь мы можем так написать если у нас

206:04

состояние

206:05

Дин тогда мы будем показывать

206:07

какой-нибудь параграф где будет написано

206:12

можем кстати

206:14

посмотреть Вот видите у нас показывается

206:17

динг быстро но потом Он исчезает потому

206:19

что данные уже загрузились

206:22

соответственно если у нас не

206:26

динг то тогда мы можем

206:29

показывать

206:33

А давайте здесь я покажу список

206:40

ur и дальше мы здесь

206:43

будем в нём отображать GSX то есть мы

206:48

пробежимся по нашему ту users Map User

206:53

Ну и для каждого элемента будем

206:56

выводить смотрите Да У каждого

206:58

пользователя есть данные нам в целом не

207:01

так важно какие они там вот ID есть и

207:03

есть name то есть будем их

207:05

использовать значит здесь я добавляю

207:08

помните когда есть у нас список нам

207:10

необходим этот параметр чтобы понима

207:11

вообще что происходит Значит это у нас

207:14

будет User ID А сюда мы будем

207:17

вводить User name такая примерно логика

207:22

Давайте

207:23

посмотрим Ну и как видите великолепно

207:26

абсолютно То есть у нас появляется

207:28

список уже реально пользователей который

207:30

прилетел с бэнда мы можем легко в этом

207:33

убедиться если перейдём во вкладку

207:35

Network и вот у нас пользователи prw вот

207:39

их данные которые

207:42

нам любезно предоставит json

207:45

placeholder так Нам нужен ещё отступ вот

207:49

этой

208:01

кнопочки margin

208:04

Bom

208:08

1м всё

208:11

и Как видите загрузка данных успешно

208:14

произошла то есть таким образом это и

208:16

работает в реакте кста видите Каждый раз

208:18

когда мы переходим происходит

208:20

загрузка

208:23

и ещё раз хочу пробежаться вот по этой

208:26

логике Да а почему всё-таки это в Ю

208:29

эффекте находится Представьте если бы мы

208:31

это сделали вот без ю эффекта Ну вот

208:35

скажем таким вот вульгарным

208:38

образом мы сразу же получаем

208:41

Да ошибку что слишком много рендеров да

208:45

происходит достигнуть лимит из-за

208:48

бесконечного цикла потому

208:51

что как бы компонент начинает быть

208:53

инициализирован создаёт там свой раз

208:56

вызывается функция но в функции

208:59

происходит сразу же изменение стейта и

209:01

он начинает снова рендерится а тут снова

209:04

как бы изменение стейта понимаете идею

209:06

из этого проходит бесконечный ксть

209:09

катери деть

209:11

и благодаря тому что у него нет списка

209:13

зависимостей никаких в таком случае он

209:18

может ну он один раз вызовет эту функцию

209:21

и всё больше к ней не будет

209:26

[музыка]

209:33

[музыка]

209:41

данных но данный код он не совсем

209:44

корректен с точки зрения того как

209:46

работает react и сейчас я поясню Почему

209:49

И как мы это можем исправить Ну заодно

209:51

ещё одну фишку разберём то есть смотрите

209:53

что происходит когда мы формируем

209:55

асинхронный запрос на сервер Именно

209:57

таким

209:58

образом мы эту функцию объявляем прямо

210:01

внутри react компонента и получается что

210:05

каждый раз когда происходит рендер Ну то

210:09

есть когда мы меняем соответственно

210:11

react видит эти изменения он

210:13

перерисовывать шаблон он же каждый раз

210:15

заходит в эту функцию и каждый раз

210:17

заново её создаёт и получается что так

210:21

как мы используем её в Ю эффекте вроде

210:23

бы всё хорошо один раз но мы можем в

210:25

теории попасть в опять же циклична

210:28

зависимость В общем это не совсем

210:30

корректно поэтому у нас

210:32

есть на самом деле два варианта Ну из

210:36

основных подходов как исправить эту

210:37

ситуацию чтобы это было корректно в в

210:41

первую очередь самый простой способ Мы

210:43

можем взять и определение этой функции

210:45

вынести непосредственно в сам use Effect

210:49

и таким образом что мы здесь его

210:51

определили вот эта вот задача Да которая

210:53

в Ю эффекте она вызове всего лишь один

210:55

раз Ну потому что нет списка

210:57

зависимостей и получается тогда что

211:00

проблема решена функция создаётся один

211:02

раз вызывается и всё нет никаких проблем

211:04

да то есть если мы посмотрим на

211:06

результат нам

211:09

НВ

211:12

то вот мы видим что список пользователей

211:18

загружается Да и нет никаких проблем то

211:20

есть всё хорошо второй вариант он такой

211:23

более продвинутый опять же эту всю

211:25

тематику мы подробно Разбираем В платной

211:30

программе потому что ну она обширная она

211:32

требует понимания там более серных

211:36

частей

211:37

врете номы

211:39

можем другой к который называется use

211:43

callback и он предназначен как раз-таки

211:45

ну для таких ситуаций Когда нам не нужно

211:49

чтобы функция создавалась заново у неё

211:52

получается будет новый указатель Да

211:54

потому что это специфика хранения

211:56

функции и объектов в

211:58

JavaScript там Смысл в том что Ну

212:01

например одинаковый

212:04

объект Да мы можем сравнить с таким же

212:07

ровно

212:09

объектом так я понял смотрите мы создаём

212:12

кон а ра а ра

212:16

1 мы

212:18

создаём b если мы посмотрим а ра B

212:22

видите получаем ЛС Хотя объекты

212:24

абсолютно одинаковые Смысл в том Да что

212:27

у них разные указатели И поэтому они

212:29

интерпретируются как абсолютно разные

212:31

Так

212:31

вот если эта функция она будет

212:36

перерисовывать это означает что нужно

212:37

будет перерисовывать остальные В общем

212:39

элементы в дереве поэтому мы можем грубо

212:43

говоря её зашивать так чтобы у неё не

212:45

менялся указатель и это как раз-таки

212:47

достижимо с помощью вот этого хука USB

212:49

Как это работает примерно следующим

212:52

образом Значит мы

212:54

создаём users это будет результат работы

212:58

метода USB и здесь мы уже

213:02

указываем код который нам необходимо

213:04

выполнить Здесь также Я указываю список

213:07

зависимостей если бы здесь были какие-то

213:12

элементы от которых зависит наше

213:14

состояние я беру это всё сюда вырезаю

213:16

делаю э вещь

213:19

асинхронным значит users отсюда убираю

213:23

вот у нас получился этот users но сейчас

213:27

Давайте посмотрим Будет ли он работать

213:28

он работает но по правильному так как к

213:32

всё-таки зависит от этой функции А у неё

213:34

есть изменение состояний то нам также

213:37

нужно закинуть е сюда и вот теперь этот

213:40

код тоже будет работать но опять же

213:42

здесь не стоит увлекаться там как бы с

213:44

лком нужно отходить всё-таки от той

213:46

задачи которая у вас стоит по

213:47

оптимизации

213:49

приложения зачастую я вот например писал

213:52

бы внутри use эффекта или более

213:54

правильно выносил бы там в архитектуру в

213:58

отдельные как бы сервисы которые есть

214:00

для выполнения запросов или бы Поработал

214:03

с ТК quy но это уже более продвинутая

214:05

история а тоже про них рассказываем В

214:08

платной программе подробно но а

214:10

экосистему вы сможете найти информацию

214:13

под данным видео

214:16

всё возвращаемся к продолжению

214:18

разработки и знаете как заключение

214:21

вообще теоретической составляющей нашего

214:24

вводного курса Я бы хотел всё же

214:27

показать вам что такое кастомные хуки

214:29

потому что Тема важная тема не то чтобы

214:33

супер сложная хочу чтобы у вас было

214:35

понимание Как это работает И для этого

214:39

Яре следующую задачу давайте у нас есть

214:43

список пользователей мы будем ещё их

214:46

фильтровать динамически для этого значит

214:50

я добавлю здесь фрагмент То есть я

215:05

объединён мы знаем что нам нужно завести

215:08

Добавить сюда добавить

215:12

и как раз-таки это тот случай когда мы

215:14

можем автоматизировать немножечко и

215:16

улучшить нашу работу с итами через

215:19

кастомные хуки смотрите всё очень просто

215:23

я создам папочку HS и у меня будет новый

215:27

файл здесь который будет называться use

215:29

Input JS Обратите внимание что то JS так

215:33

как я здесь не буду использовать никакой

215:36

GSX это будет чистый JavaScript код я

215:39

буду здесь Экспо

215:42

функцию которую

215:45

назову смотрите как бы любые хуки в

215:48

реакте они называются через use и Это

215:52

хороший тон да если мы

215:55

сигнализирует если я назову это не

215:58

[музыка]

216:00

но очень сильно пострадает поэтому когда

216:03

Я создаю кастомный к а по факту это

216:05

какая-то обычная функция

216:07

[музыка]

216:09

язва соответственно дальше обозначаю что

216:12

конкретно мне здесь нужно сделать так

216:16

вот мы знаем что при работе с

216:19

[музыка]

216:25

инпутов помните в хуках и в точнее

216:30

кастомные хуки Я прошу прощения уже

216:33

позный вечер много контента записал

216:37

А хуки типа usate или

216:41

Я говорю мы можем использовать только в

216:44

рамках компонентов или только в рамках

216:46

кастомных хуков так вот кастомный ХК -

216:49

это не что иное как обычная функция и

216:52

здесь как раз таки мы можем

216:54

использовать другие хуки например тот же

216:57

самый создавая его локально это то самое

217:00

место где Вполне себе это приемлемо

217:03

дальше Т мы здесь получаем какое-нибудь

217:09

состояние

217:11

value и мы можем здесь вернуть на самом

217:14

деле что угодно формат мы сами выбираем

217:17

Но для инпута Я уже много раз повторил

217:20

что нам важно значение value и нам важно

217:23

значение onchange а onchange всегда одна

217:27

и та же фиксированная функция то есть

217:29

она принимает в себя некоторый ивент и

217:31

она просто берёт и изменяет это value То

217:33

есть а почему бы нам заранее всё это не

217:35

прописать потому что мы знаем да что

217:37

функционал это будет точно такой и как

217:41

ещё

217:43

дополнительно мы сюда передадим default

217:46

value которая по умолчанию будет

217:47

равняться пустой строчки и default value

217:50

мы закидываем VI State вот весь наш

217:53

простецкий но при этом очень эффективный

217:55

очень полезный кастомный хук теперь как

217:58

его использовать Зачем вообще мы его

218:00

сделали мы его импортируем вместо того

218:03

чтобы создавать здесь State Да мы просто

218:06

делаем

218:08

use input

218:11

Здесь мы получаем ипу по факту и - это

218:15

просто объект у которого есть ключи

218:21

и и так как они присутствуют то а почему

218:25

бы нам просто не развернуть ИТ то есть

218:29

конечно мы можем написать здесь

218:39

ра этом нет

218:41

смысла мы просто Можем написать Вот так

218:44

вот

218:45

и и всё у нас есть binding потому что

218:49

теперь Ну давайте Я временно там

218:51

где-нибудь в H6 Да

218:55

выведу

219:00

inp Вот видите он у нас соответствует то

219:03

есть всё хорошо работает и теперь кстати

219:07

Раз уж Мы дошли до этого

219:09

моментам ть наших пользователей в

219:11

зависимости от того что присутствует в

219:14

этом инпуте как вот момент вывода наших

219:17

всех пользователей мы можем их

219:19

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

219:21

отфильтровать Где на каждой итерации мы

219:23

получаем

219:25

пользователя и будем делать следующее

219:29

User name Давайте приведём его сразу же

219:33

к нижнему

219:34

регистру L

219:38

Case incl

219:40

то есть содержит ли он

219:44

значит

219:45

Input value to Low

219:52

Case фильтруем значит наш массив И в

219:55

результирующий массив То есть то что

219:57

полетит в GSX будет точно содержать то

220:00

что находится сейчас в

220:04

инпуте обновляем страницу Ну и вот

220:06

допустим мы хотим получить

220:09

эрвина

220:12

эвин видите То есть я начинаю что-то

220:15

прописывать и у нас сразу же появляется

220:17

вот этот динамический функционал Как по

220:19

мне это выглядит очень даже впечатляюще

220:22

и сделано это крайне

220:25

просто вот функционал который мы как

220:28

раз-таки автоматизировали с помощью

220:30

инпута Как видите намного проще нежели

220:31

работать там с этим опять йм и так далее

220:34

и так

220:36

далее на этом

220:39

дава и сейчас подведём небольшой итог

220:42

Итак друзья Я рад вас приветствовать уже

220:44

в концовке этого ролика Я надеюсь что вы

220:48

кайфанула и вам понравилась подача вам

220:51

понравились примеры И вам понравились

220:52

объяснения которые Я использовал я

220:54

реально очень много времени потратил для

220:56

того чтобы сделать качественный материал

220:58

Я надеюсь вы это Оцените либо подпиской

221:00

на канал либо там подпиской на бусте Но

221:03

что более важно я вам рекомендую

221:05

ознакомиться с тем что дальше делать

221:06

после этого ролика по ссылке в описании

221:09

к этому видео вы найдёте материал он

221:12

бесплатный где во-первых я вам покажу А

221:15

что вы уже знаете из react И что вам ещё

221:17

нужно изучить потом вам а будет понятно

221:20

какие сторонние библиотеки вам нужно

221:21

узнать и вы узнаете про всю актуальную

221:23

экосистему которая сейчас есть в реакте

221:26

потому что там очень много разных

221:28

библиотек фреймворков и я сделал Для вас

221:30

отдельный список чтобы вы понимали

221:32

вообще куда двигаться на что смотреть и

221:34

что изучать Ну помимо всего прочего там

221:36

же вы сможете найти а задачи которые

221:39

встречают на джунов ской позиции на джун

221:42

плюс позиции и На меловской позиции и я

221:44

вам покажу как вообще их можно решить а

221:47

зная именно технологию react поэтому я

221:50

желаю вам успехов Подписывайтесь там на

221:52

всякие разные соцсети на меня ставьте

221:54

лайки А переходите по ссылочки и будем

221:57

рады вас видеть с командой в других

221:59

видео

Interactive Summary

Владилен Минин представляет базовый курс по React, охватывающий путь от основ до продвинутых концепций. В видео объясняется философия библиотеки, основанная на компонентах, сравнивается декларативный подход React с императивным JavaScript. Рассматриваются ключевые темы: работа с JSX, пропсы, хуки useState, useEffect и useRef, порталы, стилизация через CSS-модули и Styled Components, а также взаимодействие с API и формами.

Suggested questions

6 ready-made prompts