В экосистеме React props (сокращение от
properties) представляют собой механизм передачи данных
от родительского компонента к дочернему. Они позволяют компонента
работать с динамическими значениями и конфигурировать его поведение без
необходимости изменения внутреннего состояния.
Props передаются в компонент через атрибуты в JSX:
function Button({ label, onClick }) {
return <button onCl ick={onClick}>{label}</button>;
}
function App() {
return <Button label="Нажми меня" onCl ick={() => alert('Clicked!')} />;
}
Ключевые моменты:
Часто props деструктурируют сразу в параметрах функции:
function Card({ title, description }) {
return (
<div>
<h2>{title}</h2>
<p>{description}</p>
</div>
);
}
Деструктуризация упрощает доступ к отдельным значениям и делает код более читаемым.
Для props можно задавать значения по умолчанию через
объект defaultProps или через параметр функции:
function Badge({ text = "Новый" }) {
return <span>{text}</span>;
}
// или для классового компонента
Badge.defaultProps = {
text: "Новый"
};
Default props обеспечивают корректное поведение компонента даже при отсутствии соответствующего атрибута.
Для проверки типов props используется пакет prop-types.
Он позволяет явно указать, какого типа должны быть props и обязательны
ли они.
import PropTypes from 'prop-types';
function Profile({ name, age }) {
return <div>{name}, {age} лет</div>;
}
Profile.propTypes = {
name: PropTypes.string.isRequired,
age: PropTypes.number
};
Особенности:
PropTypes.string — строкаPropTypes.number — числоPropTypes.bool — булев типPropTypes.func — функцияPropTypes.array — массивPropTypes.object — объектМожно использовать сложные типы, например массив объектов:
Profile.propTypes = {
friends: PropTypes.arrayOf(
PropTypes.shape({
id: PropTypes.number.isRequired,
name: PropTypes.string.isRequired
})
)
};
TypeScript обеспечивает статическую проверку типов на этапе компиляции, делая код безопаснее и предотвращая ошибки в рантайме.
interface ButtonProps {
label: string;
onClick: () => void;
}
function Button({ label, onClick }: ButtonProps) {
return <button onCl ick={onClick}>{label}</button>;
}
Преимущества TypeScript:
Типизация сложных props:
interface User {
id: number;
name: string;
}
interface UserListProps {
users: User[];
onSelect: (user: User) => void;
}
function UserList({ users, onSelect }: UserListProps) {
return (
<ul>
{users.map(user => (
<li key={user.id} onCl ick={() => onSelect(user)}>
{user.name}
</li>
))}
</ul>
);
}
Props часто используются для передачи функций из родителя в дочерний компонент. Это позволяет дочернему компоненту взаимодействовать с внешним состоянием.
function Counter({ onIncrement }) {
return <button onCl ick={onIncrement}>Увеличить</button>;
}
function App() {
const [count, setCount] = React.useState(0);
return (
<div>
<p>Счёт: {count}</p>
<Counter onIncrem ent={() => setCount(count + 1)} />
</div>
);
}
Особенности:
lifting state up).Особый паттерн передачи данных через props — render props, когда дочерний компонент получает функцию для рендера UI:
function List({ items, render }) {
return <ul>{items.map(render)}</ul>;
}
<List
items={[1, 2, 3]}
render={item => <li key={item}>{item}</li>}
/>
Преимущества render props:
children — это стандартный prop, который содержит
вложенный JSX:
function Container({ children }) {
return <div className="container">{children}</div>;
}
<Container>
<p>Вложенный контент</p>
</Container>
Особенности:
children может быть элементом, массивом элементов или
строкой.Props — ключевой механизм передачи данных в React. Их правильная
типизация с помощью PropTypes или TypeScript обеспечивает безопасное
взаимодействие между компонентами, улучшает читаемость кода и
предотвращает ошибки. Использование функций, children и
render-пропов расширяет возможности компонентов, делая их гибкими и
переиспользуемыми.