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
Building Stellar User Experiences with React Na...
Search
Alexander Kotliarskyi
July 12, 2017
Programming
1.1k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Building Stellar User Experiences with React Native
Alexander Kotliarskyi
July 12, 2017
More Decks by Alexander Kotliarskyi
See All by Alexander Kotliarskyi
React Native: Under the Hood
frantic
31
22k
React Native Tutorial - NYC'15
frantic
5
1.5k
Other Decks in Programming
See All in Programming
そのデザイントークン、Flutterでも同じ見た目になりますか?
nakamizu
0
130
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
200
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
110
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
270
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
170
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.4k
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
290
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
3
620
Railsバージョンを4倍にした話
optim
0
830
baseline으로 마이그레이션, 리팩토링 안전하게 맡기기
fornewid
1
510
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
0
190
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
1.2k
Featured
See All Featured
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
610
How GitHub (no longer) Works
holman
316
150k
Exploring anti-patterns in Rails
aemeredith
4
550
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
460
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.6k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
960
Odyssey Design
rkendrick25
PRO
2
900
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
370
The Pragmatic Product Professional
lauravandoore
37
7.5k
Intergalactic Javascript Robots from Outer Space
tanoku
273
28k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Transcript
Alex Kotliarskyi Building Stellar User Experiences with React Native
None
How do you know ☕ is good?
☕
☕
Expectations
Expectations iOS Android Desktop Web Mobile Web Windows Linux
Mobile apps have higher UX expectations level than Web apps
Expectations change
None
None
iOS Developer Web Developer React ❤ React Native Core Team
(3 years) Building apps with RN (F8, Oculus) Alex Kotliarskyi @alex_frantic
<ScrollView> UIScrollView iOS android.widget.ScrollView Android
"React Native made me 10x more productive"
Android RN iOS time
10% is not done
Building for is different
<ScrollView> <Text> <View> <DatePicker> <Switch> <Image> <TabBar>
<ScrollView> <Text> <View> <DatePicker> <Switch> <Image> <TabBar>
<ScrollView> <Text> <View> <DatePicker> <Switch> <Image> <TabBar> ✨
Text Input Direct Manipulation Animation and Spatial Awareness Loading State
UI Library ....
It's all simple things
...but not very obvious
None
Text Input Direct Manipulation Animation and Spatial Awareness Loading State
UI Library
None
None
<TextInput style={styles.field} value={this.state.email} onChangeText={(email) => this.setState({email})} />
None
None
10% time 100% done
Dismissing keyboard Autofocus Placeholders Space under keyboard Spell checking and
auto-capitalization Keyboard type Custom return key
<TextInput style={styles.field} value={this.state.email} onChangeText={(email) => this.setState({email})} keyboardAppearance="light" placeholder="
[email protected]
" autoFocus={true} autoCapitalize="none"
autoCorrect={false} keyboardType="email-address" returnKeyType="next" onSubmitEditing={this._focusNext} blurOnSubmit={false} />
<EmailInput value={this.state.email} onChangeText={(email) => this.setState({email})} />
Text Input Direct Manipulation Animation and Spatial Awareness Loading State
UI Library
None
None
None
None
None
Direct manipulation
Direct Manipulation Instant Feedback Physics Touch Targets Ability to Cancel
✍
https://webkit.org/blog/5610/more-responsive-tapping-on-ios/
<Touchable* />
Direct Manipulation Instant Feedback Physics Touch Targets Ability to Cancel
None
Animated.decay() Animated.timing() Animated.spring() https://github.com/wix/react-native-interactable
None
Animated.spring(value, { ... useNativeDriver: true, }).start();
InteractionManager
Direct Manipulation Instant Feedback Physics Touch Targets Ability to Cancel
None
None
https://material.io/guidelines/usability/accessibility.html#accessibility-style
<Touchable hitSlop={...} />
None
Direct Manipulation Instant Feedback Physics Touch Targets Ability to Cancel
Button Cancelled
Text Input Direct Manipulation Animation and Spatial Awareness Loading State
UI Library
None
None
None
None
None
None
Animation not a luxury
Animation a tool
iOS Android
None
Text Input Direct Manipulation Animation and Spatial Awareness Loading State
UI Library
Most of web is about pages of content
None
None
class TaskDetails extends React.Component { props: { id: string
}; state = { data: null }; componentDidMount() { fetch(`/tasks?id=${this.props.id}`) .then(response => response.json()) .then(data => this.setState({data})); } render() { if (!this.state.data) { return <ActivityIndicator /> } else { return ( ... ); } } }
Loading...
None
None
None
class TaskDetails extends React.Component { props: { id: string,
data: ?Object }; state = { data: null }; componentDidMount() { fetch(`/tasks?id=${this.props.id}`) .then(response => response.json()) .then(data => this.setState({data})); } render() { const data = this.state.data || this.props.data; return ( ... ); } }
class TaskListItem extends React.Component { render() { return
( ... <TouchableHighlight onPressIn={this._startPrefetching}> ... </TouchableHighlight> ... ); } } 500ms
DX → UX
MobX Relay
It Does Not Matter!
Go beyond what frameworks provide
Text Input Direct Manipulation Animation and Spatial Awareness Loading State
UI Library
"Building with React Native is so easy, we don't need
standard components" – Developer
Button
function Button(props) { return ( <TouchableOpacity onPress={props.onPress}>
<Text style={styles.blue}> {props.caption} </Text> </TouchableOpacity> ); }
10% time 100% done
Cross platform Disabled state Icon Fixed height Text wrapping Accessibility
Consistency
Build your own standard controls
Button ✨ ✨
Text Input Direct Manipulation Animation and Spatial Awareness Loading State
UI Library
Experience it on a real device Animation and gestures are
essential tools Go beyond what frameworks provide
Not rocket science
Resources?
None
But you can learn to see it
You have to care
Designers have to care
"Stop Drawing Dead Fish" Bret Victor
Little details are big
Quality is our responsibility
Quality defines perception of your business
Quality defines perception of React Native ecosystem
Build "pit of success" Talk more about User Experience Great
examples
Thanks! http://frantic.im @alex_frantic ☕