React Native:页面跳转传值_react native startactivityforresult-程序员宅基地

技术标签: 页面跳转传值  react-native  native  react  

在app开发中,跳转页面的需求是最常见的。
Android原生跳转可以使用startActivityForResult、startActivity实现…
但是在React Native中呢?
作为得到前端青睐的React Native,使用Navigator结合路由的方式进行跳转。路由其实很好理解,就是一个url映射到具体的函数。
比如说:

# flask框架
@app.route("/login")
def login():
    # 只要是/login的网址,就会跳进这个函数

// Spring
@RequestMapping("/login")
public void login() {
    // 只要是/login的网址,就会跳进这个函数
}

例子太多太多了。。。其实,Android开发框架——Router、LiteRouter等等都是以路由的方式实现原生Android界面跳转。

扯远了,这里开始真正的学习React Native界面跳转。这里需要了解一个Navigator这个api了。
需要说明的是,我们需要先定义一个没有任何界面的Component,并在这个Component初始化Navigator。

// SplashComponent.js
class SplashComponent extends Component {
    

    constructor(props) {
        super(props);
    }

    render() {
        // 这里定义第一个界面的name和对应的Component
        const defaultName = "LoginComponent";
        const defaultComponent = LoginComponent;

        return (
            <Navigator
                // 初始化路由
                initialRoute={
   {name: defaultName, component: defaultComponent}}
                // 配置界面跳转的动画效果
                configureScene={
                    (route) => {
                        return Navigator.SceneConfigs.FloatFromBottom;
                    }
                }
                // 跳转后,渲染界面的函数
                renderScene={
                    (route, navigator) => {
                        let Component = route.component;
                        return <Component{...route.params} navigator={navigator}/>
                    }
                }
            />
        );
    }
}

我们将定义的SplashComponent作为第一个界面。实际上,SplashComponent并没有开始任何的View显示,只是将界面跳转到了LoginComponent。

别忘了这句话

AppRegistry.registerComponent('Animation', () => SplashComponent);

接下来就是LoginComponent的编写了,这里就是一个简单的Text,点击Text后,会跳转到RegisterComponent。

// LoginComponent.js
class LoginComponent extends Component {
    

    constructor(props) {
        super(props);
    }

    render() {
        return (
            <View>
                <Text onPress={
   this.onPress.bind(this)}>点击后跳转到Register</Text>
            </View>
        )
    }

    onPress() {
        const {navigator} = this.props;
        navigator.push({
            name: "RegisterComponent",
            component: RegisterComponent,
            // 传递参数,因为前面初始化Navigator的时候是使用了params,所以这里就用params
            params : {
                string : "login",
            }
        });
    }
}
class RegisterComponent extends Component {
    

    constructor(props) {
        super(props);
        // 这样获取参数
        console.log(props.string);
    }

    render() {
        return (
            <Text onPress={() => {
                const {navigator} = this.props;
                // 将该界面弹出栈
                navigator.pop();
            }}>注册</Text>
        )
    }
}

上面演示了如何在两个界面中传递参数。navigator有两个重要的方法——push、pop。也就是说,本质上React Native有一个保存Scene的栈,通过管理这个栈实现界面的跳转。
但是,我们按下返回键的时候,其实并不会调用Navigator.pop()。个人推测React Native的实现会将所有的Scene都显示在一个Activity上,并不存在Activity的交互,按下返回键才不会弹出Scene。

那我们可以通过监听返回键的方式,实现弹出Scene。参数资料:https://reactnative.cn/docs/0.43/backandroid.html#content

但是,我们通过navigtor.push是相当于实现了startActivity。还没有实现startActivityForResult。
我们可以通过以下方法实现:

    changeData(data) {
        this.setState({
            data : data
        });
    }

    // LoginComponent.js
    // 省略部分代码
    onPress() {
        const {navigator} = this.props;
        navigator.push({
            name: "RegisterComponent",
            component: RegisterComponent,
            params : {
                string : "login",
                // 将回调函数通过参数的形式传递过去
                changeData : changeData
            }
        });
    }
    // RegisterComponent.js
    // 省略部分代码
    const {navigator} = this.props;
    // 在这里调用那个函数
    this.props.changeData("回调");
    navigator.pop();

