Самый простой и часто используемый метод передачи данных.
Родительский компонент:
function ParentComponent() {
const [message, setMessage] = useState('Привет от родителя!');
const user = { name: 'Алексей', age: 30 };
return (
<ChildComponent
text={message}
userData={user}
onUpdate={setMessage}
/>
);
}
Дочерний компонент:
function ChildComponent({ text, userData, onUpdate }) {
return (
<div>
<p>Полученный текст: {text}</p>
<p>Пользователь: {userData.name}, {userData.age} лет</p>
<button onClick={() => onUpdate('Новое сообщение')}>
Обновить
</button>
</div>
);
}
Полезно для композиции компонентов.
Родительский компонент:
function ParentComponent() {
return (
<Container>
<h1>Это будет передано как children</h1>
<p>Любое содержимое</p>
</Container>
);
}
Дочерний компонент:
function Container({ children }) {
return <div className="wrapper">{children}</div>;
}
Для передачи данных через много уровней без явного пробрасывания.
Создание контекста:
const UserContext = createContext();
function App() {
const [user, setUser] = useState({ name: 'Мария', role: 'admin' });
return (
<UserContext.Provider value={{ user, setUser }}>
<ParentComponent />
</UserContext.Provider>
);
}
Использование в дочернем компоненте:
function DeepChildComponent() {
const { user, setUser } = useContext(UserContext);
return <p>Пользователь: {user.name}</p>;
}
Важный частный случай передачи данных - передача функций для обратной связи.
Родительский компонент:
function ParentComponent() {
const handleDataFromChild = (data) => {
console.log('Данные от ребенка:', data);
};
return <ChildComponent sendData={handleDataFromChild} />;
}
Дочерний компонент:
function ChildComponent({ sendData }) {
const clickHandler = () => {
sendData({ message: 'Привет родителю!' });
};
return <button onClick={clickHandler}>Отправить данные</button>;
}
Примитивы (строки, числа, булевы):
<ChildComponent name="Иван" age={25} isActive={true} />
Объекты и массивы:
<ChildComponent
user={{ name: 'Ольга', id: 123 }}
items={['Яблоко', 'Груша']}
/>
JSX-элементы:
<ChildComponent header={<h1>Заголовок</h1>} />
Избегайте prop drilling (глубокого пробрасывания):
Документируйте props:
ChildComponent.propTypes = {
text: PropTypes.string.isRequired,
onUpdate: PropTypes.func
};
Оптимизируйте передачу объектов:
const memoizedUser = useMemo(() => ({ name, age }), [name, age]);
Основные способы передачи:
Что можно передавать:
Лучшие практики:
Совет: Для сложных приложений комбинируйте разные подходы - простые props для близких компонентов, Context API для глобальных данных, state-менеджеры для сложных состояний.