我有一个App组件,使用react-router,在两个路由中保存一些组件。我还有一个Firebase数据存储,我想绑定到App的状态(使用rebase),所以我可以将它传递给我希望作为道具的任何组件。这是我的App类:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
items: {}
};
}
componentDidMount () {
rebase.bindToState('items', {
context: this,
state: 'items'
})
}
render() {
return (
<Router>
<div className='container'>
<div className="header">
<h3>Header</h3>
<Nav/>
</div>
<Switch>
<Route exact path='/' component={() => <Home items={this.state.items} rebase={rebase} />} />
<Route render={function () {
return <p>Not Found</p>
}} />
</Switch>
</div>
</Router>
)
}
}
现在,当我加载页面时,我得到了两个Home
组件的安装。这本身并不好。但是,我在Home
组件中有几个操作,它们使用rebase来修改/读取Firebase。作为这些操作的回调,它们还会更改Home
组件的状态。问题是,每当我进行Firebase调用时,它都会重新安装Home
组件,而我所拥有的任何状态都会丢失。
如果我从Router
组件中移除Home
包装器,并将其纯粹呈现为render( <Home items={this.state.items} rebase={rebase} /> )
,我的应用程序将按预期完美运行。我不知道为什么把它包装在Router
中会让它无效。我认为这是因为我在调用firebase更新时(例如/?p=sgergwc4
)还有其他URL参数也发生了变化,但我有一个按钮可以更改该参数而不用一个firebase更新它并没有不会引起任何问题(即不会造成重新安装)。那么路由器怎么了?
答案 0 :(得分:4)
原来答案很简单;而不是component={}
,我应该使用render={}
。修复一切。它也在文档中。