美文网首页React Native学习
react-navigation集成Redux

react-navigation集成Redux

作者: sybil052 | 来源:发表于2018-01-22 16:32 被阅读598次

之前觉得将react-navigation集成redux完全没什么必要,因为react-navigation基本可以满足日常导航的开发和使用,可是当项目需求足够复杂的时候,你会发现react-navigation集成redux是一件多棒的事情。
react-navigation goBack()传参返回无效文章中遇到的问题用下面讲的这个方法可以完美解决:react-navigation集成Redux之后,能获取当前screen的key,routeNmae等参数,goBack()的时候就可以直接取到key,不需要修改源码。

一、集成

我们还用上篇的项目集成。

1.添加addNavigationHelpers

找到app.js,代码如下:

...
import {
    addNavigationHelpers,
    NavigationActions,
} from 'react-navigation';
import AppNavigator from '../constants/routers';
...
render() {
        const { dispatch, nav } = this.props;
        return (
            <AppNavigator
                // ref={nav => { this.navigator = nav; }}
                navigation={addNavigationHelpers({
                    dispatch: dispatch,
                    state: nav
                })}
            />
        );
    }
const mapStateToProps = state =>({
    nav: state.nav,
});

export default connect(mapStateToProps)(App);

2. 创建navReducer

在reducers文件夹下新建navReducer.js

/**
 * Created by sybil052 on 2017/9/28.
 */
import Routers from '../constants/routers';

const recentlyVisitedRoutes = new Set();//防止連點,多次navigate,增加此判斷
const navReducers = (state, action) => {
    if (action.type === 'Navigation/NAVIGATE') {
        if (recentlyVisitedRoutes.has(action.routeName)) {
            return state;
        }
        recentlyVisitedRoutes.add(action.routeName);
        setTimeout(() => {
            recentlyVisitedRoutes.delete(action.routeName);
        }, 400);
    }
    const newState = Routers.router.getStateForAction(action, state);
    return newState || state;
};

export default navReducers;
3.修改index

依旧在reducers文件夹下找到index.js,添加navReducers

...
import nav from './navReducers';
const rootReducer = combineReducers({
    app,
    ...
    nav,
});

export default rootReducer;

二、使用

1. 在mapStateToProps中添加routes
function mapStateToProps(state) {
    return {
        routes: state.nav.routes,
        ...
    };
}
2.获取routes
// 返回上上个界面
back() {
     const routes = this.props.routes;
     console.log(routes);
     let key = routes[routes.length-2].key;
     this.props.navigation.goBack(key);
}

好了,react-navigation集成redux已经完结,我们只需要在想获取routes的界面mapStateToProps中添加routes: state.nav.routes,就能获取到项目跳转的全部路由啦~

相关文章

网友评论

  • syntaxerro_232f:你好, 请问
    我最近在看react navigation 文档时发现
    https://reactnavigation.org/docs/zh-Hans/redux-integration.html
    警告: 在下一个大版本的 React Navigation 中, 将在2018年秋季发布, 我们将不再提供有关如何集成 Redux 的任何信息, 并且它可能会停止使用。 发布在 React Navigation issue tracker 中有关 Redux 的 issue,也将立即关闭。 Redux 集成可能会继续工作,但不会在为 library 作出任何设计决策时进行测试或考虑。

    请问这个时候应该如何选择
    sybil052:@syntaxerro_232f 你好,针对你这个问题,我是这么理解的,之前react-navigation集成redux是为了可以从state中拿到路由的key,name,id等字段,用于返回指定界面,现在react-navigation已经提供相对完整的界面跳转,返回操作,所以react-navigation不集成redux也可以,项目可以分别集成redux,react-navigation,独立使用。
  • 938b56c2c746:大神,想请教个问题?redux和react-navigation结合起来了,怎么在action中调用navigation方法?我遇到的问题是:根据登陆是否成功的状态判断是否要进入主页面?
  • G先生:学习了:stuck_out_tongue_winking_eye:

本文标题:react-navigation集成Redux

本文链接:https://www.haomeiwen.com/subject/fbynpxtx.html