详解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 相关文章推荐
ExtJs3.0中Store添加 baseParams 的Bug
Mar 10 Javascript
Seajs的学习笔记
Mar 04 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
Jun 20 Javascript
简单理解vue中实例属性vm.$els
Dec 01 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
Dec 19 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
Jun 16 Javascript
jQuery读取本地的json文件(实例讲解)
Oct 31 jQuery
js数组常用最重要的方法
Feb 04 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
Jul 16 Javascript
React和Vue中监听变量变化的方法
Nov 14 Javascript
vue 实现setInterval 创建和销毁实例
Jul 21 Javascript
原生JavaScript实现五子棋游戏
Nov 09 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 magic_quotes_gpc的一点认识与分析
2008/08/18 PHP
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
PHP中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
js href的用法
2010/05/13 Javascript
在次封装easyui-Dialog插件实现代码
2010/11/14 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
一道优雅面试题分析js中fn()和return fn()的区别
2016/07/05 Javascript
深入理解JS正则表达式---分组
2016/07/18 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
js面向对象之实现淘宝放大镜
2020/01/15 Javascript
python中stdout输出不缓存的设置方法
2014/05/29 Python
Python 稀疏矩阵-sparse 存储和转换
2017/05/27 Python
python微信公众号开发简单流程
2018/03/23 Python
python用插值法绘制平滑曲线
2021/02/19 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
python 项目目录结构设置
2020/02/14 Python
python反扒机制的5种解决方法
2021/02/06 Python
百联网上商城:i百联
2017/01/28 全球购物
JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么?
2015/10/22 面试题
计算机个人求职信范例
2014/01/24 职场文书
小学生获奖感言范文
2014/02/02 职场文书
化学专业大学生职业生涯规划范文
2014/09/13 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
2014年保安个人工作总结
2014/11/13 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang