Что такое state и props в React?

В React (и React Native), state и props — это два фундаментальных механизма управления данными и поведением компонентов. Они играют ключевую роль в реактивной модели, на которой основана библиотека. Несмотря на то, что они оба отвечают за управление данными, у них разные источники, назначение и правила изменения.

props (свойства)

Что такое props?

props (от слова "properties") — это входные параметры компонента, передаваемые извне, обычно от родительского компонента к дочернему. Они делают компонент настраиваемым и переиспользуемым.

Компоненты React можно представить как функции, которые принимают props как аргументы и возвращают JSX.

function Welcome(props) {
return <Text>Привет, {props.name}</Text>;
}
<Welcome name="Алиса" />

В данном случае:

  • props.name равен "Алиса"

  • Компонент <Welcome /> может быть переиспользован с разными именами

Основные особенности props:

  • Передаются извне — от родителя к потомку.

  • Неизменяемы (read-only) внутри дочернего компонента.

  • Могут быть любого типа: строки, числа, функции, компоненты, объекты, массивы и т.д.

  • Можно использовать деструктуризацию:

function Welcome({ name }) {
return &lt;Text&gt;Привет, {name}&lt;/Text&gt;;
}

Примеры:

1. Передача строки:

&lt;Title text="Добро пожаловать!" /&gt;
function Title({ text }) {
return &lt;Text&gt;{text}&lt;/Text&gt;;
}

2. Передача обработчика события:

&lt;Button title="Нажми" onPress={() =&gt; alert("Кнопка нажата!")} />

3. Передача компонента как пропса (render props):

&lt;Wrapper renderContent={() =&gt; &lt;Text&gt;Динамический контент&lt;/Text&gt;} />

children — специальный проп

Каждый компонент может автоматически получить содержимое, вложенное между его тегами, через props.children.

&lt;Card&gt;
&lt;Text&gt;Это текст внутри компонента Card&lt;/Text&gt;
&lt;/Card&gt;
function Card({ children }) {
return &lt;View&gt;{children}&lt;/View&gt;;
}

state (состояние)

Что такое state?

state — это локальные данные, управляемые внутри самого компонента. Оно используется для хранения информации, которая может изменяться со временем и влияет на отображение UI.

В отличие от props, которые компонент получает извне и не может менять, state — это внутренние, изменяемые данные, контролируемые самим компонентом.

Основные особенности state:

  • Объявляется внутри компонента.

  • Может быть изменён с помощью функции setState (в классах) или useState (в функциональных компонентах).

  • Изменение state автоматически вызывает перерисовку компонента.

  • Используется для управления интерактивным поведением интерфейса (отображение/скрытие элементов, данные форм, лоадеры и т.п.).

Использование state с useState (функциональные компоненты)

import React, { useState } from 'react';
import { Text, Button, View } from 'react-native';
function Counter() {
const \[count, setCount\] = useState(0);
return (
&lt;View&gt;
&lt;Text&gt;Счётчик: {count}&lt;/Text&gt;
&lt;Button title="Увеличить" onPress={() =&gt; setCount(count + 1)} />
&lt;/View&gt;
);
}

Объяснение:

  • useState(0) — создаёт переменную count со значением 0.

  • setCount — функция, изменяющая count.

  • Каждый вызов setCount перерисовывает компонент.

state в классах (реже используется после появления хуков)

class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
increase = () => {
this.setState({ count: this.state.count + 1 });
};
render() {
return (
&lt;View&gt;
&lt;Text&gt;{this.state.count}&lt;/Text&gt;
&lt;Button title="Добавить" onPress={this.increase} /&gt;
&lt;/View&gt;
);
}
}

Можно хранить в state:

  • Числа, строки

  • Объекты (например, формы)

  • Массивы (списки данных)

  • Булевы значения (показ/скрытие)

  • Ссылки на компоненты

  • Любые сериализуемые данные

Различия между props и state

Свойство props state
Кто задаёт Родительский компонент Сам компонент
--- --- ---
Изменяемость Нет (read-only) Да, через setState или useState
--- --- ---
Цель Передача внешних данных Управление внутренними изменениями
--- --- ---
Доступ Через props Через this.state (в классах) или [state, setState]
--- --- ---
Повторное использование Да, можно переиспользовать компонент с разными props Не всегда переиспользуем (уникален для каждой инстанции)
--- --- ---
Влияет на рендер Да Да
--- --- ---

Взаимодействие props и state

Компонент может использовать оба механизма одновременно:

function GreetingCounter({ name }) {
const \[count, setCount\] = useState(0);
return (
&lt;View&gt;
&lt;Text&gt;Привет, {name}! Ты нажал {count} раз(а)&lt;/Text&gt;
&lt;Button title="Нажми" onPress={() =&gt; setCount(count + 1)} />
&lt;/View&gt;
);
}
  • name приходит через props.

  • count управляется через state.

Односторонний поток данных

React построен на принципе одностороннего (унидирекционного) потока данных:

  • Родитель передаёт данные вниз через props.

  • Дочерний компонент может вызвать функцию, переданную через props, чтобы сообщить родителю об изменении (паттерн "поднятие состояния").

Пример обратного вызова:

function Parent() {
const \[value, setValue\] = useState("");
return &lt;Child onChange={setValue} /&gt;;
}
function Child({ onChange }) {
return (
&lt;TextInput onChangeText={(text) =&gt; onChange(text)} />
);
}

Условный рендеринг с использованием state

function Toggle() {
const \[visible, setVisible\] = useState(true);
return (
&lt;View&gt;
&lt;Button title="Переключить" onPress={() =&gt; setVisible(!visible)} />
{visible && &lt;Text&gt;Этот текст можно скрыть&lt;/Text&gt;}
&lt;/View&gt;
);
}

Несколько состояний в одном компоненте

const \[name, setName\] = useState('');
const \[age, setAge\] = useState(0);
const \[isAdmin, setIsAdmin\] = useState(false);

Или можно использовать один объект:

const \[user, setUser\] = useState({ name: '', age: 0, isAdmin: false });
function updateName(newName) {
setUser(prev => ({ ...prev, name: newName }));
}

Оба механизма — state и props — являются основой реактивности и динамического поведения компонентов React. Управление ими позволяет строить интерактивные, адаптивные и масштабируемые пользовательские интерфейсы.