zoukankan      html  css  js  c++  java
  • react-navigation Modal弹出层中的StackNavigator导航如何和物理返回匹配?

     

    带有StackNavigator的Modal弹出层

    const StackReouteConfig = {
        Login: {
            screen: Login
        },
        Register: {
            screen: Register
        },
        ForgetPassword: {
            screen: ForgetPassword
        }
    }
    
    const StackNavigatorConfigs = {
        initialRouteName: "Login",
        headerMode: "screen",
        mode: "modal",
        navigationOptions: {
            headerStyle: {
    
            }
        }
    }
    
    const StackNavigator = createStackNavigator(StackReouteConfig, StackNavigatorConfigs);
    
    const UserModalNavigator = createAppContainer(StackNavigator);
    
    // 重写getStateForAction,防止重复跳转
    const navigateOnce = (getStateForAction) => (action, state) => {
        const {type, routeName, params} = action;
        return (
            state &&
            (type === NavigationActions.NAVIGATE) &&
            routeName === state.routes[state.routes.length - 1].routeName &&
            JSON.stringify(params) === JSON.stringify(state.routes[state.routes.length - 1].params)
        ) ? null getStateForAction(action, state);
    };
    
    UserModalNavigator.router.getStateForAction = navigateOnce(UserModalNavigator.router.getStateForAction);
    
    // 带有StackNavigator的弹出层
    export default UserModal extends Component {
        constructor(props) {
            super(props);
            this.state = {
                visible: true   //可以props传递
            }
        }
    
        render() {
            return (
                <Modal
                    animationType={"slide"}
                    transparent={false}
                    visible={this.state.visible}
                    onRequestClose={() => {
                        // 判断是否是第一个
                        if(this._navigator.state.nav.index === 0) {
                            // 隐藏此Modal
                        } else {
                            // 返回上一页,栈回退
                            this._navigator.dispatch(
                                NavigationActions.back({
                                    type: NavigationActions.BACK,
                                    key: ""
                                })
                            )
                        }
                    }}
                    style={{backgroundColor: "#fff"}}>
                    <UserModalNavigator
                        ref={navigationRef => this._navigator = navigationRef}/>
                </Modal>
            )
        }
    }

     

    几点说明:

    this._navigator 是 UserModalNavigator组件,也就是 createAppContainer 方法返回的对象

    createAppContainer  返回的对象 NavigationContainer 含有 router、screenProps、navigationOptions、state等属性

     

    想要在没有navigation的情况下使用navigation:

    1. 可以使用 withNavigation方法包裹组件,从而使得组件 能够使用 navigation的属性和方法

    2. 使用 NavigationContainer 对象来重写navigation的方法,从而达到使用navigation的效果

    如上面的代码:重写goBack()方法

    this._navigator.dispatch(
        NavigationActions.back({
            type: NavigationActions.BACK,
            key: ""
        })
    )

    还有类似的 

    //重写navigate 方法
    function navigate(routeName, params) {
      _navigator && _navigator.dispatch(
           NavigationActions.navigate({
            type: NavigationActions.NAVIGATE,
            routeName,
            params
          })
      )
    }
    //重写reset方法
    function reset(routeName, params) {
      _navigator && _navigator.dispatch(
           StackAction.reset({
              index: 0,
              actions: [NAvigationActions.navigate({ routeName: 'HomeScreen'})],
            })
      )
    }

     

  • 相关阅读:
    JavaIO学习笔记(五)
    Java学习笔记(四)
    Java学习笔记(三)
    Java学习笔记(二)
    自己动手实现STL:前言
    Effective C++学习笔记 条款07:为多态基类声明virtual析构函数
    Effective C++学习笔记 条款06:如不想使用编译器自动生成的函数,就该明确拒绝
    Effective C++学习笔记 条款05:了解C++默默编写并调用的哪些函数
    Effective C++学习笔记 条款04:确定对象被使用前已先被初始化
    Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define
  • 原文地址:https://www.cnblogs.com/nangezi/p/12346372.html
Copyright © 2011-2022 走看看