Вопросы по React. Версия 1
Ключевые концепции React
Что такое React
?
React
- это открытая (с открытым исходным ко дом) JavaScript-библиотека для фронтенда, предназначенная для создания пользовательских интерфейсов, особенно, если речь идет о создании одностраничных приложений (Single Page Applications, SPA). Она отвечает за слой представления (view) в веб и мобильных приложениях. React
был разработан Jordan Walke - инженером Facebook
. React
был представлен на Facebook News Feed
в 2011 году, а для Instagram
- в 2012 году.
Назовите основные особенности React
Основными особенностями React
является следующее:
- Использование VirtualDOM (виртуальной объектной модели документа) вместо RealDOM (настоящий или реальный
DOM
), поскольку манипуляции с RealDOM являются дорогостоящими с точки зрения производительности. - Поддержка рендеринга на стороне сервера (Server Side Rendering, SSR).
- Следование принципу однонаправленного потока или связывания данных (one-directional data flow).
- Использование переиспользуемых (reusable) компонентов пользовательского интерфейса (User Interface, UI) для формирования слоя представления.
Что такое JSX
?
JSX
(JavaScript и XML) - это XML-подобный
синтаксис, расширяющий возможности ECMAScript
. По сути, он является синтаксическим сахаром для функции React.createElement
, совмещая выразительность JavaScript
с HTML-подобным
синтаксисом разметки.
В приведенном ниже примере текст внутри тега h1
в методе render
возвращается в виде JavaScript-функции
:
class App extends React.Component {
render() {
return (
<div>
<h1>Добро пожаловать в мир React!</h1>
</div>
)
}
}
В чем разница между элементами и компонентами?
Элемент - это обычный объект, описывающий, что мы хотим увидеть на экране в терминах узлов и других частей DOM
. Элементы могут содержать другие элементы в своих свойствах. Создавать элементы в React
легко. Однако после создания, элемент не подлежит изменению.
Объектное представление React-элемента
выглядит так:
const element = React.createElement(
'div',
{ id: 'login-btn' },
'Войти'
)
Функция React.createElement
возвращает такой объект:
{
type: 'div',
props: {
children: 'Войти',
id: 'login-btn'
}
}
Данный объект рендерится с помощью ReactDOM.render()
:
<div id='login-btn'>Login</div>
В отличие от элемента, компонент может определяться по-разному. Он может быть классом с методом render
(классовый компонент) или простой функцией (функциональный компонент). В любом случае компонент принимает свойства (пропы, props от properties) на вход и возвращает JSX
:
const Button = ({ onLogin }) =>
<div id={'login-btn'} onClick={onLogin}>Войти</div>
JSX
транспилируется (преобразуется) в функцию React.createElement
:
const Button = ({ onLogin }) => React.createElement(
'div',
{ id: 'login-btn', onClick: onLogin },
'Войти'
)
Как создаются компоненты?
Существует 2 способа это сделать:
- Функциональные компоненты: это простейший способ создания компонента. Такие функции являются "чистыми" (pure), принимают объект с пропами в качестве аргумента и возвращают элемент (или несколько элементов во фрагменте):
function Greeting({ message }) {
return <h1>{`Привет, ${message}`}</h1>
}
- Классовые компоненты: для определения компонента также можно использовать
ES6-классы
. Приведенный функциональный компонент может быть переписан следующим образом:
class Greeting extends React.Component {
render() {
return <h1>{`Привет, ${this.props.message}`}</h1>
}
}
Когда лучше испол ьзовать классовый компонент, а когда функциональный?
Если компонент нуждается в состоянии или методах жизненного цикла, тогда используйте классовый компонент, иначе, используйте функциональный компонент.
Обратите внимание: в React 16.8
были представлены хуки, позволяющие использовать состояние, методы жизненного цикла и другие возможности классовых компонентов в функциях. В настоящее время классовые компоненты в React
почти не используются.
Что такое "чистые" компоненты?
React.PureComponent
- это то же самое, что React.Component
, за исключением автоматической обработки метода shouldComponentUpdate()
. При изменении пропов или состояния PureComponent
автоматически выполняет их поверхностное (shallow) сравнение. Component
такого сравнения по умолчанию не проводит. Поэтому компонент будет повторно рендерится до тех пор, пока не будет явно вызван метод shouldComponentUpdate()
.
Что такое состояние?
Состояние (state) - это объект, содержащий некоторую информацию, которая может измениться в течение жизненного цикла компонента. Мы всегда должны стараться делать состояние настолько простым, насколько это возможно, и минимизировать количество компонентов без состояния.
Создадим компонент User
с состоянием message
:
class User extends React.Component {
constructor(props) {
super(props)
this.state = {
message: 'Добро пожаловать в мир React!'
}
}
render() {
return (
<div>
<h1>{this.state.message}</h1>
</div>
)
}
}
Состояние похоже на проп, но оно является приватным (замкнуто в своей области видимости) и полностью контролируется компонентом, т.е. оно недоступно для других компонентов, кроме того, которому оно принадлежит и которое его определяет.
Что такое пропы?
Пропы (props) - это входные данные для компонента. Это простые значения (примитивы) или объект, содержащий несколько значений, которые передаются компонентам при их создании с помощью синтаксиса, похожего на атрибуты HTML-тегов
.
Основное назначение пропов в React
заключается в предоставлении компоненту следующего функционала:
- Пере дача данных компоненту.
- Вызов изменения состояния.
- Использование через
this.props.propName
внутри методаrender
компонента.
Создадим элемент со свойством reactProp
:
<Element reactProp={1} />
Этот reactProp
добавляется в качестве свойства ко встроенному объекту props
, который присутствует во всех компонентах React
:
props.reactProp