Вы можете поднять состояние для amountOfPlayers
в свой <Leauge />
компонент, чтобы:
- обновления могут запускаться с <LeagueBadge />
- и это состояние может быть передано вашему <LeagueInfo />
компоненту
Это позволит вам совместно использовать и синхронизировать состояние между братьями и сестрами <LeagueInfo />
и <LeagueBadge />
по мере необходимости.
Чтобы сделать это, вам нужно добавить обратный вызов onClick
к <LeagueBadge />
, который срабатывает при нажатии на элемент img
. В методе рендеринга <Leauge />
вы можете предоставить логику, которая увеличивает состояние amountOfPlayers
в <Leauge />
. Когда amountOfPlayers
увеличивается и вызывается setState
(в <Leauge />
), это, в свою очередь, заставит ваш <Leauge />
компонент перерисовать себя (и потомков / братьев и сестер). Поскольку обновленное значение для amountOfPlayers
передается в качестве опоры компоненту <LeagueInfo />
, это обновленное значение будет отображаться в <LeagueInfo />
- эффективно достигая того, что вам нужно.
Что-то подобное может работать для вас:
class LeagueBadge extends Component {
render() {
// Add props.onClick callback to trigger click event in <League />
// component
return (
<img src={this.props.badgeUrl} alt="missing alt text"
onClick={() => this.props.onClick()} />
);
}
}
class LeagueInfo extends Component {
constructor(props) {
super(props);
this.state = {
// amountOfPlayers: null, // This is not needed, as it's supplied by props
rpPerSecond: null,
rpCost: null,
};
}
render() {
return (
<div>
<h4>{this.props.name} players: {this.props.amountOfPlayers}</h4>
<h4>RP per second: {this.props.rpPerSecond}</h4>
<h4>RP cost: {this.props.rpCost}</h4>
</div>
);
}
}
class League extends Component {
componentWillMount() {
this.setState({
amountOfPlayers : 0
})
}
render() {
// Locally defined function that increments amountOfPlayers and
// updates state
const incrementAmountOfPlayers = () => {
this.setState({ amountOfPlayers :
this.state.amountOfPlayers + 1 })
}
return (
<div>
<LeagueBadge badgeUrl={this.props.badge}
onClick={ () => incrementAmountOfPlayers() } />
<LeagueInfo name={this.props.name} amountOfPlayers={ this.state.amountOfPlayers } />
</div>
);
}
}