详解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 相关文章推荐
理解Javascript_13_执行模型详解
Oct 20 Javascript
Jquery 获取checkbox的checked问题
Nov 16 Javascript
对Jquery中的ajax再封装,简化操作示例
Feb 12 Javascript
14个有用的Jquery技巧分享
Jan 08 Javascript
JavaScript模板引擎用法实例
Jul 10 Javascript
一道常被人轻视的web前端常见面试题(JS)
Feb 15 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
May 19 Javascript
详解Vue自定义过滤器的实现
Jan 10 Javascript
angularjs中ng-bind-html的用法总结
May 23 Javascript
JavaScript实现瀑布流图片效果
Jun 30 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
Jul 16 Javascript
解决vue项目打包后提示图片文件路径错误的问题
Jul 04 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和MySql来与ODBC数据连接
2006/10/09 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
php地址引用(php地址引用的效率问题)
2012/03/23 PHP
深入PHP操作MongoDB的技术总结
2013/06/02 PHP
百度实时推送api接口应用示例
2014/10/21 PHP
Android AsyncTack 异步任务实例详解
2016/11/02 PHP
PHP实现的下载远程文件类定义与用法示例
2017/07/05 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
分享几种比较简单实用的JavaScript tabel切换
2015/12/31 Javascript
详解AngularJS中ng-src指令的使用
2016/09/07 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
python+mysql实现简单的web程序
2014/09/11 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
numpy.where() 用法详解
2019/05/27 Python
python爬虫 requests-html的使用
2020/11/30 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
单方离婚协议书范本(2014版)
2014/09/30 职场文书
运动会广播稿200米(5篇)
2014/10/15 职场文书
大学生实习介绍信
2015/05/05 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
python tkinter实现定时关机
2021/04/21 Python
NASA 机智号火星直升机拍到了毅力号设备碎片
2022/04/29 数码科技