【发布时间】:2019-09-11 03:05:00
【问题描述】:
我有一个看起来像这样的 React DOM:
在MarketDepthWindow 的状态下,我有一个isBackgroundEnabled,我想将它作为道具传递给AskOrdersTab。但它只传递初始道具而不是更新。它应该在MarketDepthHeaderComponent 的按钮单击时更新。
我认为问题在于我将它作为道具传递给TabsContainer。
我尝试将React.Component 更改为React.PureComponent,使用shouldComponentUpdate(),添加React.cloneElement 并通过TabsContainer 传递道具,但对我没有任何作用。
也许我犯了某种架构错误?也许我应该以某种方式使用 refs?
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")
);
【问题讨论】:
-
你的意思是它不会更新作为 prop 传递的组件的状态吗?
-
听起来有点傻,但你不必将道具称为“this.props”,而不仅仅是道具,即使在构造函数中也是如此。现在想想有点奇怪。
标签: javascript reactjs react-props