У меня есть React DOM, который выглядит так:
В состоянии MarketDepthWindow
у меня есть isBackgroundEnabled
, который я хочу передать как реквизит AskOrdersTab
. Но он проходит только начальный реквизит и не обновляется. Оно должно обновляться при нажатии кнопки MarketDepthHeaderComponent
.
Я предполагаю, что проблема в том, что я передаю это как опору TabsContainer
.
Я пытался изменить React.Component
на React.PureComponent
, используя shouldComponentUpdate()
, добавив React.cloneElement
и пропуская реквизиты через TabsContainer
, но у меня ничего не работает.
Может, я допустил какую-то архитектурную ошибку? Может быть, мне стоит как-нибудь использовать ссылки?
class AskOrdersTab extends React.Component {
render() {
return <div>bids</div>
}
}
class BidOrdersTab extends React.Component {
render() {
return <div>asks</div>
}
}
class MarketDepthHeaderComponent extends React.Component {
render() {
return <button class={this.props.isBackgroundEnabled ? 'active' : ''} onClick={this.props.handleBackgroundButtonClick}></button>
}
}
class TabsContainer extends React.Component {
constructor(props) {
super(props)
this.state = {
tabs: props.tabs.tabs || [],
tabHeaderComponent: props.tabs.tabHeaderComponent || ''
}
}
renderComponents() {
let tabsComponents = [];
for (let tab of this.state.tabs.length) {
tabsComponents.push(
<div>{tab.component}</div>
)
}
return tabsComponents;
}
render() {
return (
<>
{this.state.tabHeaderComponent}
{this.renderComponents()}
</>
);
}
}
class MarketDepthWindow extends React.Component {
handleBackgroundButtonClick = (event) => {
this.setState((prevState) => ({
isBackgroundEnabled: !prevState.isBackgroundEnabled
}))
}
constructor(props) {
super(props)
this.state = {
isBackgroundEnabled: true,
handleBackgroundButtonClick: this.handleBackgroundButtonClick
}
}
render() {
let tabsProps = {
tabs: [
{ title: 'Bid', component: <BidOrdersTab {...this.state} /> },
{ title: 'Ask', component: <AskOrdersTab {...this.state} /> }
],
tabHeaderComponent: <MarketDepthHeaderComponent {...this.state} />
}
return <TabsContainer tabs={tabsProps} isBackgroundEnabled={this.state.isBackgroundEnabled} />
}
}
ReactDOM.render(
<MarketDepthWindow />,
document.getElementById("market-depth-window")
);