Автор оригинала: FreeCodeCamp Community Member.
Эта статья не собирается покрывать, что реагирует или Почему вы должны узнать это Отказ Вместо этого это практическое введение в основы REVECT.JS для тех, кто уже знаком с JavaScript и знает основы Дом API Отказ
Все приведенные ниже примеры кода маркируются для справки. Они чисто предназначены для обеспечения примеров концепций. Большинство из них могут быть написаны гораздо лучшим способом.
Фундаментальный # 1: Реагировать все о компонентах
Реагистрация разработана вокруг концепции многоразовых компонентов. Вы определяете небольшие компоненты, и вы собираете их вместе, чтобы сформировать большие компоненты.
Все компоненты маленькие или большие многоразовые, даже в разных проектах.
Актуальный компонент – в его простейшей форме – является простой функцией JavaScript:
// Example 1 // https://jscomplete.com/repl?j=Sy3QAdKHW function Button (props) { // Returns a DOM element here. For example: return ; } // To render the Button component to the browser ReactDOM.render(, mountNode)
Курли, используемые для метки кнопки, объяснены ниже. Не беспокойтесь о них сейчас. Реагировать
Также будет объяснено позже, но если вы хотите проверить этот пример, и все примеры предстоящих кодов, вышеупомянутые оказывать
Функция – это то, что вам нужно.
Второй аргумент к Reactom.runder
это элемент назначения DOM, который реагирует, собирается взять и контролировать. В JSComplete React Playground , вы можете просто использовать специальную переменную Mountnode
Отказ
JavaScript Repland и Playground для React.js Испытайте современный JavaScript и REVIET.JS код в браузере без каких-либо конфигураций jscomplete.com/react.
Обратите внимание на следующие пример 1:
- Название компонента начинается с заглавной буквы. Это требуется, поскольку мы будем иметь дело со смесью элементов HTML и элементы реагирования. Строчные имена зарезервированы для элементов HTML. На самом деле идите вперед и попробуйте назвать кнопку «React Component», и посмотрите, как Reactry проигнорирует функцию и отображает регулярную пустую кнопку HTML.
- Каждый компонент получает список атрибутов, таких как элементы HTML. В реакции этот список называется реквизит Отказ С помощью функционального компонента вы можете назвать это ничего.
- Мы странным написали, что выглядит как HTML в возвращенном выходе
Кнопка
Функциональный компонент выше. Это ни JavaScript, ни HTML, и это даже не Rect.js. Но настолько популярно, что он стал по умолчанию в реактивных приложениях. Это называется Jsx И это расширение JavaScript. Jsx тоже компромисс ! Перейдите вперед и попробуйте верните любой другой HTML-элемент внутри функции выше и посмотрите, как все они поддерживаются (например, вернуть текстовый входной элемент).
Фундаментальный # 2: Какой поток jsx?
Пример 1 выше может быть написан в Pure Revief.js без JSX следующим образом:
// Example 2 - React component without JSX // https://jscomplete.com/repl?j=HyiEwoYB- function Button (props) { return React.createElement( "button", { type: "submit" }, props.label ); } // To use Button, you would do something like ReactDOM.render( React.createElement(Button, { label: "Save" }), mountNode );
творчество
Функция – это основная функция в API RACH верхнего уровня. Это 1 из 8 вещей в этом уровне, который вам нужно учиться. Вот как маленький API RACT.
Очень похоже на сам дом, имеющий Document.Createlement
Функция для создания элемента, указанного в имени тега, Rection творчество
Функция – это функция более высокого уровня, которая может делать то, что Document.Createlement
Делает, но он также может быть использован для создания элемента для представляющей реактивный компонент. Мы сделали последнее, когда мы использовали Кнопка
Компонент в примере 2 выше.
В отличие от Document.Createlement
, Рейкт творчество
Принимает динамическое количество аргументов после второго, чтобы представлять дети созданного элемента. Итак, творчество
на самом деле создает дерево Отказ
Вот пример этого:
// Example 3 - React's createElement API // https://jscomplete.com/repl?j=r1GNoiFBb const InputForm = React.createElement( "form", { target: "_blank", action: "https://google.com/search" }, React.createElement("div", null, "Enter input and click Search"), React.createElement("input", { name: "q", className: "input" }), React.createElement(Button, { label: "Search" }) ); // InputForm uses the Button component, so we need that too: function Button (props) { return React.createElement( "button", { type: "submit" }, props.label ); } // Then we can use InputForm directly with .render ReactDOM.render(InputForm, mountNode);
Обратите внимание на несколько вещей о примере выше:
Informform
не является компонентом реагирования; Это просто реагировать элемент Отказ Вот почему мы использовали его прямо вReactom.runder
Звоните, а не с/>. -
Rect.Createelement
Функция приняла несколько аргументов после первых двух. Его список аргументов, начиная с 3-го одного, включает в себя список детей для созданного элемента. - Мы смогли гнездить
Rect.Createelement
звонки, потому что это все JavaScript. - Второй аргумент к
Rect.Createelement
Может быть нулевой или пустой объект, когда для элемента для элемента для элемента не требуется никаких атрибутов или реквизитов. - Мы можем смешивать элемент HTML с реактивными элементами.
- API Reg api пытается быть как можно ближе к API DOM, поэтому мы используем
классное значение
вместоКласс
для входного элемента. Тайно, мы все желаем, чтобы API Regact станет частью самого самого API DOM. Потому что, вы знаете, это намного лучше.
Вышеуказанный код – это то, что браузер понимает, когда вы включите библиотеку RACT. Браузер не имеет дело с каким-либо бизнесом JSX. Тем не менее, мы люди любим видеть и работать с HTML вместо этого творчество
Звонки (представьте себе создание сайта только Document.Createelement
, который вы можете!). Вот почему компромисс JSX существует. Вместо того, чтобы написать форму выше Rect.Createelement
Звонки, мы можем написать его с синтаксисом, очень похожим на HTML:
// Example 4 - JSX (compare with Example 3) // https://jscomplete.com/repl?j=SJWy3otHW const InputForm =; // InputForm "still" uses the Button component, so we need that too. // Either JSX or normal form would do function Button (props) { // Returns a DOM element here. For example: return ; } // Then we can use InputForm directly with .render ReactDOM.render(InputForm, mountNode);
Обратите внимание на несколько вещей приведенных выше:
- Это не HTML. Например, мы все еще делаем
классное значение
вместоКласс
Отказ - Мы все еще рассматриваем, что выглядит как HTML выше как JavaScript. Посмотрите, как я добавил точку запятой в конце.
То, что мы писали выше (пример 4) – это JSX. Тем не менее, то, что мы взяли в браузер, это скомпилированная версия IT (пример 3). Чтобы это произошло, нам нужно использовать предварительный процессор для преобразования версии JSX в Rect.Createelement
версия.
Это jsx. Это компромисс, который позволяет нам написать наши компоненты реагирования в синтаксисе, похожий на HTML, что является довольно хорошей сделки.
JSX, кстати, можно использовать самостоятельно. Это не только реагированная вещь.
Фундаментальный # 3: Вы можете использовать выражения JavaScript в любом месте jsx
Внутри раздела JSX вы можете использовать любое выражение JavaScript в паре фигурных скобок.
// To use it:ReactDOM.render(, mountNode);// Example 5 - Using JavaScript expressions in JSX // https://jscomplete.com/repl?j=SkNN3oYSW const RandomValue = () => { Math.floor(Math.random() * 100) }; // To use it: ReactDOM.render(, mountNode);
Любое выражение JavaScript может пройти внутри этих фигурных скобок. Это эквивалентно $ {}
Синтаксис интерполяции в JavaScript Шаблонные литералы Отказ
Это единственное ограничение внутри JSX: только выражения. Так, например, вы не можете использовать обычный Если
Заявление, но тройное выражение в порядке.
Переменные JavaScript также являются выражениями, поэтому, когда компонент получает список реквизитов (компонент ranteryValue
Protuction не, реквизит
Необязательно), вы можете использовать эти реквизиты внутри фигурных скобок. Мы сделали это в Кнопка
Компонент выше (пример 1).
Объекты JavaScript также являются выражениями. Иногда мы используем объект JavaScript внутри вьющихся скобок, что делает его как двойные фигурные скобки, но это действительно просто объект внутри вьющихся скобок. Один используемый случай из этого должен пройти объект стиля CSS к специальному Стиль
Атрибут в реакции:
// Example 6 - An object passed to the special React style prop // https://jscomplete.com/repl?j=S1Kw2sFHb const ErrorDisplay = ({message}) =>{message}; // Use it: ReactDOM.render(, mountNode );
Обратите внимание, как я разрушены только сообщение из аргумента реквизита. Также обратите внимание, как Стиль
Атрибут выше – особенный (опять же, это не HTML, он ближе к API DOM). Мы используем объект как значение Стиль
атрибут. Этот объект определяет стили, как если бы мы делаем это с JavaScript (потому что мы есть).
Вы даже можете использовать реактивный элемент внутри JSX, потому что это тоже является выражением. Помните, что элемент реагирования по существу является функцией вызова:
// Example 7 - Using a React element within {} // https://jscomplete.com/repl?j=SkTLpjYr- const MaybeError = ({errorMessage}) =>{errorMessage &&; // The MaybeError component uses the ErrorDisplay component: const ErrorDisplay = ({message}) =>} {message}; // Now we can use the MaybeError component: ReactDOM.render(0.5 ? 'Not good' : ''} />, mountNode );
RedeRor
Компонент выше только отобразит Errordisplay
Компонент, если есть errormessage
Строка передана ему и пустой Div
Отказ Реагирование считает {правда}
, {false}
, {undefined}
и {NULL}
быть действительным элементом детей, которые ничего не делают.
Вы также можете использовать все функциональные методы JavaScript на коллекции ( Map
, Уменьшить
, Фильтр
, Concat
и т. Д.) Внутри JSX. Опять же, потому что они возвращают выражения:
// Example 8 - Using an array map inside {} // https://jscomplete.com/repl?j=SJ29aiYH- const Doubler = ({value=[1, 2, 3]}) =>{value.map(e => e * 2)}; // Use it ReactDOM.render(, mountNode);
Обратите внимание, как я дал ценность
Образуйте значение по умолчанию выше, потому что все просто JavaScript. Обратите внимание, что я выводил выражение массива внутри Div
Отказ Реагировать в порядке с этим; Он будет разместить каждое удвоенное значение в текстовом узле.
Фундаментальный # 4: Вы можете написать компоненты реагирования с классами JavaScript
Простые функциональные компоненты отлично подходят для простых потребностей, но иногда нам нужно больше. Реагирование поддерживает создание компонентов через Синтаксис класса JavaScript также. Вот …| Кнопка Компонент (в примере 1), написанный с синтаксисом класса:
// Example 9 - Creating components using JavaScript classes // https://jscomplete.com/repl?j=ryjk0iKHb class Button extends React.Component { render() { return ; } } // Use it (same syntax) ReactDOM.render(, mountNode);
Синтаксис класса прост. Определите класс, который расширяется Ract.component
(Еще один верхний уровень API API, которую вам нужно учиться). Класс определяет функцию одного экземпляра Render ()
И эта функция Render возвращает виртуальный элемент DOM. Каждый раз, когда мы используем Кнопка
Компонент на основе класса выше (например, делая <КНОПКА ...
/>), Rect создать объект из этого классового компонента и использовать этот объект для рендеринга элемента DOM в дереве DOM.
Это причина, по которой мы использовали This.props.label
Внутри JSX в визуализированном выходе выше. Поскольку каждый элемент, представленный через компонент класса, получает специальный экземпляр Недвижимость под названием реквизит
Это содержит все значения, переданные к этому элементу, когда он был создан.
Поскольку у нас есть экземпляр, связанный с одним применением компонента, мы можем настроить этот экземпляр, как мы желаем. Например, мы можем настроить его после того, как он построен с помощью обычного JavaScript Конструктор
Функция:
// Example 10 - Customizing a component instance // https://jscomplete.com/repl?j=rko7RsKS- class Button extends React.Component { constructor(props) { super(props); this.id = Date.now(); } render() { return ; } } // Use it ReactDOM.render(, mountNode);
Мы также можем определить функции класса и использовать их где угодно, в том числе внутри возвращенного выхода JSX:
// Example 11 — Using class properties // https://jscomplete.com/repl?j=H1YDCoFSb class Button extends React.Component { clickCounter = 0; handleClick = () => { console.log(`Clicked: ${++this.clickCounter}`); }; render() { return ( ); } } // Use it ReactDOM.render(, mountNode);
Обратите внимание на несколько вещей в примере 11 выше:
-
Handleclick
Функция написана с использованием новых предложенных Синтаксис классов-поле в JavaScript. Это все еще на этапе 2, но по многим причинам это лучший вариант для доступа к установленному компоненту экземпляра (благодаря функциям стрелки). Но вам нужно использовать компилятор, такой как Babel, сконфигурированный для понимания этапа 2 (или синтаксис поля класса), чтобы получить код выше для работы. Jscomplete reft имеет предварительно настроен. - Мы также определили
ClickCounter
Переменные экземпляра используют один и тот же синтаксис поля класса. Это позволяет нам пропустить, используя комбинацию класса Constructor. - Когда мы указали
Handleclick
Функция как значение специальногоOnClick
Атрибут реагирования, мы не назвали это. Мы прошли в Ссылка кHandleclick
функция. Вызов функции на этом уровне является одним из наиболее распространенных ошибок при работе с реагированием.
// Wrong: onClick={this.handleClick()} // Right: onClick={this.handleClick}
Фундаментальные # 5: События в реакции: два важных различия
При обработке событий внутри элементов React React есть две очень важные различия от того, как мы делаем это с API DOM:
- Все атрибуты React Elements (включены события) снимаются с использованием камера , а не строчные буквы Отказ Это
OnClick
, неOnClick
Отказ - Мы передаем фактическую ссылку на функцию JavaScript в качестве обработчика события, а не строки. Это
onclick = {
Handleclick}
, неOnClick = "
handleclick” Отказ
Реагируйте взаимодействуют объект события DOM с собственным объектом для оптимизации производительности обработки событий. Но внутри обработчика событий мы все еще можем получить доступ к всем способам, доступным на объекте DOM Event. Реагируйте пропуски, которые завернули объект события на каждый вызов ручки. Например, чтобы предотвратить форму действий по поводу представления по умолчанию, вы можете сделать:
// Example 12 - Working with wrapped events // https://jscomplete.com/repl?j=HkIhRoKBb class Form extends React.Component { handleSubmit = (event) => { event.preventDefault(); console.log('Form submitted'); }; render() { return (); } } // Use it ReactDOM.render(, mountNode);
Фундаментальный # 6: каждый компонент реагирования имеет историю
Следующее относится только к компоненту класса (те, которые расширяют React.comPonent
). Функциональные компоненты имеют немного другой истории.
- Во-первых, мы определяем шаблон для реагирования на создание элементов из компонента.
- Затем мы проинструктивуем реагируют использовать его где-то. Например, внутри
оказывать
Вызов другого компонента или сReactom.runder
Отказ - Затем реагировать реагировать элемент и дает ему набор реквизит что мы можем получить доступ к
Это .props
Отказ Эти реквизиты именно то, что мы прошли на шаге 2 выше. - Так как это все JavaScript,
Конструктор
Способ будет вызван (если определен). Это первый из того, что мы называем: Методы жизненного цикла компонентов Отказ - Затем реагируйте вычисляют выходной способ рендеринга (виртуальный узел DOM).
- Поскольку в первую очередь реагируют реагирование на элемент, отреагируйте взаимодействие с браузером (от нашего имени, используя DOM API) для отображения там элемента. Этот процесс обычно известен как Монтаж Отказ
- Реагистрация затем вызывает другой метод жизненного цикла, называемый
ComponentDidmount
Отказ Мы можем использовать этот метод, например, сделать что-то на доме, который мы теперь знаем, существует в браузере. До этого метода жизненного цикла DOM мы работаем, было все виртуальным. - Некоторые компоненты истории заканчиваются здесь. Другие компоненты размонтируются из браузера DOM по разным причинам. Прямо до последнего случается, Rect вызывает другой метод жизненного цикла,
ComponentWillunmount
Отказ - Государство любого установленного элемента может измениться. Родитель этого элемента может восстановить. В любом случае установленный элемент может получить другой набор реквизитов. Реагирование магии происходит здесь, и мы на самом деле начнем нуждается в Реагируйте на данный момент! До этого момента нам не нужно вообще реагировать, честно.
История этого компонента продолжается, но до того, как она делает, нам нужно понять это Государство вещь, о которой я говорю.
Фундаментальный # 7: Актуальные компоненты могут иметь частное состояние
Ниже также применимо только к компонентам классов. Я упоминал, что некоторые люди называют компонентами только на презентации тупой ?
Государство
Свойство является особенным в любом компонентах Ract Class. Реагирование контролирует каждое состояние компонента для изменений. Но для реагирования на это эффективно делать, мы должны изменить государственное поле через другую вещь API API, которую нам нужно учиться, this.setState
:
// Example 13 - the setState API // https://jscomplete.com/repl?j=H1fek2KH- class CounterButton extends React.Component { state = { clickCounter: 0, currentTimestamp: new Date(), }; handleClick = () => { this.setState((prevState) => { return { clickCounter: prevState.clickCounter + 1 }; }); }; componentDidMount() { setInterval(() => { this.setState({ currentTimestamp: new Date() }) }, 1000); } render() { return (); } } // Use it ReactDOM.render(Clicked: {this.state.clickCounter}
Time: {this.state.currentTimestamp.toLocaleString()}
, mountNode);
Это самый важный пример, чтобы понять. Он в основном завершит ваши фундаментальные знания о реакцию. После этого примера есть несколько других маленьких вещей, которые вам нужно учиться, но в основном вы и ваши навыки JavaScript с этого момента.
Давайте пройдемся по примеру 13, начиная с полей класса. У него есть два из них. Особенный Государство
поле инициализируется объектом, который содержит ClickCounter
который начинается с 0
и а CurrentTimestamp
который начинается с Новая дата ()
Отказ
Поле второго класса – это Handleclick
Функция, которую мы передали на OnClick
Событие для элемента кнопки внутри метода рендеринга. Handleclick
Метод изменяет этот состоятель экземпляра компонента, используя SetState
Отказ Обратите внимание на это.
Другое место, где мы изменяем состояние, находится внутри интервального таймера, который мы начали внутри ComponentDidmount
метод жизненного цикла. Он отмечает каждую секунду и выполняет другой звонок в this.setState
Отказ
В методе Render мы использовали два свойства, которые мы имеем в состоянии с нормальным синтаксисом чтения. Для этого нет специального API.
Теперь обратите внимание, что мы обновили состояние, используя два разных способа:
- Передав функцию, которая вернула объект. Мы сделали это внутри
Handleclick
функция. - Передавая регулярный объект. Мы сделали это внутри интервала обратного вызова.
Оба направления приемлемы, но первый является предпочтительным при чтении и записи в состояние одновременно (что мы делаем). Внутри интервального обратного вызова мы пишем только государству и не читаем его. В случае сомнений всегда используйте первый синтаксис функции AS-аргумента. Это безопаснее с гоночными условиями, потому что SetState
всегда следует рассматривать как асинхронный метод.
Как мы обновляем состояние? Мы возвращаем объект с новым значением того, что мы хотим обновить. Обратите внимание, как в оба призыва к SetState
Мы только передаем одну собственность от государственного поля, а не оба. Это совершенно хорошо, потому что SetState
на самом деле сливается То, что вы проходите (возвращенное значение аргумента функций) с существующим состоянием. Итак, не указав недвижимость при звонке SetState
Значит, мы хотим не изменить это свойство (но не удалять его).
О, #ReaCtjs , если вы так в имен влагосвященные, почему вы назвали его устанавливать, когда вы явно должны назвать его планируемой программировкой
Фундаментальный # 8: Реагистрация реагирует
Реагировать получает свое название от того, что это реагирует к государственным изменениям (хотя и не реактивно, но по расписанию). Была шутка, которая должна быть реагирована по имени Расписание !
Однако то, что мы свидетельствуем с невооруженным глазом, когда состояние любого компонента обновляется, заключается в том, что реагировать реагировать на это обновление и автоматически отражает обновление в браузере DOM (при необходимости).
Подумайте о введении функции рендеринга как:
- Реквизиты, которые передаются родителем
- Внутреннее частное состояние, которое может быть обновлено в любое время
Когда вход изменений функций рендеринга, его выход может измениться.
Реагистрация сохраняет запись истории рендуков и когда она видит, что один визуализация отличается от предыдущего, он вычисляет разницу между ними и эффективно переводит его в фактические операции DOM, которые выполняются в DOM.
Фундаментальный # 9: React – ваш агент
Вы можете подумать о реагировании как агенту, который мы наняли, чтобы общаться с браузером. Возьмите текущий дисплей Timestamp выше в качестве примера. Вместо того, чтобы мы вручную ходили в браузер и вызовущие операции DOM API, чтобы найти и обновить P # Timestamp
Элемент каждую секунду мы только что изменили свойство в состоянии компонента и реагируют на работу с браузером на нашем имени. Я верю, что это правдивая причина, почему Rection популярна. Мы ненавидим разговаривать с мистером браузером (и так много диалектов JOM язык, который он говорит), и реагирует, добровольно делать все разговоры для нас, бесплатно.
Фундаментальный # 10: каждый компонент React имеет историю (часть 2)
Теперь, когда мы знаем о состоянии компонента и то, как, когда это происходит, что некоторые изменится, давайте узнаем последние несколько концепций об этом процессе.
- Компонент может потребоваться восстановить, когда его состояние обновляется или когда его родитель решает изменить реквизиты, которые он передал компонент
- Если последний случается, Rect вызывает другой метод жизненного цикла,
ComponentWillReceiveProps
Отказ - Если либо объект состояния или прошедшие реквизиты изменяются, реагирование имеет важное решение. Если компонент будет обновлен в доме? Вот почему он вызывает еще один важный метод жизненного цикла здесь,
должен быть необходим
Отказ Этот метод является реальным вопросом, поэтому, если вам нужно настроить или оптимизировать процесс рендера самостоятельно, вы должны ответить на этот вопрос, возвращая либо правда или ложь. - Если нет пользовательских
должен быть необходим
Указано, реагируйте по умолчанию на очень умную вещь, которая на самом деле достаточно хороша в большинстве ситуаций. - Во-первых, Rect вызывает другой метод жизненного цикла на данный момент,
ComponentWillUpdate
Отказ Реагирование будет вычислением нового отображения оказанных выходов и сравнить его с последним результатом. - Если отобранный вывод точно такой же, Rect ничего не делает (не нужно говорить с мистером браузером).
- Если есть разница, отреагировать это различие в браузер, как мы видели раньше.
- В любом случае, поскольку в любом случае произошел процесс обновления (даже если выход был точно такой же), Rect вызывает конечный метод жизненного цикла,
ComponentDidupdate
Отказ
Методы жизненного цикла фактически избегают люки. Если вы не делаете ничего особенного, вы можете создавать полные приложения без них. Они очень удобны для анализа того, что происходит в приложении, и для дальнейшего оптимизации производительности обновлений реагирования.
Вот и все. Поверьте, или нет, с тем, что вы узнали выше (или части этого, действительно), вы можете начать создавать некоторые интересные приложения Ractex. Если вы голодны для большего, проверьте мой Узнать React.js by Строительные игры книга!
Благодаря многим читателям, которые рассмотрели и улучшили эту статью, Лукашский Сезвчак, Тим Бройлз, Кайл Холден, Роберт Аксельс, Брюс Лейн, Ирвин Вальдман и Эми Уиллы.
Изучение реагировать или узел? Оформить заказ моих книг: