Поднятие состояния вверх (Lifting State Up) - это паттерн в React, который позволяет передавать состояние state
от дочерних компонентов к родительским, чтобы сделать их состояние синхронизированным.
Часто несколько компонентов должны отражать одни и те же изменяющиеся данные. Их состояние может быть поднято вверх по иерархии компонентов к их общему родительскому компоненту. Это позволяет синхронизировать состояние между дочерними компонентами и обеспечивает более простую и единообразную обработку данных.
Например, представим, что у нас есть компонент Parent
и два дочерних компонента ChildA
и ChildB
. Оба дочерних компонента имеют свои локальные состояния, но они также зависят от общего состояния, которое должно быть синхронизировано между ними.
class Parent extends React.Component {
constructor(props) {
super(props)
this.state = { count: 0 }
this.handleIncrement = this.handleIncrement.bind(this)
}
handleIncrement() {
this.setState({ count: this.state.count + 1 })
}
render() {
return (
<div>
<ChildA count={this.state.count} onIncrement={this.handleIncrement} />
<ChildB count={this.state.count} onIncrement={this.handleIncrement} />
</div>
)
}
}
class ChildA extends React.Component {
constructor(props) {
super(props)
this.state = { localCount: 0 }
this.handleIncrement = this.handleIncrement.bind(this)
}
handleIncrement() {
this.setState({ localCount: this.state.localCount + 1 })
this.props.onIncrement()
}
render() {
return (
<button onClick={this.handleIncrement}>
ChildA: {this.props.count + this.state.localCount}
</button>
)
}
}
class ChildB extends React.Component {
constructor(props) {
super(props)
this.state = { localCount: 0 }
this.handleIncrement = this.handleIncrement.bind(this)
}
handleIncrement() {
this.setState({ localCount: this.state.localCount + 1 })
this.props.onIncrement()
}
render() {
return (
<button onClick={this.handleIncrement}>
ChildB: {this.props.count + this.state.localCount}
</button>
)
}
}
Здесь мы используем Parent
компонент для управления общим состоянием count
, а затем передаем это состояние в дочерние компоненты ChildA
и ChildB
через свойство count
. Также мы передаем функцию handleIncrement
в дочерние компоненты через свойство onIncrement
, чтобы они могли уведомлять родительский компонент о том, что состояние должно быть обновлено.
Поднятие состояния вверх позволяет избежать дублирования логики и обеспечивает более простую и единообразную обработку данных между компонентами.