2

我想在场景的顶层添加一些“逻辑组件”。

即我明白了:

<Router>
    <Scene key="root" hideNavBar={true}>
        <Scene key="home" component={HomeContainer} />
        <Scene key="search" component={SearchContainer} />
        <Scene key="list" component={ListContainer} />
        ...
    </Scene>
</Router>

每个容器都使用 connect()() 连接到 Redux,并且每个容器都有自己的 reducer,只有它自己需要。

IE:

export default connect(mapStateToProps, mapDispatchToProps)(HomeContainer)

所以,我需要做的是将“根”场景连接到 Redux 并为其提供通用减速器(所有其他场景都依赖的减速器)。但是有了这个,我想使用componentDidUpdate,componentWillReceiveProps,...来监听,即连接更改时的Netinfo,以更新reducer的状态。

我不确定它是否清楚,我希望它是。如果您需要更多信息,请询问他们。

谢谢您的帮助

解决方案

看看 atlanteh 的答案,看看它说的一切所需的文档 :) https://github.com/aksonov/react-native-router-flux/tree/master/docs

我的最终解决方案是:一切都按预期工作:

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);

它基本上是我之前尝试过的所有东西的混合体,效果很好!没有“已定义密钥 xxx”或其他任何内容。

4

2 回答 2

3

你可以这样做:

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);

而你这个组件作为你的路由器,所以现在你有一个连接到状态的路由器。

请注意,您还可以将 react-native-router-flux 连接到状态,它将调度它所做的导航:

const ConnectedRouter = connect()(Router);

编辑- 避免键已经定义

为避免已定义键,您可以使用:

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}
 />
于 2016-12-15T12:29:56.683 回答
0

如果您正确更新存储中的数据,则任何连接的数据都应刷新。

如果您可以看到操作/reducer 正在运行但连接的组件从不重新渲染,那么您很可能在 reducer 中发生了变异,并且连接的组件永远不会注意到数据更改。

如果您在商店中修改深度嵌套的属性,那么我强烈建议您使用 ImmutableJS。

于 2016-12-15T14:51:11.557 回答