详解react native页面间传递数据的几种方式


Posted in Javascript onNovember 07, 2018

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

应用场景:

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

代码如下:

A页面

componentDidMount() {
 // 利用DeviceEventEmitter 监听 concactAdd事件
  this.subscription = DeviceEventEmitter.addListener('concactAdd', (dic) => {// dic 为触发事件回传回来的数据
   // 接收到 update 页发送的通知,后进行的操作内容
   if (dic.approver_list) {
    this.setState((preState: Object) => {
     this.updateInputValue(preState.approver_list.concat(dic.approver_list), 'approver_list');
     return { approver_list: preState.approver_list.concat(dic.approver_list) };
    });
   }
   if (dic.observer_list) {
    this.setState((preState: Object) => {
     this.updateInputValue(preState.observer_list.concat(dic.observer_list), 'observer_list');
     return { observer_list: preState.observer_list.concat(dic.observer_list) };
    });
   }
  });
...
componentWillUnmount() {
  this.subscription.remove();
}

B页面

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

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

A页面

// 定义路由跳转函数 cb表示需要传递的回调函数
export const navigateToLinkman = (cb: Function, type?: string, mul?: boolean): NavigateAction =>
 NavigationActions.navigate({ routeName: 'Linkman', params: { cb, type, mul } });
 // 跳转选择人员页面
  handleSelectUser = () => {
   Keyboard.dismiss();
   this.props.actions.navigateToLinkman(this.selectedUser, '', true);
...
// 选择人员后的回调函数
selectedUser = (selectUser: string[]) => {
   this.setState((preState) => {
    const newEmails = preState.emails.concat(selectUser);
    const emails = [...new Set(newEmails)];
    return {
     emails,
    };
   });
  }

B页面

handleToUser = () => {
  ...
  navigation.state.params.cb(user.email, group);
  ...
}

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

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

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery ajax cache缓存问题
Jul 01 Javascript
js/jQuery对象互转(快速操作dom元素)
Feb 04 Javascript
Javascript中的getUTCHours()方法使用详解
Jun 10 Javascript
jquery 获取select数组与name数组长度的实现代码
Jun 20 Javascript
js仿百度切换皮肤功能(html+css)
Jul 10 Javascript
浅谈jQuery中的checkbox问题
Aug 10 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
Dec 07 Javascript
bootstrap多种样式进度条展示
Dec 20 Javascript
微信小程序 解决请求服务器手机预览请求不到数据的方法
Jan 04 Javascript
实现单层json按照key字母顺序排序的示例
Dec 06 Javascript
PWA介绍及快速上手搭建一个PWA应用的方法
Jan 27 Javascript
vue解决花括号数据绑定不成功的问题
Oct 30 Javascript
微信小程序使用npm支持踩坑
Nov 07 #Javascript
Angular Material Icon使用详解
Nov 07 #Javascript
详解Webpack loader 之 file-loader
Nov 07 #Javascript
JS复杂判断的更优雅写法代码详解
Nov 07 #Javascript
javascript动态创建对象的属性详解
Nov 07 #Javascript
在vue中使用express-mock搭建mock服务的方法
Nov 07 #Javascript
详解在vue-test-utils中mock全局对象
Nov 07 #Javascript
You might like
PHP如何透过ODBC来存取数据库
2006/10/09 PHP
php使用cookie保存用户登录的用户名实例
2015/01/26 PHP
Yii2.0 模态弹出框+ajax提交表单
2016/05/22 PHP
js 小数取整的函数
2010/05/10 Javascript
xml转json的js代码
2012/08/28 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
探讨JavaScript语句的执行过程
2016/01/28 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
深入理解Javascript中的valueOf与toString
2017/01/04 Javascript
为Jquery EasyUI 组件加上清除功能的方法(详解)
2017/04/13 jQuery
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
react-router实现按需加载
2017/05/09 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
Node.js自定义实现文件路由功能
2017/09/22 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
动态创建类实例代码
2009/10/07 Python
python实现数通设备端口监控示例
2014/04/02 Python
python基础教程之Hello World!
2014/08/29 Python
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
Python2.x中文乱码问题解决方法
2015/06/02 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
Jupyter Notebook 实现正常显示中文和负号
2020/04/24 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
高中生毕业自我鉴定
2013/10/10 职场文书
班级寄语大全
2014/04/10 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
七年级作文之环保作文
2019/10/17 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers
HTML中table表格拆分合并(colspan、rowspan)
2021/04/07 HTML / CSS
sql中mod()函数取余数的用法
2021/05/29 SQL Server
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis