React Native Workflow
- Write React Native code in separate repo
- Build into iOS and Android bundles
- Host bundles as static files on a server
- Native code fetches bundle, and uses JS code to power native views
RCTRootView
Text
self.rootView =[[RCTRootView alloc] initWithBundleURL : reactBundle
moduleName:@"ReactAppBase"
initialProperties:nil
launchOptions:nil];
We don't have to make round trips for every view load - we can store the bundle on the device, and only fetch it remotely after a given time.
Bridging with Native Code
- To integrate into existing apps, it is imperative to both take data into React (like how we think of props), and call Native code from React.
- For example, we need to let the native code fetch the Premium products, and pass them into our React Native code when they are ready.
Props in iOS
Text
self.reactView.rootView.appProperties = @{
@"productOne": @{
@"price":self.productOne.price
},
@"productTwo": @{
@"price":self.productTwo.price
}
};
...And then in React:
Text
const {
productOne,
productTwo,
} = this.props
...
<View style={styles.purchaseButton}>
<Button
onPress={() => GoProBridge.purchaseClicked('MONTHLY')}
text={`Monthly $${productOne && productOne.price}`} />
</View>
** We can't pass props in on Android. But, we can use an event dispatching system to pass data into React asynchronously
Bridging Module
Text
RCT_EXPORT_MODULE(GoProBridge);
RCT_EXPORT_METHOD(purchaseClicked:(NSString *)purchaseType){
NSLog(@"purchasing flow from react native");
[self.goProViewController purchaseClicked:purchaseType];
}
...In React:
import {
NativeModules,
} from 'react-native'
const GoProBridge = NativeModules.GoProBridge
...
onPress={() => GoProBridge.purchaseClicked('MONTHLY')
Styling: Flexbox!
Text
import { StyleSheet } from 'react-native'
export const styles = StyleSheet.create({
container: {
flex: 1,
},
purchaseButtonRow: {
flexDirection: 'row',
paddingLeft: 5,
paddingRight: 5,
},
purchaseButton: {
flex: 1,
paddingTop: 10,
paddingBottom: 10,
paddingRight: 5,
paddingLeft: 5,
},
})
All results in:
Header: native
everything else: React Native 'subview'
React Native
By Michael DeWitt
React Native
- 1,097