最近的項目中采用了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