В современных JavaScript-фреймворках, таких как React, управление данными между компонентами является фундаментальной частью архитектуры приложений. Важнейшим инструментом для этого служат props и state, а также их комбинации. Рассмотрим принципы передачи данных и подходы к их использованию.
Props (свойства) — это способ передачи данных от родительского компонента к дочернему. Они позволяют компонентам быть переиспользуемыми и независимыми.
Пример передачи простых данных:
function Greeting({ name }) {
return <h1>Привет, {name}!</h1>;
}
function App() {
return <Greeting name="Алексей" />;
}
name через props.Не только данные можно передавать, но и функции, что позволяет управлять состоянием родителя из дочернего компонента:
function Button({ onClick, label }) {
return <button onCl ick={onClick}>{label}</button>;
}
function App() {
const handleClick = () => {
console.log('Кнопка нажата');
};
return <Button onCl ick={handleClick} label="Нажми меня" />;
}
onClick передаётся как callback.State — это внутреннее состояние компонента, которое
может изменяться с течением времени. В React создаётся с помощью хука
useState:
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Счётчик: {count}</p>
<button onCl ick={() => setCount(count + 1)}>Увеличить</button>
</div>
);
}
count — текущее значение состояния.setCount — функция для изменения состояния.Когда несколько компонентов должны использовать одно и то же состояние, его поднимают к ближайшему общему родителю:
function TemperatureInput({ scale, temperature, onTemperatureChange }) {
return (
<input
value={temperature}
onCha nge={(e) => onTemperatureChange(e.target.value)}
/>
);
}
function Calculator() {
const [temperature, setTemperature] = useState('');
return (
<div>
<TemperatureInput
scale="C"
temperature={temperature}
onTemperatureCha nge={setTemperature}
/>
</div>
);
}
Для элементов формы часто используют контролируемые компоненты, где значение input управляется state:
function NameForm() {
const [name, setName] = useState('');
const handleChange = (e) => setName(e.target.value);
return (
<input type="text" value={name} onCha nge={handleChange} />
);
}
Для передачи данных через несколько уровней компонентов используется React Context:
import { createContext, useContext } from 'react';
const ThemeContext = createContext('light');
function Button() {
const theme = useContext(ThemeContext);
return <button className={theme}>Кнопка</button>;
}
function App() {
return (
<ThemeContext.Provider value="dark">
<Button />
</ThemeContext.Provider>
);
}
ThemeContext.Provider задаёт значение для всех дочерних
компонентов.useContext позволяет получать данные на любом уровне
вложенности.При передаче данных важно сохранять неизменяемость:
const newState = { ...state, name: 'Мария' };
const newArray = [...items, 'новый элемент'];
Передача данных между компонентами является основой для построения реактивных, управляемых и модульных интерфейсов, где каждый компонент имеет ясные границы ответственности и взаимодействует с остальной частью приложения через контролируемые интерфейсы.