Javascript 顶级组件根场景/路由器反应本机路由器流量
我想在场景的顶层添加一些“逻辑组件” i、 e我明白了:Javascript 顶级组件根场景/路由器反应本机路由器流量,javascript,reactjs,react-native,react-native-router-flux,Javascript,Reactjs,React Native,React Native Router Flux,我想在场景的顶层添加一些“逻辑组件” i、 e我明白了: <Router> <Scene key="root" hideNavBar={true}> <Scene key="home" component={HomeContainer} /> <Scene key="search" component={SearchContainer} /> <Scene key="list" comp
<Router>
<Scene key="root" hideNavBar={true}>
<Scene key="home" component={HomeContainer} />
<Scene key="search" component={SearchContainer} />
<Scene key="list" component={ListContainer} />
...
</Scene>
</Router>
所以,我需要做的是将“根”场景连接到Redux,并为其提供通用的减缩器(其他所有场景都依赖的减缩器)。
但是有了它,我想使用componentDidUpdate,componentWillReceiveProps。。。在连接更改时侦听,即Netinfo,以更新减速器的状态
我不确定是否清楚,我希望是这样。如果你需要更多的信息,就问他们
谢谢你的帮助
解决方案
看看亚特兰蒂斯的答案,看看它所说的所有需要的文件:)
我的最终解决方案是:一切按预期运行:
const ConnectedRouter = connect()(Router)
const scenes = Actions.create(
<Scene key="root" hideNavBar={true}>
<Scene key="home" component={HomeContainer} />
</Scene>
)
class ReduxRouter extends Component {
componentWillReceiveProps(newProps) {
if(!newProps.isConnected) {
// logic
}
}
render() {
return (
<ConnectedRouter scenes={scenes} {...this.props}/>
)
}
}
const mapStateToProps = (state) => {
return {
// State
}
}
const mapDispatchToProps = (dispatch) => {
return bindActionCreators({
// Actions
}, dispatch);
}
export default connect(mapStateToProps, mapDispatchToProps)(ReduxRouter);
const ConnectedRouter=connect()(路由器)
const scenes=Actions.create(
)
类ReduxRouter扩展组件{
组件将接收道具(新道具){
如果(!newProps.isConnected){
//逻辑
}
}
render(){
返回(
)
}
}
常量mapStateToProps=(状态)=>{
返回{
//陈述
}
}
const mapDispatchToProps=(调度)=>{
返回bindActionCreators({
//行动
},派遣);
}
导出默认连接(mapStateToProps、mapDispatchToProps)(ReduxRouter);
它基本上是我以前尝试过的所有东西的混合,效果非常好!没有“密钥xxx已定义”或其他任何内容。您可以执行以下操作:
class MyRouter extends React.Component {
componentWillReceiveProps(newProps) {
if(!newProps.network.isActive) {
// do something here
}
}
render() {
<Router>
<Scene key="root" hideNavBar={true}>
<Scene key="home" component={HomeContainer} networkActive={this.props.network.isActive} />
<Scene key="search" component={SearchContainer} />
<Scene key="list" component={ListContainer} />
...
</Scene>
</Router>
}
}
const mapStateToProps = state => state;
export default connect(mapStateToProps)(MyRouter);
编辑-已定义避免键
要避免已定义的密钥,可以使用:
const scenes = Actions.create(
<Scene key="root" hideNavBar={true}>
<Scene key="home" component={HomeContainer} networkActive={this.props.network.isActive} />
<Scene key="search" component={SearchContainer} />
<Scene key="list" component={ListContainer} />
...
</Scene>
)
const scenes=Actions.create(
...
)
然后在路由器中:
<ConnectedRouter
scenes={scenes}
/>
如果要正确更新存储中的数据,则应刷新所有连接的数据 如果可以看到操作/减速器正在运行,但连接的组件从未重新渲染,则很可能是减速器中的状态发生变化,并且连接的组件从未注意到数据更改
如果您正在修改存储中的深度嵌套属性,那么我强烈建议使用ImmutableJS。这是我尝试过的,但我有“密钥xxx已定义”,我认为最好避免这种情况。。。但你所说的真正问题是,当我尝试它时,它没有刷新我的其他组件(场景)。每个容器都已连接。。。不知道为什么:/看到关于已经定义的键的更新答案..我不理解你评论的另一部分..你说它没有更新你的场景是什么意思?关于你上次的更新,这实际上是有效的,但是这样的话我怎么还能使用组件方法呢?我看了文档,已经尝试了那里的一切(比如你的第一个和第二个答案)。“它没有更新我的场景”,我的意思是,当reducer的状态改变时,它不会刷新其他场景道具(但我可以看到,该操作已经完成,日志)。谢谢你的帮助,非常感谢!没有更多的细节,很难理解如何解决这个问题。。你能给出一个简单的场景,你期望发生什么,以及实际发生了什么吗?我找到了问题的解决方案,看看我的编辑。谢谢你的帮助!:)
const scenes = Actions.create(
<Scene key="root" hideNavBar={true}>
<Scene key="home" component={HomeContainer} networkActive={this.props.network.isActive} />
<Scene key="search" component={SearchContainer} />
<Scene key="list" component={ListContainer} />
...
</Scene>
)
<ConnectedRouter
scenes={scenes}
/>