React Native(十二)——嵌套WebView中的返回处理
情景描述:
从一个名为“My”的组件点击进去,进入一个列表(该列表内容为webView中内容),其中一个webView也可以点击进入详情页(也为webView),但是如果对导航栏不做任何处理,直接点击返回按钮,便会直接从详情页跳转至最顶层页面,而返回不到该列表内容页;很显然这并非我们想要的效果,于是就需要在原有导航返回事件中增加对webView返回事件的处理,完整代码如下(由于拍的视频格式有问题,就看不了效果图了~~~桑心,只能凑合看看代码了):
export class CommonProblem extends Component {//自定义一个组件
    static navigationOptions = ({ navigation }) => {
        return {
            headerTitle: '常见问题',   //导航标题
            headerTitleStyle: {
                alignSelf: 'center',
                textAlign: 'center',
                fontSize: 16,
                color: '#FFF'
            },
            headerLeft: (
                <TouchableHighlight
                    activeOpacity={1}
                    underlayColor={skin.main}
                    onPress={() => {
                        navigation.state.params.goBackPage();
                    }}
                >
                    <View style={{ paddingLeft: 20 }}>
                        <Icon name="ios-arrow-round-back-outline" size={30} style={{ color: '#FFF' }} />
                    </View>
                </TouchableHighlight>
            ),
                                                //导航左与导航右是为了让导航标题居中(Why?)
            headerRight: <View style={{ paddingRight: 20 }} />
        };
    };
    constructor(props) {
        super(props);
        this.nav = this.props.navigation;//导航
        // 添加返回键监听(对Android原生返回键的处理)
        this.addBackAndroidListener(this.nav);
    }
    componentDidMount() {
        this.props.navigation.setParams({//给导航中增加监听事件
            goBackPage: this._goBackPage
        });
    }
                //自定义返回事件
    _goBackPage = () => {
                                //  官网中描述:backButtonEnabled: false,表示webView中没有返回事件,为true则表示该webView有回退事件
        if (this.state.backButtonEnabled) {
            this.refs['webView'].goBack();
        } else {//否则返回到上一个页面
            this.nav.goBack();
        }
    };
    //获取链接
    getSource() {//config.HelpProblemUrlTest是webView的地址(一个独立的H5页面)
        if (!config.Release) {
            return config.HelpProblemUrlTest;
        }
        return config.HelpProblemUrl;
    }
    onNavigationStateChange = navState => {
        this.setState({
            backButtonEnabled: navState.canGoBack
        });
    };
    // 监听原生返回键事件
    addBackAndroidListener(navigator) {
        if (Platform.OS === 'android') {
            BackHandler.addEventListener('hardwareBackPress', this.onBackAndroid);
        }
    }
    onBackAndroid = () => {
        if (this.state.backButtonEnabled) {
            this.refs['webView'].goBack();
            return true;
        } else {
            return false;
        }
    };
    render() {
        let Dimensions = require('Dimensions');
        let { width, height } = Dimensions.get('window');
        return (
            <View style={{ backgroundColor: skin.lightSeparate, flex: 1 }}>
                <WebView
                    source={{ uri: this.getSource() }}
                    style={{ flex: 10, justifyContent: 'center', alignItems: 'center', width: width }}
                    ref="webView"
                    onNavigationStateChange={this.onNavigationStateChange}
                />
            </View>
        );
    }
}
这样就完美的达到了自己想要的问题咯。
React Native(十二)——嵌套WebView中的返回处理的更多相关文章
- perl5 第十二章 Perl5中的引用/指针
		
第十二章 Perl5中的引用/指针 by flamephoenix 一.引用简介二.使用引用三.使用反斜线(\)操作符四.引用和数组五.多维数组六.子程序的引用 子程序模板七.数组与子程序八.文件句 ...
 - 利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统
		
原文:利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...
 - vue第十二单元(vue中过渡效果的实现)
		
第十二单元(vue中过渡效果的实现) #课程目标 熟练掌握transition组件的用法 熟练使用transition组件做过渡特效 熟练使用transition组件做动画特效 了解使用transit ...
 - “全栈2019”Java第五十八章:多态中方法返回类型可以是子类类型
		
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
 - React Native(十五)——RN中的分享功能
		
终于,终于,可以总结自己使用RN时的分享功能了-- 为什么呢?且听我慢慢道来吧: 从刚开始接触React Native(2017年9月中旬)就着手于分享功能,直到自己参与公司的rn项目开发中,再到现在 ...
 - React Native - 网页组件(WebView)的使用详解
		
一.WebView组件介绍 使用 WebView 组件我们可以通过 url 来加载显示一个网页,也可以传入一段 html 代码来显示.下面对其主要属性和方法进行介绍. 1,属性介绍 source: ...
 - React Native学习(二)之View
		
React Native组件解析(二)之View 0.JSX React的核心机制之一就是虚拟DOM:可以在内存中创建的虚拟DOM元素.React利用虚拟DOM来减少对实际DOM的操作从而提升性能. ...
 - react第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性)
		
第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性) #课程目标 理解路由的原理及应运 理解react-router-dom以及内置的一些组件 合理应用内置组 ...
 - React Native 系列(二) -- React入门知识
		
前言 本系列是基于React Native版本号0.44.3写的,最初学习React Native的时候,完全没有接触过React和JS,本文的目的是为了给那些JS和React小白提供一个快速入门,让 ...
 
随机推荐
- pandas 的算术运算和数据对齐
			
pandas 还有一个重要的功能,就是他可以对不同索引的对象进行算数运算.对象相加, 如果存在不同的索引对,则结果的索引就是该索引对的并集. 先来个例子 Series In [33]: s1 = Se ...
 - Java数组超出范围时如何处理多个异常?
			
在Java编程中,数组超出范围时如何处理多个异常? 此示例显示如何使用System类的System.err.println()方法处理多个异常方法. package com.yiibai; publi ...
 - svn -- svn权限控制
			
权限控制 问题:当前采用单仓库或多仓库配置中,所有的文件权限都是可读写的,这样就会存在一个问题,只要任何知道了我们的访问地址,那么都可以对文件进行读写操作. 1.为什么需要权限控制 打开服务器端的项目 ...
 - JS 在火狐浏览器下关闭弹窗
			
1.首先,要确定火狐设置是否允许通过JS代码window.close()方法关闭标签. 确定方式如下: 在Firefox地址栏里输入 about:config 在配置列表中找到dom. ...
 - pyremotevbox 用法
			
>>> import pyremotevbox.vbox as vbox >>> host = vbox.VirtualBoxHost(host='10.0.2.2 ...
 - Linux网卡eth0变成eth1修改方法
			
由于换了主板,集成网卡mac地址变了,70-persistent-net.rules中仍然保留了老网卡的内容,新网卡则被识别为eth1. 将表示老网卡的行注释掉,然后将表示新网卡的行中eth1改成et ...
 - php判断所在的客户端
			
//判断是否是手机 function is_mobile() { $agent = strtolower($_SERVER['HTTP_USER_AGENT']); $is_pc = (strpos( ...
 - LAMP架构介绍MySQL、MariaDB介绍 MySQL安装
 - Mac下终端使用密钥登录服务器
			
可行方法: mac终端输入 ssh-keygen 因为mac系统是类unix系统,linux系统是unix系统演变来的,所以呢,相当于在一个linux系统登录另外一个linux系统, 基本命令还是一样 ...
 - 【DL】物体识别与定位
			
https://cloud.tencent.com/community/article/414833