1. 利用react-native 事件DeviceEventEmitter 监听广播

应用场景:

  1. - 表单提交页面, A页面跳转到B页面选人, 然后返回A页面, 需要将B页面选择的数据传回A页面。
  2. - 多个多媒体来回切换播放,暂停后二次继续播放等问题。

代码如下:
A页面

  1. componentDidMount() {
  2. // 利用DeviceEventEmitter 监听 concactAdd事件
  3. this.subscription = DeviceEventEmitter.addListener('concactAdd', (dic) => {// dic 为触发事件回传回来的数据
  4. // 接收到 update 页发送的通知,后进行的操作内容
  5. if (dic.approver_list) {
  6. this.setState((preState: Object) => {
  7. this.updateInputValue(preState.approver_list.concat(dic.approver_list), 'approver_list');
  8. return { approver_list: preState.approver_list.concat(dic.approver_list) };
  9. });
  10. }
  11. if (dic.observer_list) {
  12. this.setState((preState: Object) => {
  13. this.updateInputValue(preState.observer_list.concat(dic.observer_list), 'observer_list');
  14. return { observer_list: preState.observer_list.concat(dic.observer_list) };
  15. });
  16. }
  17. });
  18. ...
  19. componentWillUnmount() {
  20. this.subscription.remove();
  21. }

B页面

  1. // 触发concactAdd事件广播
  2. handleOk = (names: []) => {
  3. const { field } = this.props;
  4. DeviceEventEmitter.emit('concactAdd', { [field]: names });
  5. }

2. 用react-navigation提供的路由之间

A页面

  1. // 定义路由跳转函数 cb表示需要传递的回调函数
  2. export const navigateToLinkman = (cb: Function, type?: string, mul?: boolean): NavigateAction =>
  3. NavigationActions.navigate({ routeName: 'Linkman', params: { cb, type, mul } });
  4. // 跳转选择人员页面
  5. handleSelectUser = () => {
  6. Keyboard.dismiss();
  7. this.props.actions.navigateToLinkman(this.selectedUser, '', true);
  8. ...
  9. // 选择人员后的回调函数
  10. selectedUser = (selectUser: string[]) => {
  11. this.setState((preState) => {
  12. const newEmails = preState.emails.concat(selectUser);
  13. const emails = [...new Set(newEmails)];
  14. return {
  15. emails,
  16. };
  17. });
  18. }

B页面

  1. handleToUser = () => {
  2. ...
  3. navigation.state.params.cb(user.email, group);
  4. ...
  5. }

3. 利用react-navigation 提供的路由事件监听触发事件

在A页面路由失去焦点的时候触发该事件

  1. componentDidMount() {
  2. this.props.navigation.addListener('didBlur', (payload) => {
  3. if (this.modalView) this.modalView.close();
  4. });
  5. }

那么问题来了, 为何不在页面卸载(componentWillunmount)的时候触发该事件?

如果不了解react-native和react-navigation, 会很困惑, A页面卸载了, 为什么还能接收到来自B页面的数据或者事件, 原因是: react-navigation中, A页面跳转到B页面, A页面没有卸载, 只是在它提供的路由栈中堆积,例如A跳转到B中, A页面不执行componentWillunmount,当每一个路由pop掉的时候才会执行componentWillunmount, 卸载掉当前页面。

原文地址:https://segmentfault.com/a/1190000016928686

react-native页面间传递数据的几种方式的更多相关文章

  1. StoryBoard学习(5):使用segue页面间传递数据

    StoryBoard学习(5):使用segue页面间传递数据 函数: - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sen ...

  2. 在微信小程序页面间传递数据总结

    在微信小程序页面间传递数据 原文链接:https://www.jianshu.com/p/dae1bac5fc75 在开发微信小程序过程之中,遇到这么一些需要在微信小程序页面之间进行数据的传递的情况, ...

  3. react之传递数据的几种方式props传值、路由传值、状态提升、redux、context

    react之传递数据的几种方式 1.父子传值 父传值:<子的标签 value={'aaa'} index={'bbb'}></子的标签> 子接值:<li key={thi ...

  4. ASP.NET页面之间传递值的几种方式(转载)

    页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值.存储对象传值.ajax.类.model.表单等.但是一般来说,常用的较简单有QueryString,Session,Cookie ...

  5. ASP中页面之间传递值的几种方式

    ASP.NET页面之间传递值的几种方式 页面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值.存储对象传值.ajax.类.model.表单等.但是一般来说,常用的较简单有QueryS ...

  6. .NET MVC控制器向视图传递数据的四种方式

    .NET MVC控制器向视图传递数据的四种方式: 1.ViewBag  ViewBag.Mvc="mvc"; 2.ViewData ViewBag["Mvc"] ...

  7. EF5+MVC4系列(7) 后台SelectListItem传值给前台显示Select下拉框;后台Action接收浏览器传值的4种方式; 后台Action向前台View视图传递数据的四种方式(ViewDate,TempDate,ViewBag,Model (实际是ViewDate.Model传值))

    一:后台使用SelectListItem 传值给前台显示Select下拉框 我们先来看数据库的订单表,里面有3条订单,他们的用户id对应了 UserInfo用户表的数据,现在我们要做的是添加一个Ord ...

  8. Android学习笔记(十二)——使用意图传递数据的几种方式

    使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也经常要传递数据给活动.对此我们能够使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目 ...

  9. 对于vue和react“页面间”传递数据的理解误区

    前言 如果我们想要实现多个标签页之间的通信,可以使用localStorage.cookie等,但是能不能用vue或react呢? 结论 答案是NO,因为vue和react虽然可以在“多个”页面之间传递 ...

随机推荐

  1. 安卓实训第九天---Activity的复习以及在Onstart里设置网络连接

    今天.首先对Activity的生命周期进行复习: (以下的截图部分是借鉴自赵雅智老师的博客.. .) Activity的完整生命周期自第一次调用onCreate()開始.直至调用onDestroy() ...

  2. Elasticsearch源码分析—线程池(十一) ——就是从队列里处理请求

    Elasticsearch源码分析—线程池(十一) 转自:https://www.felayman.com/articles/2017/11/10/1510291570687.html 线程池 每个节 ...

  3. spring 监听器 IntrospectorCleanupListener简介

    转自:https://blog.csdn.net/ywb201314/article/details/51144256 其中JavaBeans Introspector是一个类,位置在Java.bea ...

  4. poj3071Football(概率期望dp)

    Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5620   Accepted: 2868 Descript ...

  5. MYSQL 数据库命令行终端操作笔记

    1.数据库登录: 1.登录本地的MYSQL数据库:mysql -u root -p   2.连接远程主机上的MYSQL数据库:mysql -h 192.168.191.2 -u root -p 123 ...

  6. 安装DotnetCore-Vue项目模板

    dotnet new --install Microsoft.AspNetCore.SpaTemplates::*

  7. 笔记《javascript高级程序设计》 第12章 DOM2和DOM3

    DOM2 级核心:在 1 级基础上构建,为节点添加更多方法和属性 DOM2 级视图:为文档定义了基于样式信息的不同视图 DOM2 级事件:说明了如何使用事件和DOM文档交互 DOM2 级样式:如何以编 ...

  8. Zeppelin0.6.2+sparkR2.0.2环境搭建

    0.序 先吐槽一下网上旧版本的Zeppelin和R的安装,让我折腾了几个小时. 不过最终还是调通了也不容易,其实我现在一点R都没有学呢,只是刚看了一节课,但是这个工具既然出现在了Spark中,我想它还 ...

  9. Java中数组要点总结

    1.数组是基本数据类型和字符串类型的容器(引用数据类型),而集合是类数据类型的容器: 2.数组定义的格式: (1)一般格式: 元素类型[] 数组名 = new 元素类型[元素个数或者数组长度]: 其中 ...

  10. css中标签,类名,id名的命名 语义化命名

    作为前端开发人,经常头疼于雷鸣,标签,id名的命名,不知道应该基于什么原则. 原则: 2 当命名的时候,问自己,这个元素是要来做什么?(根据使用目的).ad-banner 4 避免依靠位置和视觉效果命 ...