30

我有一个使用 Redux 框架的 React Native 应用程序,并且我正在使用 Navigator 组件来处理导航。我在导航工作时遇到了一些麻烦,而且我找不到任何关于如何正确操作的好例子,所以我正在寻找一些帮助和澄清。

这是我目前拥有的内容的要点,它正在工作,但我不知道我是否做得对:

根组件

...
renderScene(route, navigator) {
    console.log('RENDER SCENE', route);
    const Component = route.component;
    return (
        <Component navigator={navigator} route={route} {...this.props} />
    )
}

render() {
    return (
        <Navigator
            renderScene={(route, nav) => this.renderScene(route, nav)}
            initialRoute={{ name: 'Signin', component: Signin }} />
    )
}

登录组件

...
componentWillReceiveProps(nextProps) {
    if (!this.props.signedIn && nextProps.signedIn) {
        console.log('PUSHING TO MAIN');
        nextProps.navigator.push({ name: 'Main', component: Main });
    }
}

问题:

1:我的第一个想法是我应该将navigator.push代码移动到一个动作中。但是componentWillReceiveProps,调用该操作的正确位置是什么?当Signin组件加载时,如果用户已经有一个活动会话,它会触发一个操作来登录用户。默认情况下,他们没有登录,所以当下一个道具通过时,我检查它是否改变,然后推送到Main.

2:在记录“PUSH TO MAIN”后立即在我的控制台日志中,我看到两个“RENDER SCENE”日志:

[info] 'RENDER SCENE', { name: 'Signin', component: [Function: Signin] } (EXPECTED)
[info] 'PUSHING TO MAIN'
[info] 'RENDER SCENE', { name: 'Signin', component: [Function: Signin] } (WHY?)
[info] 'RENDER SCENE', { name: 'Main', component: [Function: Main] }

Signin如果我只是推动组件,我很好奇为什么 RENDER SCENE 会被调用两次(第一个是组件) Main

最初也是在componentWillReceiveProps我只检查的方法中:

if (nextProps.signedIn) {
    nextProps.navigator.push({ name: 'Main', component: Main });
}

但这导致Main组件被推送两次。

4

4 回答 4

10

注意:下面的 GitHub 链接现已弃用,在评论中作者建议react-native-router-flux由同一作者提供。

我刚刚添加了对 Redux 的支持,我的新组件https://github.com/aksonov/react-native-redux-router使导航非常容易,比如调用 Actions.login

于 2015-11-23T15:57:20.217 回答
3

这不是一个 redux 实现,但对于路由,我发现 react-native-router-flux 非常有用。

你可以做一些事情,比如打电话

Actions.login 

导航到登录视图。路由在您的索引文件中定义,并具有用于定义导航栏元素的可选模式。

https://github.com/aksonov/react-native-router-flux

于 2015-10-16T19:55:21.800 回答
2

1)是的,将其移至方法,componentWillReceiveProps可能不正确。很难为您重构该部分,因为我不会从该组件上的该方法中获得该逻辑,即 signinComp 应该接收它是否具有身份验证会话的状态(而不是自己弄清楚)。它导致它无缘无故地被处理;因为如果他登录你重定向。我个人会在 renderScene 中进行检查,因为导航会被传递下来,您只需在子组件上进行推送/弹出并在一个 renderScene 中处理您的所有逻辑。

2) 像一副纸牌一样查看导航堆栈。当你设置场景时,它是一张牌,但当你推动它时,另一张牌会添加到牌堆中。因此,当您按下并拥有两张卡片时,它会检查以确保所有卡片都正面朝上并渲染,以便当您按下或弹出时,它会移回已完成的卡片或场景。想象一下立即将 5 个场景压入堆栈。因此,当您更改堆栈时,它会检查以确保所有内容都已呈现并准备好使用该后退按钮。就我个人而言,我认为这不是最优的(但它必须如此,因为你可以在你推送的每个场景中传递不同的属性)。

您可能可以将此行更改为:

    renderScene={this.renderScene}
于 2015-10-11T07:33:17.557 回答
0

问题1:
我建议你在 shouldComponentUpdate 方法中处理导航器逻辑,如下所示,

   shouldComponentUpdate(nextProps, nextState){

    if(nextProps.isLoggedIn != this.props.isLoggedIn && nextProps.isLoggedIn === true){
        //will redirect
        // do redirect option

        return false;
    }

    return true;
}

问题 2:
我认为这是 react-native 的错误。

于 2016-04-28T09:15:00.687 回答