Разберёмся почему Реакт в своей основе это самый обычный Джаваскрипт
Погнали дальше! Про Джсх и его отличия от ХТМЛ узнали, с Джаваскриптом разобрались, пора эти знания соединять.
Реакт — это чистый Джаваскрипт. Я об этом говорил и буду говорить: Реакт это чистый Джаваскрипт и это касается не только того, что в Джсх можно писать выражения, но и того, что сам Реакт может работать без всяких Джсх и прочих Вебпаков. Давайте разберёмся.
Как обычно писали сайты? Создавали .html
-страницу, туда тегом <script src=""></script>
подключали Джс (или писали прямо внутри тегов), так и жили.
Потом сайты усложнялись, превращались в приложения, пришла Нода с NPM-ом (пакетным менеджером), появились всякие RequireJS, Браузерифай и прочее, и прочее, и прочее.
Примерно в 2014-2015 этот пик достиг апогея и появились 6to5 (ныне Babel), systemjs и Вебпак. Честно говоря, освоить тогда Реакт было тяжко — нужно было сначала разобраться со всем этим тулингом. Поэтому сегодня мы изучим Реакт as is, без всяких пекейдж манагеров и модуль бандлеров. Погнали!
Открываем документацию Реакта и идём сразу в Installation → CDN Links. Сама документация посвящена уже работе с Джсх, поэтому будем, так сказать, на своих двоих со всем этим разбираться.
Реакт делится на две библиотеки: Реакт и РеактДОМ.
Чем занимается Реакт? В чём вообще смысл Реакта? Реакт строит дерево элементов и оптимизировано его обновляет через VirtualDOM.
Это всё! В этом весь смысл Реакта: минимальными усилиями отрисовать дерево элементов. К сожалению, обновление самим браузером очень тяжелое, вот и приходится тянуть Реакт, чтобы этим заниматься. ВиртуалДОМ хранит в памяти текущую версию дерева и когда получает обновления, строит новое, затем сравнивает их между собой и ищет отличные куски.
Но если Реакт только строит дерево элементов, кто работает с браузером? РеактДОМ. РеактДОМ это рендерер — то, что рендерит дерево Реакта куда-либо. В данном случае — в ДОМ.
Бывают ещё react-native, react-tv, redocx (рендеринг в
.docx
!), react-blessed (в терминал!).
Если мы подключим Реакт и РеактДОМ, то у нас будут доступны два объекта: React
и ReactDOM
. У каждого из них есть свой АПИ (интерфейс для работы с библиотекой), нас интересуют функции React.createElement()
и ReactDOM.render()
, с помощью них мы и напишем простенькое приложение.
Работать мы будем в онлайн-песочнице: например, в JSFiddle. Обычно используют CodeSandbox — там есть поддержка современных библиотек и фреймворков.
Hello, world
это самое примитивное приложение, которое выводит строку Hello, world.
В index.html
подключим React и ReactDOM, а наш код будем писать в третьем <script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Курс по Реакту</title>
</head>
<body>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script>
// здесь будет код
</script>
</body>
</html>
скрипты подключаются перед закрывающим
</body>
чтобы не блокировать загрузку страницы
Теперь создадим див с айди app
— он нам понадобится как место, куда будет рендерить РеактДОМ.
...
<body>
<div id="app"></div>
...
</body>
...
Теперь в третьем script
напишем наш первый компонент.
...
<script>
// нам к нему нужно будет обращаться, поэтому назначим в константу
const PlainHelloWorld = React.createElement('h1', null, 'Hello World');
</script>
...
В функции createElement
три параметра: компонент, пропы и чилдрен.
Вторым важным плюсом Реакта после ВиртуалДОМ является компонентный подход: вы можете объединять своё приложение в компоненты и использовать их. Что такое компоненты? Компоненты это функции или классы (об этом позже), которые возвращают реакт-дерево. Давайте попробуем написать свой первый компонент?
const HelloWorld = function() {
return React.createElement("h1", null, "Hello World");
};
Здесь ничего сложного нет — вместо ссылки на наш h1
мы сделали компонент HelloWorld
, с которым будем работать
Пропы — это объект со всеми атрибутами, который приходит в компонент при его вызове. Например, атрибут src
в <img />
будет доступен под props.img
в функции function Img(props) { ... }
.
Но как вкладывать компоненты друг в друга, мы же работаем с деревом? Для этого есть специальный проп props.children
— именно он и передаётся третьим параметром в createElement
.
Окей, звучит всё непонятно, память вроде бы запомнила, давайте теперь это всё отрендерим — в этом нам поможет ReactDOM.render(component, element)
.
<script>
// нам к нему нужно будет обращаться, поэтому назначим в константу
const PlainHelloWorld = React.createElement('h1', null, 'Hello World');
// сделаем свой компонент
const HelloWorld = function() {
return React.createElement('h1', null, 'Hello World');
}
// отрендерим
ReactDOM.render(PlainHelloWorld, document.getElementById("app"));
// если бы мы хотели отрендерить свой компонент, то его нужно было бы сначала вызвать через createElement
// ReactDOM.render(React.createElement(HelloWorld, null, null), document.getElementById("app"))
</script>
iframe: https://jsfiddle.net/hehL6x6t/2/embedded/result,html,js/
Это всё. Сегодняшний урок не очень практический и очень теоретический, но мне важно было показать вам на примерах, что Реакт — это чистый Джаваскрипт и вся его работа сводится к двум самым обычным функциям: React.createElement()
и ReactDOM.render()
. В будущем вам это понимание понадобится.
Задание? Попробуйте это всё собрать у себя локально!