[原]东方耀react native学习39-复杂的组件通讯三种方案
来源:互联网 发布:sqlserver bit 默认值 编辑:程序博客网 时间:2024/04/29 01:07
接着上节课的代码,从一个bug入手,透过问题去学习,大大提升学习效率
解决bug:组件pop之后,之前的组件没有更新?
例子:在购物车里清空了,但是pop之后,商品详情页并没有更新?
3.更新阶段
主要发生在用户操作之后或父组件有更新的时候,此时会根据用户的操作行为进行相应的页面结构的调整
componentWillReceiveProps、shouldComponentUpdate、componentWillUpdate、render、componentDidUpdate
pop之后,数据已经改变了,但是之前的组件没什么变化,组件的数据不同步了,解决方案:
方案1:监听didfocus事件,focus到当前路由的时候重新加载数据
navigationContext.addListener(‘didfocus’, callback)来替代
关键代码:
componentWillMount() {
console.log(‘List—componentWillMount’);
let navigator = this.props.navigator;
let callback = (event) => { console.log( 'List : 事件类型', { route: JSON.stringify(event.data.route), target: event.target, type: event.type, } ); }; // Observe focus change events from this component. this._listeners = [ navigator.navigationContext.addListener('willfocus', callback), navigator.navigationContext.addListener('didfocus', callback), ];}componentWillUnmount(){ console.log('List---componentWillUnmount'); this._listeners && this._listeners.forEach(listener => listener.remove());}
复制代码
更新去取数据不用放到componentDidMount,直接放到didfocus的回调即可 不太稳定
方案2:参考第15讲视频Navigator参数传递:往下一个路由push的时候传递参数(一个回调),在组件pop之前先调用此回调刷新数据
关键代码:
navigator.push({
name: ‘GouWu’,
component: GouWu,
params: {
fetchData: function () { console.log('启动fetchData里的方法了'); AsyncStorage.clear(function (err) { if (!err) { _that.setState({ count: 0, }); alert('购物车已经清空'); } }); } } }) 这是在点击清空购物车之后,马上pop,同时去触发回调 clearStorage() { let _that = this; //触发一下回调 让数据同步 console.log('点击了清空购物车'); if (this.props.fetchData) { console.log('点击了清空购物车----回调去影响List页面'); this.props.fetchData(); } const { navigator } = this.props; if (navigator) { navigator.pop(); }}
复制代码
还有一种情况:在点击清空购物车之后,不马上pop,而是通过点击物理back键去触发回调
这个就要复杂很多,
错误做法:
const top = routers[routers.length - 1];
console.log(‘栈顶的路由—’+top.component);
if (top.component.props.fetchData) {
console.log(‘回调fetchData了’);
top.component.props.fetchData();
}
复制代码
错误原因【回复本帖可见】:
本帖隐藏的内容
route.component是一个class 而不是一个object instance ,在里面找props是不可能找得到的,
如果一定需要从route上找到instance,需要在renderScene里给render的东西指定ref
类似 route.ref = r} />,然后通过route.ref来访问,但注意不应该假设route.ref总是有值
一定要判断下 if(route.ref)
方案3:采用redux/event等方式完成跨组件通讯
社区主流还是redux,但是建议大家抛弃redux了,因为太繁琐了,我们马上有更方便的架构,来自nodejs社区的,不是前端的方案
RN官方并不提供这个方案,redux也不是官方的
涉及到十几个插件 核心是decorator 都是npm上的插件
主要是一种 前端后端 结构和风格一致 的思想,facebook的野心:学习一次,编写任何平台!
React Native支持web android ios win10 nodejs跑服务器端
注意:方案1不推荐,推荐方案2或3
- [原]东方耀react native学习39-复杂的组件通讯三种方案
- 【原】东方耀REACT-NATIVE学习42,ios日期组件 DatePickerIOS
- 【原】东方耀REACT-NATIVE学习43,ios日期组件 ActionSheetIOS
- [原]东方耀react-native 46-开源组件react-native-camera
- [原]东方耀手把手教React Native实战之API学习DatePickerAndroid与TimePickerAndroid
- 【原】东方耀手把手教React Native实战之45API学习CameraRoll_笔记[难]
- react native组件学习(三)
- [原创]东方耀react native for android/ios视频学习
- 【原创】东方耀react native学习之-37AsyncStorage
- 【原创】东方耀reactnative 视频31之-开源导航组件 react-native-tab-navigator
- 【原创】东方耀reactnative 视频32之-开源导航组件 react-native-side-menu
- React Native学习三
- React Native 学习三
- React Native学习笔记(三)组件生命周期
- react-native组件学习(二)
- react native组件学习(四)
- (三)React Native中Navigation组件的快速入门
- 【React Native】组件的声明周期与通信(三)
- 策略模式
- Magenta——a project from the Google Brain team
- jsp中的9大内置对象
- 北京知名上市企业 JAVA架构师 系统分析师
- 2.rabbitmq之工作队列
- [原]东方耀react native学习39-复杂的组件通讯三种方案
- Android 开源项目源码解析 -->ViewPagerindicator 源码解析(十)
- 第一周—*写名字
- BZOJ 3688 折线统计
- 在使用jquery的时候碰到的问题,以及跨域的问题
- 1min了解广播(3)-发送自定义广播
- GreenDao的使用
- ffmpeg commands
- iOS开发:第一个iOS程序分析——AppDelegate.h文件和视图View、视图控制器ViewController【转】