Понимание различий между state и props - фундаментальное знание для React-разработчика. Давайте разберем эти концепции подробно.
Props (properties / свойства):
State (состояние):
Характеристика | Props | State |
---|---|---|
Источник данных | Передаются извне (родителем) | Управляется компонентом |
Изменяемость | Неизменяемы (immutable) | Изменяемы (mutable) |
Доступ | Доступны только для чтения | Можно читать и обновлять |
Инициализация | Через атрибуты JSX | Через useState или constructor |
Влияние на рендер | Изменение вызывает рендер родителя | Изменение вызывает рендер текущего компонента |
function Welcome(props) {
// props - только для чтения
return <h1>Hello, {props.name}</h1>;
}
// Использование
<Welcome name="Alice" />
function Counter() {
const [count, setCount] = useState(0); // Инициализация состояния
return (
<button onClick={() => setCount(count + 1)}>
Clicked {count} times
</button>
);
}
Часто state родительского компонента становится props дочернего:
function Parent() {
const [name, setName] = useState('Alice'); // State родителя
// name передается как prop дочернему компоненту
return <Child name={name} />;
}
function Child(props) {
// props.name доступен только для чтения
return <div>{props.name}</div>;
}
Используйте props когда:
Используйте state когда:
Поток данных (Data flow):
Инициализация state из props (Anti-pattern):
// Плохая практика (кроме случаев, когда это действительно необходимо)
constructor(props) {
super(props);
this.state = { value: props.initialValue };
}
Подъем состояния (Lifting state up):
В классовых компонентах:
this.props
this.state
и обновляется через this.setState()
class Timer extends React.Component {
constructor(props) {
super(props);
this.state = { seconds: 0 }; // Инициализация state
}
render() {
return (
<div>
<h1>Seconds: {this.state.seconds}</h1>
<p>Title from props: {this.props.title}</p>
</div>
);
}
}
Правильное понимание различий между state и props критически важно для создания предсказуемых и поддерживаемых React-приложений.