上述方式通过函数回调的方式解决了Navigator.pop无法传值得问题。这种方法基本解决了很多问题,但是总感觉写一个回调函数是很不妥的方式。

我们还可以通过React Native提供的DeviceEventEmitter的api实现传值。其实DeviceEventEmitter的本质实现是发布者与监听者模式。

// LoginComponent.js
// 省略部分代码
componentDidMount() {
    //这里监听的事件是changeData,监听到后会自动回调changeData函数
    DeviceEventEmitter.addListener('changeData', this.changData);
}

// 这里一定要移除事件的监听,避免内存泄漏
componentWillUnmount() {
    this.subscription.remove();
}
// RegisterComponent.js
// 省略部分代码
// 发布事件
DeviceEventEmitter.emit('changeData',val.data);
navigator.pop();
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/new_Aiden/article/details/72566640

智能推荐

Java OCR tesseract 图像智能字符识别技术 Java代码实现_tesocr jave-程序员宅基地

文章浏览阅读10w+次,点赞173次,收藏149次。接着上一篇OCR所说的,上一篇给大家介绍了tesseract 在命令行的简单用法,当然了要继承到我们的程序中,还是需要代码实现的,下面给大家分享下java实现的例子。拿代码扫描上面的图片,然后输出结果。主要思想就是利用Java调用系统任务。下面是核心代码:package com.zhy.test;import java.io.BufferedReader;import_tesocr jave

我用Python分析了1500家电商的销售数据,竟发现了进口车厘子的秘密_爬虫 淘宝车厘子-程序员宅基地

文章浏览阅读519次,点赞2次,收藏2次。图片来源:互联网众所周知,中国是智利车厘子最主要的出口对象,占据了其95%的市场份额。智利驻华大使馆商务参赞娜塔曾表示:“2020-2021产季车厘子实现了丰收,预计今年有50万吨左右的车厘子进入中国市场。”自2020年12月中旬开始,智利海运车厘子陆续到达中国,运输成本较此前空运方式大幅下滑。这意味着,国内消费者将能以更低的价格买到车厘子。然而,近日国内已有多地进口车厘子核酸检测结果为阳性,在这种情况下,你还敢大呼“车厘子自由”吗?01 数据获取本文利用Python采集了淘宝网1585.._爬虫 淘宝车厘子

列式存储-程序员宅基地

文章浏览阅读1.1k次。OLAP中数据存储的问题OLAP 需要队列进行选择,行式存储按行存数据,使用索引加快对数据的查找(索引包括聚集索引(表记录的排列顺序与索引的排列顺序一致)和非聚簇索引(非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致))。这种方式对按列的存储和检索不是很高效,查询某一列数据需要将所有行的数据扫描一次,而且对统计分析也不友好。列式存储原理若使用列式存储可以只用扫描出需要的列,行、列存储的对比。文件格式parquet 文件格式:如下图所示:parquet file = hea_列式存储

C语言字符串详解-程序员宅基地

文章浏览阅读4.3w次,点赞184次,收藏1.2k次。我们可以把字符串储存在char类型的数组中,如果char类型的数组末尾包含一个表示字符串末尾的空字符\0,则该数组中的内容就构成了一个字符串因为字符串需要用\0结尾,所以在定义字符串的时候,字符数组的长度要预留多一个字节用来存放\0,\0就是数字0例如。_c语言字符串

vue3常用自定义指令封装v-permission,按钮权限控制,添加防抖节流_vue3 v-permission-程序员宅基地

