详解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 相关文章推荐
学习js所必须要知道的一些
Mar 07 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
Mar 25 Javascript
jQuery阻止事件冒泡具体实现
Oct 11 Javascript
showModelDialog弹出文件下载窗口的使用示例
Nov 19 Javascript
多个checkbox被选中时如何判断是否有自己想要的
Sep 22 Javascript
JavaScript数据类型学习笔记
Jan 25 Javascript
基于Bootstrap实现图片轮播效果
May 22 Javascript
老生常谈JQuery data方法的使用
Sep 09 Javascript
解决webpack -p压缩打包react报语法错误的方法
Jul 03 Javascript
Vuejs中使用markdown服务器端渲染的示例
Nov 22 Javascript
vue实现微信二次分享以及自定义分享的示例
Mar 20 Javascript
JS实现transform实现扇子效果
Jan 17 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重定向的3种方式
2013/03/07 PHP
如何使用PHP实现javascript的escape和unescape函数
2013/06/29 PHP
简单的php缓存类分享     php缓存机制
2014/01/22 PHP
laravel请求参数校验方法
2019/10/10 PHP
js left,right,mid函数
2008/06/10 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
ES6所改良的javascript“缺陷”问题
2016/08/23 Javascript
基于BootStrap的Metronic框架实现页面链接收藏夹功能按钮移动收藏记录(使用Sortable进行拖动排序)
2016/08/29 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
原生JS中slice()方法和splice()区别
2017/03/06 Javascript
用js实现每隔一秒刷新时间的实例(含年月日时分秒)
2017/10/25 Javascript
Node.js Koa2使用JWT进行鉴权的方法示例
2018/08/17 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
基于openlayers实现角度测量功能
2020/09/28 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
[03:42]2014DOTA2西雅图国际邀请赛 Navi战队巡礼
2014/07/07 DOTA
python线程池(threadpool)模块使用笔记详解
2017/11/17 Python
python实现批量图片格式转换
2020/06/16 Python
python3.6编写的单元测试示例
2019/08/17 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
好的自荐信的要求
2013/10/30 职场文书
毕业实习个人鉴定范文
2013/12/10 职场文书
六一儿童节主持词
2014/03/21 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
自荐信模板大全
2015/03/27 职场文书
2016学校元旦晚会经典开场白台词
2015/12/03 职场文书
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
python实现MD5进行文件去重的示例代码
2021/07/09 Python
Python基础 括号()[]{}的详解
2021/11/07 Python