美文网首页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