文章浏览阅读2k次,点赞8次,收藏15次。后台管理项目免不了要做权限控制,常见的分为路由级别和按钮级别,在此主要针对于按钮权限,比如说某个用户或者角色对数据有没有增删改查的权限,例如以下功能,巡查人员可以点击导入和新建,而一般用户只能选择下载模板。在 directives文件夹下分别创建permission、debounce、throttle三个ts文件,分别用于存放权限控制,防抖和节流的业务逻辑,结构清晰,方便维护以及更低的耦合度。在index.ts文件中分别导入每个自定义指令对象,再遍历注册每一个指令。_vue3 v-permission

maven-dependency-versions-check-plugin, Maven 插件查找依赖版本冲突-程序员宅基地

文章浏览阅读553次。1、maven-dependency-versions-check-plugin, Maven 插件查找依赖版本冲突转载于:https://www.cnblogs.com/yixiu868/p/11583582.html_maven-dependency-versions-check-plugin

随便推点

php笔记-程序员宅基地

文章浏览阅读57次。【1】windows下php运行环境安装【2】php连接MySQL【3】centos7下用yum的方式安装php7.2【4】编译式安装php【5】php日志文件【6】php.ini配置【7】php-fpm.conf重要参数详解【8】扩展mysql【1】windows下php运行环境安装参考连接#下载地址https://windows.php.net/download#php-7.3#解压安装包至任意目录#结合apache或nginx进行配置即可###名词解释...

前后端分离之Spring Security Api验证实践-程序员宅基地

文章浏览阅读1.3k次。前后端分离之Spring Security Api验证实践为什么需要RESTful重定向问题为什么需要RESTful使用RESTful之前,会发现各种奇葩的url命名,对url的功能经常需要结合源代码来确认,让人头痛,使用RESTful规范之后,很多问题得以解决。仅仅依靠URL和Method就能定为功能。重定向问题需要重新定义逻辑(JDK8推荐使用Lambda表达式)登录 ,默认下..._spring security api

图像处理之常见二值化方法汇总-程序员宅基地

文章浏览阅读10w+次,点赞25次,收藏117次。图像处理之常见二值化方法汇总图像二值化是图像分析与处理中最常见最重要的处理手段,二值处理方法也非常多。越精准的方法计算量也越大。本文主要介绍四种常见的二值处理方法,通常情况下可以满足大多数图像处理的需要。主要本文讨论的方法仅针对RGB色彩空间。 方法一:该方法非常简单,对RGB彩色图像灰度化以后,扫描图像的每个像素值,值小于127的将像素值设为0(黑色),值大于等于12_二值化

GUI程序开发_gui开发-程序员宅基地

文章浏览阅读1.9k次。JAVA程序设计与应用开发(第2版)——《GUI清华大学出版社》_gui开发

PYTHON实训总结及体会500字,PYTHON实训总结思考建议_python实验体会-程序员宅基地

文章浏览阅读491次。大家好,给大家分享一下PYTHON实训总结及体会1500字,很多人还不知道这一点。这将使你在做实验时的难度加大。然后两下子就将实验报告做完。但学到的知识与难度成正比。一定要将课本上的知识吃透。【篇一:实验心得体会】就像以前做物理实验一样。在老师讲解时就会听不懂。你要清楚电桥的各种接法。这将使你极大地浪费时间。在做测试技术的实验前。因为这是做实验的基础。_python实验体会

ADC参数详解_adc电流电压零漂值-程序员宅基地

文章浏览阅读9.6k次,点赞9次,收藏117次。特性或指标总述本文将从以下特性进行简单的叙述。结合了《ADC设计基础》和TI的一些教学视频。分辨率转换误差转换速度采样率奈奎斯特采样准则混叠和抗混叠滤波器DNLINL热噪声谐波失真THDSNRENOBSFDRIMD孔径抖动孔径延迟奈奎斯特区补充分辨率一般ADC都说注明是8bit,16bit或者是24bit。这里的数值也就是分辨率的意思。分辨率是衡量A..._adc电流电压零漂值

推荐文章

热门文章

相关标签