React Native 页面跳转之全局封装Android和IOS(二)

本文介绍如何全局封装React Native的页面跳转,适用于Android和iOS。通过goOpenPage()和goBackPage()两个函数,简化组件间的导航操作。需配合'react-navigation'库使用,文中详细阐述了配置步骤、页面结构和具体实现代码。

之前我已经写了(一),但是后来发现,只能在Android中使用,IOS无效果,因前段时间自己项目比较赶,一直没时间整理,这次抽时间重新整理了下;这样的话所有组件(包括子组件)页面跳转,再也不用把navigation传来传去了,直接调用两个函数搞定:打开界面goOpenPage()、关闭界面goBackPage();

注:需要结合'react-navigation'一起使用,配置如下(下面的‘appKey’要更换自己工程的appKey):

项目结构如下:

一:页面跳转导航配置与全局navigation配置类index.js

import React from "react";
import {createStackNavigator} from "react-navigation";
import {appNavigation} from "./src/util/JumpUtils";
import Demo1 from "./src/Demo1";
import Demo2 from "./src/Demo2";
import Demo1Children from "./src/Demo1Children";

//导航配置
const appNav = createStackNavigator({
    demo1: {
        screen: Demo1,
    },
    demo2: {
        screen: Demo2,
    },
    demo1Children: {
        screen: Demo1Children,
    },
});

//全局navigation配置
appNav.navigationOptions = (navigation) => {
    appNavigation(navigation);
};

//项目注册
AppRegistry.registerComponent('appkey', () => appNav);

二:页面跳转封装类JumpUtils.js

import React from 'react';
import {Platform} from 'react-native';

let mNavigation; //导航

/**
 * 导航设置
 * @param navigation 导航信息
 */
export function appNavigation(navigation) {
    mNavigation = navigation.navigation ? navigation.navigation : navigation;
}

/**
 * 跳转页面
 * @param pageName 路由名称
 * @param obj 传入参数
 * @param isSinglePage 是否单例
 */
export function goOpenPage(pageName, obj, isSinglePage) {
    if (!mNavigation || !pageName) return;
    if (isSinglePage) { //栈内只存在一个实例,同一个页面打开多次,显示的是同一个页面
        mNavigation.navigate(pageName, obj ? obj : {});
    } else { //每次都打开一个新页面
        mNavigation.push(pageName, obj ? obj : {});
    }
}

/**
 * 返回页面
 * @param pageName 路由名称
 */
export function goBackPage(pageName) {
    if (!mNavigation) return;
    let {state: {routes}} = mNavigation;
    if (routes && routes.length > 0) {
        if (pageName) { //返回到指定的页面
            mNavigation.navigate(pageName);
        } else { //默认返回到前一个页面
            mNavigation.goBack(routes[routes.length - 1].key);
        }
    }
}

/**
 *  是否首页面
 * @returns {*}
 */
export function onMainScreen() {
    if (Platform.OS === 'android') { //为了安卓双击返回键退出应用
        return !mNavigation
            || !mNavigation.state
            || !mNavigation.state.routes
            || (mNavigation.state && mNavigation.state.routes && mNavigation.state.routes.length <= 1);
    }
    return false;
}

三:页面跳转与返回

(1)方法如下:

goBackPage();//返回前一个界面
goBackPage('demo1');//返回到指定界面demo1
goOpenPage('demo2');//跳转到页面demo2
goOpenPage('demo2',{id: 111});//带参跳转到页面demo2

(2)相关代码如下:

1、Demo1.js

import React, {Component} from 'react';
import {StyleSheet, View, Text} from 'react-native';
import Demo1Children from "./Demo1Children";
import {goOpenPage} from "./util/JumpUtils";

type Props = {};
export default class Demo1 extends Component<Props> {

    static navigationOptions = ({navigation}) => {
        const {params} = navigation.state;
        return {
            headerTitle: 'demo1',
        }
    };

    constructor(props) {
        super(props);
        this.state = {};
    }

    render() {
        return (
            <View style={styles.container}>
                <Demo1Children/>
                <Text onPress={() => goOpenPage('demo2')}>跳转到demo2</Text>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
    },
});

 2、Demo2.js

import React, {Component} from 'react';
import {StyleSheet, View, Text} from 'react-native';
import {goBackPage} from "./util/JumpUtils";

type Props = {};
export default class Demo2 extends Component<Props> {

    static navigationOptions = ({navigation}) => {
        const {params} = navigation.state;
        return {
            headerTitle: 'demo2',
        }
    };

    constructor(props) {
        super(props);
        this.state = {};
    }

    render() {
        return (
            <View style={styles.container}>
                <Text onPress={() => goBackPage()}>返回到demo1</Text>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
    },
});

3、Demo1Children.js

import React, {Component} from 'react';
import {StyleSheet, View, Text} from 'react-native';
import {goOpenPage} from "./util/JumpUtils";

type Props = {};
export default class Demo1Children extends Component<Props> {

    static navigationOptions = ({navigation}) => {
        const {params} = navigation.state;
        return {
            headerTitle: 'demo1Children',
        }
    };

    constructor(props) {
        super(props);
        this.state = {};
    }

    render() {
        return (
            <View style={styles.container}>
                <Text onPress={() => goOpenPage('demo2', {id: 1})}>带参跳转到demo2</Text>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
    },
});
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值