当前位置: 首页 > 后端技术 > Node.js

ReactNative中传递参数的五种方式

时间:2023-04-04 01:08:14 Node.js

在ReactNative中,由于业务需要,我们经常需要在很多页面和组件之间传递和管理一些参数。在这里我总结了几个经过验证的、稳定的、好用的方法给大家。ReactNavigation导航传值推荐指数:????适用范围:相邻页面之间传值兼容性:IOS/Android原理:ReactNavigation在页面的props上挂载一个导航对象,可以用于路由jumps和pagejumps传递的时候可以携带参数/回调方法到目标页面,从而达到传递参数的目的。注:这是官方推荐的,也是业务开发中使用最多,最推崇的传参方式。思路和web上关于querystring带参数的跳转类似,只是实现方式略有不同。例如:导航传值可以是正向也可以是反向。例如,A->B是正向价值转移,而B->A是反向价值转移。正向传值:A页面跳转到B页面,访问this.props.navigation.navigate('B',{type:'list',callback:data=>{console.log('dataincallback:',data);}});在B页面,可以在组件生命周期函数componentWillMount(){const{state:{params:{type,callback},goBack}}=this.道具导航;console.log('类型:',类型);//type'list'}反向传值:返回上一页时,手动调用回调,给它传递参数,然后调用goBack方法,即可达到目的。还是上面的例子:从B返回A时goBackToPageA:()=>{const{state:{params:{type,callback},goBack}}=this.props.navigation;回调({id:'123',message:type+'really?'});回去();}goBackToPageA();回到A页面后,'dataincallback:',{id:'123',message:'listreally?'});即回调中的data参数是{id:'123',message:'listreally?'}DeviceEventEmitter触发一个事件,传递一个值推荐指数:?????适用范围:页面间传递值/components兼容性:IOS/Android原理:使用ReactNative包中提供的DeviceEventEmitter模块,同时订阅事件,触发事件,传值说明:DeviceEventEmitter从名字就可以知道它是基于的机制事件订阅传递值。当某个事件被订阅时,它会在触发时被调用。订阅事件的回调,并且可以传递值,并且是同一个页面的组件,不同页面之间可以传递值,但是前提是页面没有被销毁(销毁后,事件订阅将被取消),例如:DeviceEventEmitter.addListener('warning_event',(data)=>{console.log('data:',data);})DeviceEventEmitter.emit('warning_event',{name:'Mega星系'});//data:{name:'MegaGalaxy'}emit(trigger)事件后,回调函数的入参就变成我们传过来的{name:'MegaGalaxy'},或者不传值。不传值时,回调Participation的入参是undefined缺点:本质是自定义事件的监听和触发。当页面逻辑复杂时,代码量会增加,维护成本会变高,过多的监控会导致性能问题。还有一点就是页面销毁的时候一定要销毁页面。移除监听器:如果忘记移除监听器会怎样?然后每次发出emit事件时,它都会再响应一个你添加的监听器componentDidMount(){this.eventHandler=DeviceEventEmitter.addListner('event_name',callback);}componentWillUnmount(){this.eventHandler.remove();}个人建议:梳理好页面逻辑后,使用AsyncStorageKey-Value式存储传参推荐指数:????适用范围:任意跨页面和components传参兼容性:IOS/Android原理:使用类似web中localStorage的思路,将参数/数据存储在AsyncStorage中,然后在需要的地方取出说明:大家知道localStorage在web中的实用性和普及性是的,AsyncStorage实际上是localStorage的rn版本。稍有不同的是它是异步的,只返回Promise,所以结合async/await会非常有用...saveOrderData=async()=>{try{constonpageAorderData=[{id:1,数据:[]},{id:2,数据:[]}]awaitAsyncStorage.setItem('Order_data_cache',JSON.stringify(orderData));}catch(error){//保存数据时出错}}在页面BloadOrderData=async()=>{const__orderData=awaitAsyncStorage.getItem('Order_data_cache');constorderData=JSON.parse(__orderData);this.setState({orderData});}缺点:Key-Value方式的存储和传参可能侧重于数据存储,由于涉及到I/O操作,在一些低端机型上可能存在卡顿的可能。ReactContextApi参数传递(新版ContextApi)推荐指数:???适用范围:不同页面中的组件共享公共数据兼容性:IOS/Android原理:使用生成的数据仓库包装父组件,然后获取数据来自子组件仓库中数据说明:ContextApi是一个强大的管理登录用户数据等具有公共属性的数据的工具,但是使用constContextWrapper=React.createContext();会比较繁琐。//注意这里的指的是我们App的根组件。对根组件进行包装后,我们可以在任意子页面使用{context=>{context.name}{context.job}}将渲染成MegaGalaxyFrontEndEngineer缺点:理解起来费点功夫,写起来比较繁琐,只适用于特定类型的数据。需要明确组件之间的封装关系。全局传值推荐指数:???适用范围:页面间传值(全局任意页面)兼容性:IOS/Android原理:使用Node.js中的顶层对象——全局。挂载属性,使用属性传值传递的参数挂载在Global对象上,跳转后可以访问Global对象上的key获取对应的值,例如:A页面:Global.params={name:'Jalon',id:'123456'},跳转到任意页面后:Global.params//{name:'Jalon',id:'123456'}除了文字串,布尔值,对象和数组,函数也可以传递,如果传递的函数有引用组件Context变量,注意解耦,否则可能会报错。缺点:如果安装属性/方法过多容易造成冲突和污染,不利于维护。个人建议:只在react-navigation跳转传值和DeviceEventEmitter不方便维护时使用,但尽量少用,避免全局属性的污染和冲突总结列举了5种常用的参数/数据传递方法。从个人角度来说,推荐的顺序是ReactNavigation导航传值>DeviceEventEmitter触发事件并传值>AsyncStorageKey-Value存储传参,最后两个在特殊场景下只会用到,所以选择在正确的场景中正确的传值方式,会给ReactNative项目的开发带来事半功倍的效果。