最近的项目中采用了React-Native,其中不少功能需要自己来写原生部分的支持,其中一个就是在RN和原生之间的数据交互,我把自己的经验写下来做个记录。
RN和原生的数据交互有好几种方式,可是对我来说最熟悉和便利操作的就是UserDefaults,就选用这个了。
场景是我在原生保存一段数据,在RN端读取并使用。
1.读取UserDefaults
具体实现:
注:参考了部分博客和github开源代码,后续补齐。
头文件
RCTUserDefaults.h
#import <React/RCTBridge.h>
@interface RCTUserDefaults : NSObject <RCTBridgeModule>
@end
实现文件
#import"RCTUserDefaults.h"
@implementationRCTUserDefaults
RCT_EXPORT_MODULE()
//这里就是获取userdfaults中存储的值,但是只保留了获取,而且只是从standardUserDefaults中获取的。
RCT_EXPORT_METHOD(getObject:(NSString*)key callback:(RCTResponseSenderBlock)cb) {
NSUserDefaults*userDefaults = [NSUserDefaults standardUserDefaults];
NSString*result = [userDefaults stringForKey:key];
//直接获取字符串的值,用于简单场景,若需要更加复杂的功能
//那么直接采用react-native-userdefaults-ios,
//使用方法也很简单。
if(result) {
cb(@[result]);//找到了就返回
}else{
cb(@[@NO]);//╮(╯_╰)╭没找到
}
}
说起来其实这个原理真不难的…为啥我就是想不到呢~
另一方面,在RN端的实现文件中(xxx为你的键值)使用方法为:
在react-native 中引入 NativeModules,
类似于这样:
import {
AppRegistry,
Image,
ListView,
StyleSheet,
TextInput,
Platform,
Navigator,
Alert,
NativeModules,
Text,
View,
} from 'react-native';
然后引入原生功能:
const { UserDefaults } = NativeModules;
使用:
UserDefaults.getObject("xxx", data => {
console.log(data);
if (data && data.length > 0) {
//根据原生返回的不同的值,做不同处理,没有直接给出成功或者错误子句 ,
//比如 if(data == false){} 什么的…
}
});
应该就可以了吧…
ps:
提到的插件的github地址
https://github.com/dsibiski/react-native-userdefaults-ios