详解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封装的不错的选项卡效果代码
Feb 15 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(一)让静态人物动起来
Jan 23 Javascript
js调用AJAX时Get和post的乱码解决方法
Jun 04 Javascript
javascript函数重载解决方案分享
Feb 19 Javascript
浅谈页面装载js及性能分析方法
Dec 09 Javascript
js实现精美的图片跟随鼠标效果实例
May 16 Javascript
浅谈jQuery中的checkbox问题
Aug 10 Javascript
实例详解display:none与visible:hidden的区别
Mar 30 Javascript
Underscore之Array_动力节点Java学院整理
Jul 10 Javascript
js 两数组去除重复数值的实例
Dec 06 Javascript
Vue使用screenfull实现全屏效果
Sep 17 Javascript
Vue如何实现验证码输入交互
Dec 07 Vue.js
微信小程序使用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 htmlspecialchars加强版
2010/02/16 PHP
mysql总结之explain
2012/02/27 PHP
PHP目录操作实例总结
2016/09/27 PHP
浅析javascript中function 的 length 属性
2014/05/27 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
2016/03/07 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
node 使用 async 控制并发的方法
2018/05/07 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
Vue项目实现换肤功能的一种方案分析
2019/08/28 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
Vue + ts实现轮播插件的示例
2020/11/10 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
python创建只读属性对象的方法(ReadOnlyObject)
2013/02/10 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
拿来就用!Python批量合并PDF的示例代码
2020/08/10 Python
英国拳击装备购物网站:RDX Sports
2018/01/23 全球购物
精彩的英文自荐信
2014/01/30 职场文书
运动会口号大全
2014/06/07 职场文书
服装仓管员岗位职责
2014/06/17 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
普通党员个人剖析材料
2014/10/08 职场文书
专职安全员岗位职责
2015/04/11 职场文书
检察院起诉书
2015/05/20 职场文书
孔繁森观后感
2015/06/10 职场文书
国庆节主题班会
2015/08/15 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
python3.9之你应该知道的新特性详解
2021/04/29 Python
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技