React Native - 在异步操作后导航

时间:2016-03-26 16:51:16

标签: ios reactjs react-native redux react-router-redux

我正在使用React Native和Redux开发移动应用程序,而我正面临软件设计问题。 我想调用REST API(异步操作)进行登录,如果该操作成功,则导航到主视图。 我使用了redux和thunk,所以我已经实现了异步操作,所以我的主要疑问是:我应该把逻辑导航到主视图?

我可以直接从动作访问导航器对象并在那里执行导航吗? 我应该在登录组件中执行此操作吗? (因为我已经这样做了 - 请查看下面的代码。)

componentWillReceiveProps(nextProps){
    if(nextProps.errorLoginMsg){
        Alert.alert("Login Failed", nextProps.errorLoginMsg);
    }
    else if(!nextProps.user.isNull()){
      this.props.navigator.replace({name: 'main'});
    }
  }

我对组件中的逻辑没有信心。似乎不是一个好习惯。还有其他办法吗?

由于

2 个答案:

答案 0 :(得分:0)

这是使用当前Navigator API进行本机反应时最困难的问题之一。我建议有一个路由存储器,它包含当前路由,并且包含连接到该存储的Navigator的组件,并在componentWillReceiveProps上触发导航。

答案 1 :(得分:0)

以下是我如何做的代码:

                const resetAction = NavigationActions.reset( {
                    index  : 0,
                    actions: [
                        NavigationActions.navigate( { routeName: 'Home' } )
                    ]
                } );

                this.props.requestDeleteEvent( {
                    id: eventID
                } ).then( () => {
                    this.props.navigation.dispatch( resetAction );
                } );

内部函数requestDeleteEvent:

export function requestDeleteEvent(requestData) {
    const id = requestData.id;

    return (dispatch, getState) => {
        return fetch(Config.event + id, {
            method: 'DELETE',
            headers: {
                'Content-Type': 'application/json; charset=UTF-8',
            },
        })
            .then((response) => getResponseJson(response))
            .then((responseJson) => {
                    if (responseJson.isSuccess) {
                        return dispatch(deleteEvent(id));
                    } 
                    else {
                        return dispatch(triggerToast({type: 'alert', content: ERROR}));
                    }
                }
            );
        }
    }