Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Native Modules & UI Components in React Native
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Enes Kaya
June 22, 2017
Technology
65
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Native Modules & UI Components in React Native
ReactNative Meetup Talk:
https://www.meetup.com/de-DE/ReactNative-Hamburg
Enes Kaya
June 22, 2017
Other Decks in Technology
See All in Technology
Post AI時代のリファクタリング実践記 / Refactoring in the post AI era
kaminashi
1
230
WasmをRustにする
sansantech
PRO
0
250
実体験から学ぶ分析エージェントの開発と運⽤
recruitengineers
PRO
8
2.4k
Temporal 最高!でも改めて「日付」について調べたら人類の負債すぎる件
riyaamemiya
0
140
Code for Security プロジェクト紹介 2026年10月
yu23ki14
0
110
スプシの手作業からの解脱 ~更新はClaude Codeに、見せ方と使い方はGASアプリに任せる~
kentarofujii
0
150
Claude Code本は、どのように執筆チームで書かれたか
oikon48
1
380
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
570
M5Stackで作る BLEマウス GPSログの世界
tomokusaba
0
420
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
730
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
330
DGX Spark でどこまでハッキングができるのか?
kash1064
3
1.3k
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Designing Experiences People Love
moore
143
24k
A designer walks into a library…
pauljervisheath
211
25k
Optimizing for Happiness
mojombo
378
71k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Accessibility Awareness
sabderemane
1
250
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
410
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
370
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
320
Building AI with AI
inesmontani
PRO
1
1.3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Transcript
Native Modules & UI Components in React Native The native
in React Native React Native Meetup HH - 2017 - Enes Kaya 1
Why Bother? —Bunch of react-native-* components —5552 as of now
(via npmjs.com) —Big Community and monthly update cycle —Steadily growing React Native Meetup HH - 2017 - Enes Kaya 2
Why Bother? —Understand how RN works ✔ —New APIs introduced
at WWDC/Google I/O ✔ —Contribute to Community ✔ —Bring your own codebase ✔ React Native Meetup HH - 2017 - Enes Kaya 3
Objective-C Primer React Native Meetup HH - 2017 - Enes
Kaya 4
What's Objective-C? —Superset of C —Object/Protocol-Oriented Language inspired by Smalltalk
—Extended by Foundation Framework (NS*) React Native Meetup HH - 2017 - Enes Kaya 5
(Usually) Two files per class // ------- Class.h ------- //
The class definition #import "SomeModule.h" @interface Class : NSObject <Protocol> @property NSString* aProperty; - (void) example:(id)a method:(id)b; @end // ------- Class.m ------- @implementation Class - (void) example:(id)a method:(id)b { //... } @end React Native Meetup HH - 2017 - Enes Kaya 6
Strings NSString* myString = @"I'm a string, yo!"; React Native
Meetup HH - 2017 - Enes Kaya 7
Calling methods NSString* myString = @"I'm a string, yo!"; NSString*
myCapitalizedString; myCapitalizedString = [myString capitalizedString]; React Native Meetup HH - 2017 - Enes Kaya 8
Native Modules React Native Meetup HH - 2017 - Enes
Kaya 9
The Bridge Architecture —shadow queue - Layouting1 —main thread -
UIKit, view rendering —JavaScript Core - Business logic 1 Not a thread actually, instead a GCD queue (on iOS) React Native Meetup HH - 2017 - Enes Kaya 10
// Logger.h @interface Logger : NSObject <RCTBridgeModule> @end // Logger.m
@implementation Logger RCT_EXPORT_MODULE() RCT_EXPORT_METHOD(greet:(NSString *)name) { NSLog(@"Hi, %@!", name); [_bridge.eventDispatcher sendAppEventWithName:@"greeted" body:@{ @"name": name }]; } @end React Native Meetup HH - 2017 - Enes Kaya 11
// Logger.h @interface Logger : NSObject <RCTBridgeModule> @end // Logger.m
@implementation Logger RCT_EXPORT_MODULE() RCT_EXPORT_METHOD(greet:(NSString *)name) { NSLog(@"Hi, %@!", name); [_bridge.eventDispatcher sendAppEventWithName:@"greeted" body:@{ @"name": name }]; } @end React Native Meetup HH - 2017 - Enes Kaya 12
// Logger.h @interface Logger : NSObject <RCTBridgeModule> @end // Logger.m
@implementation Logger RCT_EXPORT_MODULE() RCT_EXPORT_METHOD(greet:(NSString *)name) { NSLog(@"Hi, %@!", name); [_bridge.eventDispatcher sendAppEventWithName:@"greeted" body:@{ @"name": name }]; } @end React Native Meetup HH - 2017 - Enes Kaya 13
// Logger.h @interface Logger : NSObject <RCTBridgeModule> @end // Logger.m
@implementation Logger RCT_EXPORT_MODULE() RCT_EXPORT_METHOD(greet:(NSString *)name) { NSLog(@"Hi, %@!", name); [_bridge.eventDispatcher sendAppEventWithName:@"greeted" body:@{ @"name": name }]; } @end React Native Meetup HH - 2017 - Enes Kaya 14
// Logger.java class Logger extends ReactContextBaseJavaModule { @Override public String
getName() { return "Logger"; } @ReactMethod public void greet(String name) { Log.d("Logger", "Hi, " + name + "!"); } } React Native Meetup HH - 2017 - Enes Kaya 15
// Logger.java class Logger extends ReactContextBaseJavaModule { @Override public String
getName() { return "Logger"; } @ReactMethod public void greet(String name) { Log.d("Logger", "Hi, " + name + "!"); } } React Native Meetup HH - 2017 - Enes Kaya 16
// Logger.java class Logger extends ReactContextBaseJavaModule { @Override public String
getName() { return "Logger"; } @ReactMethod public void greet(String name) { Log.d("Logger", "Hi, " + name + "!"); } } React Native Meetup HH - 2017 - Enes Kaya 17
Argument Types JS Objective-C Java String NSString String Number NSNumber,
Float, Double, ... Integer, Float, Double, ... Bool BOOL boolean Object NSDictionary ReadableMap Array NSArray ReadableArray function RCTResponseSenderBlock Callback React Native Meetup HH - 2017 - Enes Kaya 18
import { NativeModules } from 'react-native' const Logger = NativeModules.Logger
Logger.greet("ReactNativeHH") // => Hi, ReactNativeHH! React Native Meetup HH - 2017 - Enes Kaya 19
Callbacks RCT_EXPORT_METHOD(greet:(NSString*) name callback:(RCTResponseSenderBlock) callback) { NSLog(...); // Do more
stuff... callback(@[argument1, argument2, ...]); } React Native Meetup HH - 2017 - Enes Kaya 20
Callbacks RCT_EXPORT_METHOD(greet:(NSString*) name callback:(RCTResponseSenderBlock) callback) { NSLog(...); // Do more
stuff... callback(@[argument1, argument2, ...]); } React Native Meetup HH - 2017 - Enes Kaya 21
Callbacks import { NativeModules } from 'react-native' const Logger =
NativeModules.Logger Logger.greet( "ReactNativeHH", (argument1, argument2, ...) => { // Do something... } ) React Native Meetup HH - 2017 - Enes Kaya 22
Callbacks import { NativeModules } from 'react-native' const Logger =
NativeModules.Logger Logger.greet( "ReactNativeHH", (argument1, argument2, ...) => { // Do something... } ) React Native Meetup HH - 2017 - Enes Kaya 23
Keep Your Promises (Experimental) RCT_REMAP_METHOD(findEvents, findEventsWithResolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { NSArray *events
= ... if (events) { resolve(events); } else { NSError *error = ... reject(@"no_events", @"There were no events", error); } } React Native Meetup HH - 2017 - Enes Kaya 24
Keep Your Promises (Experimental) RCT_REMAP_METHOD(findEvents, findEventsWithResolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { NSArray *events
= ... if (events) { resolve(events); } else { NSError *error = ... reject(@"no_events", @"There were no events", error); } } React Native Meetup HH - 2017 - Enes Kaya 25
Keep Your Promises (Experimental) RCT_REMAP_METHOD(findEvents, findEventsWithResolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { NSArray *events
= ... if (events) { resolve(events); } else { NSError *error = ... reject(@"no_events", @"There were no events", error); } } React Native Meetup HH - 2017 - Enes Kaya 26
Events // CalendarManager.h #import <React/RCTBridgeModule.h> #import <React/RCTEventEmitter.h> @interface CalendarManager :
RCTEventEmitter <RCTBridgeModule> @end React Native Meetup HH - 2017 - Enes Kaya 27
Events // CalendarManager.m #import "CalendarManager.h" @implementation CalendarManager RCT_EXPORT_MODULE(); - (NSArray<NSString
*> *)supportedEvents { return @[@"EventReminder"]; } - (void)calendarEventReminderReceived:(NSNotification *)notification { NSString *eventName = notification.userInfo[@"name"]; [self sendEventWithName:@"EventReminder" body:@{@"name": eventName}]; } @end React Native Meetup HH - 2017 - Enes Kaya 28
Events // CalendarManager.m #import "CalendarManager.h" @implementation CalendarManager RCT_EXPORT_MODULE(); - (NSArray<NSString
*> *)supportedEvents { return @[@"EventReminder"]; } - (void)calendarEventReminderReceived:(NSNotification *)notification { NSString *eventName = notification.userInfo[@"name"]; [self sendEventWithName:@"EventReminder" body:@{@"name": eventName}]; } @end React Native Meetup HH - 2017 - Enes Kaya 29
Events // CalendarManager.m #import "CalendarManager.h" @implementation CalendarManager RCT_EXPORT_MODULE(); - (NSArray<NSString
*> *)supportedEvents { return @[@"EventReminder"]; } - (void)calendarEventReminderReceived:(NSNotification *)notification { NSString *eventName = notification.userInfo[@"name"]; [self sendEventWithName:@"EventReminder" body:@{@"name": eventName}]; } @end React Native Meetup HH - 2017 - Enes Kaya 30
React Native Meetup HH - 2017 - Enes Kaya 31
Native UI Components React Native Meetup HH - 2017 -
Enes Kaya 32
React Native has several of the most critical platform components
[...], but not all of them [...] — RN Documentation React Native Meetup HH - 2017 - Enes Kaya 33
// RNTMapManager.m #import <MapKit/MapKit.h> #import <React/RCTViewManager.h> @interface RNTMapManager : RCTViewManager
@end @implementation RNTMapManager RCT_EXPORT_MODULE() - (UIView *)view { return [[MKMapView alloc] init]; } @end React Native Meetup HH - 2017 - Enes Kaya 34
// RNTMapManager.m #import <MapKit/MapKit.h> #import <React/RCTViewManager.h> @interface RNTMapManager : RCTViewManager
@end @implementation RNTMapManager RCT_EXPORT_MODULE() - (UIView *)view { return [[MKMapView alloc] init]; } @end React Native Meetup HH - 2017 - Enes Kaya 35
// RNTMapManager.m #import <MapKit/MapKit.h> #import <React/RCTViewManager.h> @interface RNTMapManager : RCTViewManager
@end @implementation RNTMapManager RCT_EXPORT_MODULE() - (UIView *)view { return [[MKMapView alloc] init]; } @end React Native Meetup HH - 2017 - Enes Kaya 36
To be continued this year at codetalks ! React Native
Meetup HH - 2017 - Enes Kaya 37
Thank you Enes Kaya, @eneskaya React Native Meetup HH -
2017 - Enes Kaya 38