SlideShare uma empresa Scribd logo
1 de 125
Baixar para ler offline
September 2017
Introduction to

React Native
Nacho Martín
Nacho Martin
I write code at Limenius.
We build tailor-made projects,
and provide consultancy
and formation.
We are very happy with React and React Native.
Roadmap:
What is React Native
Starting a project
Working with Styles
Layout
Lists
Navigation
Networking
Touching the native side
What is React Native?
Fundamental premise of React
Give me a state and a render() method
that depends on it and forget about
how and when to render.*
Fundamental premise of React
Give me a state and a render() method
that depends on it and forget about
how and when to render.*
* Unless you want more control.
render() {
return (
<div className="App">
<button onClick={this.tick}>Click me!</button>
<span>Clicks: {this.state.count}</span>
</div>
)
}
render() {
return (
<div className="App">
<button onClick={this.tick}>Click me!</button>
<span>Clicks: {this.state.count}</span>
</div>
)
}
render() {
return (
<View style={…}>
<Button onPress={this.tick}>Click me!</Button>
<Text>Clicks: {this.state.count}</Text>
</View>
)
}
render() {
return (
<div className="App">
<button onClick={this.tick}>Click me!</button>
<span>Clicks: {this.state.count}</span>
</div>
)
}
render() {
return (
<View style={…}>
<Button onPress={this.tick}>Click me!</Button>
<Text>Clicks: {this.state.count}</Text>
</View>
)
}
render() {
return (
<div className="App">
<button onClick={this.tick}>Click me!</button>
<span>Clicks: {this.state.count}</span>
</div>
)
}
render() {
return (
<View style={…}>
<Button onPress={this.tick}>Click me!</Button>
<Text>Clicks: {this.state.count}</Text>
</View>
)
}
React Native
How is this possible
Reconciliation
Determines what parts
of the tree have changed
How is this possible
Reconciliation
Determines what parts
of the tree have changed
Rendering
Actually
updates the app
How is this possible
Reconciliation
Determines what parts
of the tree have changed
Rendering
Actually
updates the app
We can have several
renderers
React targets
Main
react-dom react-native
Web iOS android
React targets
Main
react-dom react-native
Web iOS android
But also
React targets
Main
react-dom react-native
Web iOS android
But also
react-art  react-canvas react-three ReactLibertyreact-worker-dom
React targets
Main
react-dom react-native
Web iOS android
But also
react-art  react-canvas react-three ReactLibertyreact-worker-dom
react-konsul raxreact-native  react-blessedreact-tvml
React targets
Main
react-dom react-native
Web iOS android
But also
react-art  react-canvas react-three ReactLibertyreact-worker-dom
react-konsul raxreact-native  react-blessedreact-tvml
React-GLreact-vr  react-hardware react-fs-renderer react-x11
React targets
Main
react-dom react-native
Web iOS android
But also
react-art  react-canvas react-three ReactLibertyreact-worker-dom
react-konsul raxreact-native  react-blessedreact-tvml
React-GLreact-vr  react-hardware react-fs-renderer react-x11
redocx react-titanium  React-Gibbon react-pdf  react-test-renderer
React targets
Main
react-dom react-native
Web iOS android
But also
react-art  react-canvas react-three ReactLibertyreact-worker-dom
react-konsul raxreact-native  react-blessedreact-tvml
React-GLreact-vr  react-hardware react-fs-renderer react-x11
redocx react-titanium  React-Gibbon react-pdf  react-test-renderer
ink  react-sketchapp 
React blessed
React blessed
React Sketch.app
React VR
Demo
How Native is React Native?
JS Thread
Business logic &
Description of what
components to render
How Native is React Native?
JS Thread Main Thread
UI manipulation
with native
components
Business logic &
Description of what
components to render
How Native is React Native?
JS Thread Main Thread
UI manipulation
with native
components
Business logic &
Description of what
components to render
Bridge
How much code can we reuse?
Tip: if you develop in one platform,
try it in the other from time to time
70%? 80%? 90%?
How to start a project
Option 1: create-react-native-app
$ npm install -g create-react-native-app
$ create-react-native-app AwesomeProject
Option 1: create-react-native-app
Only JS, no iOS or Android code
(outside node_modules)
If you want to modify native code, $ npm run eject
Uses the Expo app to test in real device
Meant to have a quick way of trying
react-native
Option 2: react-native init
$ npm install -g react-native-cli
$ react-native init AwesomeProject
Option 2: react-native init
Complete project with native code
More control
Needed to use things like CodePush
Doesn’t need external tools to publish to
the store
Getting our hands dirty
git clone https://github.com/Limenius/workshop-react-native.git
You are supposed to have done this
🙏
And then yarn install
git checkout dirtyhands
react-native run-ios
And then
Or
react-native run-android
git checkout dirtyhands
react-native run-ios
And then
Or
react-native run-android
Debug tools Cmd + d
(Cmd + r)
Play around
Open app/App.js with an editor
<Text style={styles.welcome}>Hi there!</Text>Change the text in
Try nesting
<Text>
<Text style={styles.welcome}>Hi there!</Text>
Amigo
</Text>
Try changing some styles
welcome: {
fontSize: 100,
textAlign: 'center',
margin: 10,
},
Try placing a console.log(‘hi’) before return(… and see it in
Chrome dev tools
Familiarize with errors
What happens if we…
remove a closing tag (</View>)
<View style={styles.container}>
Hi there!
</View>
put text not wrapped in <Text/>
try to comment a JSX line with //
return (
<View style={styles.container}>
<Text style={styles.welcome}>Hi there!</Text>
</View>
<View/>
)
have two root elements
use wrong properties for styles ( rename flex -> flexo )
remove the words export default
Basic components
git checkout elements
git reset HEAD --hard
(To discard your changes)
Exercise:
Play with the basic components
app/App.js
Exercise: Build new components
Can you build a new component combining others?
Ideas: Image with footer (<Text/>), two buttons that display different alerts
Can you pass props to that component?
Ideas: Pass the text of the footer with props, pass also the image, pass the titles of the buttons
Can your build a component with local state?
Ideas: Modify the counter to have a “minus 1” button
Style 💅
No CSS. Everything is JS
<View style={{
borderLeftColor: Colors.accent,
borderLeftWidth: 9,
backgroundColor: Colors.backgroundSection,
padding: 18,
paddingVertical: 9,
}}>
No class
No dimensions in pixels
No things like padding: 19 9 3 1
camelCased
Use constants
StyleSheet
<View style={Styles.headline}>
const Styles = StyleSheet.create({
headline: {
borderLeftColor: Colors.accent,
borderLeftWidth: 9,
backgroundColor: Colors.backgroundSection,
paddingLeft: 18,
paddingRight: 18,
paddingTop: 9,
paddingBottom: 9,
},
})
Combination
<View style={[Styles.headline, {backgroundColor: 'red'}]}>
const Styles = StyleSheet.create({
headline: {
borderLeftColor: Colors.accent,
borderLeftWidth: 9,
paddingLeft: 18,
paddingRight: 18,
paddingTop: 9,
paddingBottom: 9,
},
})
git checkout styles
(To discard your changes)
git reset HEAD --hard
We want to do this
Our first goal is to get this
(We will practice layouts in the next section)
components/MovieHeader.js
height: 210
fontWeight:‘bold’
fontSize: FontSizes.LargeTitle
48x48, rounded
backgroundColor: Colors.highlight
color: Colors.text
color: Colors.text
fontWeight:‘bold’
border: left, size 9, Colors.accent
padding: 9, 18
backgroundColor: Colors.backgroundSection
Exercise 1
84x84
Colors.text, bold
Container has: border at bottom size 1, Colors.subtleAccent
and background is 'white'
components/ListItemActor.js
Exercise 2
FontSizes.gigantic
Colors.background
Container has: a background with color: Colors.highlight
components/MainHeader.js
Image is 40x90
FontSizes.subhead
With weight ‘200’
Colors.background
Pro exercise:Think how would you add support for themes
Dimensions
import {
Dimensions,
} from 'react-native'
const windowSize = Dimensions.get('window')
mainImage: {
height: windowSize.height /3,
width: undefined
},
components/MovieHeader.js
Dimensions
import {
Dimensions,
} from 'react-native'
const windowSize = Dimensions.get('window')
mainImage: {
height: windowSize.height /3,
width: undefined
},
Our image height depends on the
Height of the window
Use sparingly
components/MovieHeader.js
Dimensions
import {
Dimensions,
} from 'react-native'
const windowSize = Dimensions.get('window')
mainImage: {
height: windowSize.height /3,
width: undefined
},
Our image height depends on the
Height of the window
Use sparingly
Exercise: Can you make another style dependant of
Dimensions?
What will happen if the device is rotated?
Can you find anything in the documentation to fix it?
components/MovieHeader.js
Further reading
https://www.okgrow.com/posts/react-native-styling-tips
https://madebymany.com/stories/a-year-of-react-native-styling-part-1
https://medium.com/robin-powered/introducing-glamorous-for-react-native-1b8365e7f33f
https://github.com/styled-components/styled-components
Explore libraries to do CSS in JS
Layouts
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
flexDirection: ‘column' flexDirection: ‘row’
(Default)
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
flexDirection: ‘column' flexDirection: ‘row’
(Default)
main direction
crossdirection
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
flexDirection: ‘column' flexDirection: ‘row’
(Default)
main direction
crossdirection
cross direction
maindirection
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
flexDirection: ‘column’
(Default)
‘flex-start’ ‘flex-end’ ‘center' ‘space-around’ ‘space-between’
flexDirection: ‘row’
(Default)
‘flex-start’ ‘flex-end’ ‘center' ‘space-around’ ‘space-between’
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
flexDirection: ‘column’
(Default)
‘flex-start’ ‘flex-end’ ‘center' ‘stretch’ ‘baseline’
flexDirection: ‘row’
(Default)
‘flex-start’ ‘flex-end’ ‘center' ‘stretch’ ‘baseline’
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
flexDirection: ‘row’
‘baseline’
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
flexDirection: ‘column’
alignSelf: ’end’
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
flex: 1
flex: 0
flex: 0
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
flex: 5
flex: 2
flex: 3
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
flex: 0.5
flex: 0.2
flex: 0.3
This is flexbox realm
flexDirection
justifyContent
alignItems
alignSelf
flex
alignContent
flexBasis
flexGrow
flexShrink
flexWrap
flex: 25
flex: 10
flex: 15
git checkout layout
(To discard your changes)
git reset HEAD --hard
Our goal
app/components/MovieHeader.js
app/components/MovieHeader.js
18
Exercise 1
app/components/ListItemActor.js
Exercise 2
Hint: create subviews if you need them
Optional: can you come up with a different layout for any of our three components?
app/components/MainHeader.js
Further reading
https://facebook.github.io/yoga/docs/getting-started/
Docs:
https://github.com/jondot/ReactNativeKatas
Very good practice:
Lists
Lists are important in mobile
Naive lists, as in the web
export default class Movie extends Component {
constructor(props) {
super(props)
this.state = {
movie: movies.find((movie) => movie.name === 'Pulp Fiction')
}
}
render() {
return (
<View>
<MovieHeader movie={this.state.movie}/>
{ this.state.movie.actors.map(actor => (
<ListItem key={actor} name={actor} image={actors[actor].image}/>
))}
</View>
)
}
}
app/components/Movie.js
Naive lists, as in the web
export default class Movie extends Component {
constructor(props) {
super(props)
this.state = {
movie: movies.find((movie) => movie.name === 'Pulp Fiction')
}
}
render() {
return (
<View>
<MovieHeader movie={this.state.movie}/>
{ this.state.movie.actors.map(actor => (
<ListItem key={actor} name={actor} image={actors[actor].image}/>
))}
</View>
)
}
}
Important to help the reconciler do its work
app/components/Movie.js
Exercise
git checkout lists
Can you build a list of movies in
app/components/MovieList.js ?
(To discard your changes)
git reset HEAD --hard
FlatList
Highly optimized List component
Features:
• Scroll loading (onEndReached).
• Pull to refresh (onRefresh / refreshing).
• Configurable viewability (VPV) callbacks (onViewableItemsChanged / viewabilityConfig).
• Horizontal mode (horizontal).
• Intelligent item and section separators.
• Multi-column support (numColumns)
• scrollToEnd, scrollToIndex, and scrollToItem
• Better Flow typing.
FlatList
render() {
return (
<View>
<MovieHeader movie={this.state.movie}/>
<FlatList
data={this.state.movie.actors}
renderItem={({item}) =>
<ListItem name={item} image={this.state.actors[item].image}/>
}
/>
</View>
)
}
app/components/Movie.js
FlatList
FlatList
What about the keys?
FlatList
What about the keys?
<FlatList
data={this.state.movie.actors}
keyExtractor={item => item}
renderItem={({item}) =>
<ListItem name={item} image={this.state.actors[item].image}/>
}
/>
FlatList
What about the keys?
<FlatList
data={this.state.movie.actors}
keyExtractor={item => item}
renderItem={({item}) =>
<ListItem name={item} image={this.state.actors[item].image}/>
}
/>
FlatList
Scrolleable area
<FlatList
data={this.state.movie.actors}
keyExtractor={item => item}
renderItem={({item}) =>
<ListItem name={item} image={this.state.actors[item].image}/>
}
/>
<MovieHeader movie={this.state.movie}/>
FlatList
Desired scrolleable area
FlatList
Desired scrolleable area
<FlatList
data={this.state.movie.actors}
ListHeaderComponent={<MovieHeader movie={this.state.movie}/>}
keyExtractor={item => item}
renderItem={({item}) =>
<ListItem name={item} image={this.state.actors[item].image}/>
}
/>
FlatList
Desired scrolleable area
<FlatList
data={this.state.movie.actors}
ListHeaderComponent={<MovieHeader movie={this.state.movie}/>}
keyExtractor={item => item}
renderItem={({item}) =>
<ListItem name={item} image={this.state.actors[item].image}/>
}
/>
Exercise
Can you use FlatList in
app/components/MovieList.js ?
git checkout flatLists
item => item
reminder
In this case works as
function(item) {
return item
}
git reset HEAD —hard
(To discard your changes)
Further reading
https://facebook.github.io/react-native/blog/2017/03/13/
better-list-views.html
Read the docs of the components:
FlatList
SectionList
VirtualizedList
Navigation
Navigation
react-navigation
Several options
StackNavigator TabNavigator DrawerNavigator Or combine them
Several options
StackNavigator TabNavigator DrawerNavigator Or combine them
Several options
StackNavigator TabNavigator DrawerNavigator Or combine them
Several options
StackNavigator TabNavigator DrawerNavigator Or combine them
Let’s do it
git checkout navigation
(To discard your changes)
git reset HEAD --hard
Let’s do it
const App = StackNavigator({
Home: { screen: MovieList },
Movie: { screen: Movie },
}, {
navigationOptions: {
headerTintColor: Colors.accent,
headerStyle: Styles.header,
}
})
app/App.js
Let’s do it
const App = StackNavigator({
Home: { screen: MovieList },
Movie: { screen: Movie },
}, {
navigationOptions: {
headerTintColor: Colors.accent,
headerStyle: Styles.header,
}
})
app/App.js
export default class MovieList extends Component {
static navigationOptions = {
title: 'Movies',
}
//…
app/components/MovieList.js
Let’s do it
const App = StackNavigator({
Home: { screen: MovieList },
Movie: { screen: Movie },
}, {
navigationOptions: {
headerTintColor: Colors.accent,
headerStyle: Styles.header,
}
})
app/App.js
export default class MovieList extends Component {
static navigationOptions = {
title: 'Movies',
}
//…
app/components/MovieList.js
<FlatList
data={this.state.movies}
ListHeaderComponent={<MainHeader/>}
keyExtractor={item => item.name}
renderItem={({item}) =>
<TouchableHighlight
underlayColor={Colors.subtleAccent}
activeOpacity={0.5}
onPress={() => navigate('Movie', {name: item.name})}
>
<View>
<ListItem name={item.name} image={item.image}/>
</View>
</TouchableHighlight>
}
/>
In render()
Let’s do it
const App = StackNavigator({
Home: { screen: MovieList },
Movie: { screen: Movie },
}, {
navigationOptions: {
headerTintColor: Colors.accent,
headerStyle: Styles.header,
}
})
app/App.js
export default class MovieList extends Component {
static navigationOptions = {
title: 'Movies',
}
//…
app/components/MovieList.js
<FlatList
data={this.state.movies}
ListHeaderComponent={<MainHeader/>}
keyExtractor={item => item.name}
renderItem={({item}) =>
<TouchableHighlight
underlayColor={Colors.subtleAccent}
activeOpacity={0.5}
onPress={() => navigate('Movie', {name: item.name})}
>
<View>
<ListItem name={item.name} image={item.image}/>
</View>
</TouchableHighlight>
}
/>
In render()
Exercise
Can you make a navigation transition from Movie to
app/components/Actor ?
Steps:
- Declare the screen in app/App.js
- Use a TouchableHighlight to capture onPress in the actors
list of <Movie/>
- Provide an appropriate title in <Actor/>
- Make the actor displayed based on
props.navigation.state.params.name
Optional: have a look at
https://reactnavigation.org/docs/navigators/stack#StackNavigatorConfig
And tweak the navigation (Ideas: mode modal, add something to headerRight)
Networking
Networking
React-native uses the Fetch API
If you already know it, you are all set 🎉 
Let’s do it
componentDidMount() {
return fetch(baseUrl + '/movies')
.then((response) => response.json())
.then((responseJson) => {
this.setState({
isLoading: false,
movies: responseJson,
})
})
.catch((error) => {
console.error(error);
})
}
app/components/MovieList.js
Let’s do it
git checkout networking
yarn start-server
(To discard your changes)
git reset HEAD --hard
Further reading
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
Docs:
https://github.com/mzabriskie/axios
Additional libraries:
Interactive
Our goal
Working with state
Not specific of React Native,
we just use what we know of React 
Let’s do it
git checkout interactive
(To discard your changes)
git reset HEAD --hard
Modify the native side
Cases where it is needed
Installing packages that have a native side
Making our own changes or components
Installing assets, such as fonts
…
Simple case
Install this font
Let’s do it
"rnpm": {
"assets": ["./assets/fonts/"]
}
package.json
git checkout mod-native
(To discard your changes)
git reset HEAD --hard
Let’s do it
"rnpm": {
"assets": ["./assets/fonts/"]
}
package.json
react-native link
git checkout mod-native
(To discard your changes)
git reset HEAD --hard
Assets linked
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: android/app/src/main/assets/fonts/OleoScript-Bold.ttf
new file: android/app/src/main/assets/fonts/OleoScript-Regular.ttf
modified: ios/travolta.xcodeproj/project.pbxproj
modified: ios/travolta/Info.plist
modified: package.json
Summary:
What is React Native
Starting a project
Working with Styles
Layout
Lists
Navigation
Networking
Touching the native side
Thanks! @nacmartin
nacho@limenius.com

Mais conteúdo relacionado

Mais procurados

Mais procurados (20)

React native app with type script tutorial
React native app with type script tutorialReact native app with type script tutorial
React native app with type script tutorial
 
A tour of React Native
A tour of React NativeA tour of React Native
A tour of React Native
 
React native introduction
React native introductionReact native introduction
React native introduction
 
React Native
React NativeReact Native
React Native
 
React vs Angular: ups & downs (speaker Oleksandr Kovalov, Binary Studio)
React vs Angular: ups & downs (speaker Oleksandr Kovalov, Binary Studio)React vs Angular: ups & downs (speaker Oleksandr Kovalov, Binary Studio)
React vs Angular: ups & downs (speaker Oleksandr Kovalov, Binary Studio)
 
Introduction to React Native
Introduction to React NativeIntroduction to React Native
Introduction to React Native
 
JavaScript, React Native and Performance at react-europe 2016
JavaScript, React Native and Performance at react-europe 2016JavaScript, React Native and Performance at react-europe 2016
JavaScript, React Native and Performance at react-europe 2016
 
Ryan Christiani I Heard React Was Good
Ryan Christiani I Heard React Was GoodRyan Christiani I Heard React Was Good
Ryan Christiani I Heard React Was Good
 
Angular2 Development for Java developers
Angular2 Development for Java developersAngular2 Development for Java developers
Angular2 Development for Java developers
 
How to Implement Basic Angular Routing and Nested Routing With Params in Angu...
How to Implement Basic Angular Routing and Nested Routing With Params in Angu...How to Implement Basic Angular Routing and Nested Routing With Params in Angu...
How to Implement Basic Angular Routing and Nested Routing With Params in Angu...
 
How native is React Native? | React Native vs Native App Development
How native is React Native? | React Native vs Native App DevelopmentHow native is React Native? | React Native vs Native App Development
How native is React Native? | React Native vs Native App Development
 
Angular Application Testing
Angular Application TestingAngular Application Testing
Angular Application Testing
 
React Native custom components
React Native custom componentsReact Native custom components
React Native custom components
 
The Gist of React Native
The Gist of React NativeThe Gist of React Native
The Gist of React Native
 
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
[React Native] Lecture 4: Basic Elements and UI Layout by using FlexBox
 
React on es6+
React on es6+React on es6+
React on es6+
 
Exploring Angular 2 - Episode 2
Exploring Angular 2 - Episode 2Exploring Angular 2 - Episode 2
Exploring Angular 2 - Episode 2
 
Integrating React.js with PHP projects
Integrating React.js with PHP projectsIntegrating React.js with PHP projects
Integrating React.js with PHP projects
 
Angular 2 Essential Training
Angular 2 Essential Training Angular 2 Essential Training
Angular 2 Essential Training
 
Exploring Angular 2 - Episode 1
Exploring Angular 2 - Episode 1Exploring Angular 2 - Episode 1
Exploring Angular 2 - Episode 1
 

Semelhante a React Native Workshop - React Alicante

Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Paulo Ragonha
 

Semelhante a React Native Workshop - React Alicante (20)

JS Fest 2018. Илья Иванов. Введение в React-Native
JS Fest 2018. Илья Иванов. Введение в React-NativeJS Fest 2018. Илья Иванов. Введение в React-Native
JS Fest 2018. Илья Иванов. Введение в React-Native
 
Workshop 24: React Native Introduction
Workshop 24: React Native IntroductionWorkshop 24: React Native Introduction
Workshop 24: React Native Introduction
 
Connect.js - Exploring React.Native
Connect.js - Exploring React.NativeConnect.js - Exploring React.Native
Connect.js - Exploring React.Native
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
Introduction to React for Frontend Developers
Introduction to React for Frontend DevelopersIntroduction to React for Frontend Developers
Introduction to React for Frontend Developers
 
Building a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBuilding a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profit
 
Let's react - Meetup
Let's react - MeetupLet's react - Meetup
Let's react - Meetup
 
React js programming concept
React js programming conceptReact js programming concept
React js programming concept
 
Lessons from a year of building apps with React Native
Lessons from a year of building apps with React NativeLessons from a year of building apps with React Native
Lessons from a year of building apps with React Native
 
[1D6]RE-view of Android L developer PRE-view
[1D6]RE-view of Android L developer PRE-view[1D6]RE-view of Android L developer PRE-view
[1D6]RE-view of Android L developer PRE-view
 
Getting Started With Material Design
Getting Started With Material DesignGetting Started With Material Design
Getting Started With Material Design
 
Modular Web Applications With Netzke
Modular Web Applications With NetzkeModular Web Applications With Netzke
Modular Web Applications With Netzke
 
#FrontConf2017 — Enhance your User (and Developer) Experience with React & Redux
#FrontConf2017 — Enhance your User (and Developer) Experience with React & Redux#FrontConf2017 — Enhance your User (and Developer) Experience with React & Redux
#FrontConf2017 — Enhance your User (and Developer) Experience with React & Redux
 
React + Redux Introduction
React + Redux IntroductionReact + Redux Introduction
React + Redux Introduction
 
High Performance web apps in Om, React and ClojureScript
High Performance web apps in Om, React and ClojureScriptHigh Performance web apps in Om, React and ClojureScript
High Performance web apps in Om, React and ClojureScript
 
Creating a WYSIWYG Editor with React
Creating a WYSIWYG Editor with ReactCreating a WYSIWYG Editor with React
Creating a WYSIWYG Editor with React
 
What's This React Native Thing I Keep Hearing About?
What's This React Native Thing I Keep Hearing About?What's This React Native Thing I Keep Hearing About?
What's This React Native Thing I Keep Hearing About?
 
Performance #3 layout&amp;animation
Performance #3  layout&amp;animationPerformance #3  layout&amp;animation
Performance #3 layout&amp;animation
 
MOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app developmentMOPCON 2014 - Best software architecture in app development
MOPCON 2014 - Best software architecture in app development
 
Variations on a Theme
Variations on a ThemeVariations on a Theme
Variations on a Theme
 

Mais de Ignacio Martín

Symfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worldsSymfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worlds
Ignacio Martín
 

Mais de Ignacio Martín (15)

Elixir/OTP for PHP developers
Elixir/OTP for PHP developersElixir/OTP for PHP developers
Elixir/OTP for PHP developers
 
Symfony 4 Workshop - Limenius
Symfony 4 Workshop - LimeniusSymfony 4 Workshop - Limenius
Symfony 4 Workshop - Limenius
 
Server Side Rendering of JavaScript in PHP
Server Side Rendering of JavaScript in PHPServer Side Rendering of JavaScript in PHP
Server Side Rendering of JavaScript in PHP
 
Extending Redux in the Server Side
Extending Redux in the Server SideExtending Redux in the Server Side
Extending Redux in the Server Side
 
Redux Sagas - React Alicante
Redux Sagas - React AlicanteRedux Sagas - React Alicante
Redux Sagas - React Alicante
 
Asegurando APIs en Symfony con JWT
Asegurando APIs en Symfony con JWTAsegurando APIs en Symfony con JWT
Asegurando APIs en Symfony con JWT
 
Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6Redux saga: managing your side effects. Also: generators in es6
Redux saga: managing your side effects. Also: generators in es6
 
Introduction to Redux
Introduction to ReduxIntroduction to Redux
Introduction to Redux
 
Keeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and WebpackKeeping the frontend under control with Symfony and Webpack
Keeping the frontend under control with Symfony and Webpack
 
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)Integrando React.js en aplicaciones Symfony (deSymfony 2016)
Integrando React.js en aplicaciones Symfony (deSymfony 2016)
 
Adding Realtime to your Projects
Adding Realtime to your ProjectsAdding Realtime to your Projects
Adding Realtime to your Projects
 
Symfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worldsSymfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worlds
 
Symfony 2 CMF
Symfony 2 CMFSymfony 2 CMF
Symfony 2 CMF
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
Presentacion git
Presentacion gitPresentacion git
Presentacion git
 

Último

TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
mohitmore19
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
shinachiaurasa2
 

Último (20)

Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verifiedSector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
Sector 18, Noida Call girls :8448380779 Model Escorts | 100% verified
 
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
 
Pharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodologyPharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodology
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
%in Stilfontein+277-882-255-28 abortion pills for sale in Stilfontein
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students8257 interfacing 2 in microprocessor for btech students
8257 interfacing 2 in microprocessor for btech students
 
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
MarTech Trend 2024 Book : Marketing Technology Trends (2024 Edition) How Data...
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 

React Native Workshop - React Alicante

  • 2. Nacho Martin I write code at Limenius. We build tailor-made projects, and provide consultancy and formation. We are very happy with React and React Native.
  • 3. Roadmap: What is React Native Starting a project Working with Styles Layout Lists Navigation Networking Touching the native side
  • 4. What is React Native?
  • 5. Fundamental premise of React Give me a state and a render() method that depends on it and forget about how and when to render.*
  • 6. Fundamental premise of React Give me a state and a render() method that depends on it and forget about how and when to render.* * Unless you want more control.
  • 7. render() { return ( <div className="App"> <button onClick={this.tick}>Click me!</button> <span>Clicks: {this.state.count}</span> </div> ) }
  • 8. render() { return ( <div className="App"> <button onClick={this.tick}>Click me!</button> <span>Clicks: {this.state.count}</span> </div> ) } render() { return ( <View style={…}> <Button onPress={this.tick}>Click me!</Button> <Text>Clicks: {this.state.count}</Text> </View> ) }
  • 9. render() { return ( <div className="App"> <button onClick={this.tick}>Click me!</button> <span>Clicks: {this.state.count}</span> </div> ) } render() { return ( <View style={…}> <Button onPress={this.tick}>Click me!</Button> <Text>Clicks: {this.state.count}</Text> </View> ) }
  • 10. render() { return ( <div className="App"> <button onClick={this.tick}>Click me!</button> <span>Clicks: {this.state.count}</span> </div> ) } render() { return ( <View style={…}> <Button onPress={this.tick}>Click me!</Button> <Text>Clicks: {this.state.count}</Text> </View> ) } React Native
  • 11. How is this possible Reconciliation Determines what parts of the tree have changed
  • 12. How is this possible Reconciliation Determines what parts of the tree have changed Rendering Actually updates the app
  • 13. How is this possible Reconciliation Determines what parts of the tree have changed Rendering Actually updates the app We can have several renderers
  • 16. React targets Main react-dom react-native Web iOS android But also react-art  react-canvas react-three ReactLibertyreact-worker-dom
  • 17. React targets Main react-dom react-native Web iOS android But also react-art  react-canvas react-three ReactLibertyreact-worker-dom react-konsul raxreact-native  react-blessedreact-tvml
  • 18. React targets Main react-dom react-native Web iOS android But also react-art  react-canvas react-three ReactLibertyreact-worker-dom react-konsul raxreact-native  react-blessedreact-tvml React-GLreact-vr  react-hardware react-fs-renderer react-x11
  • 19. React targets Main react-dom react-native Web iOS android But also react-art  react-canvas react-three ReactLibertyreact-worker-dom react-konsul raxreact-native  react-blessedreact-tvml React-GLreact-vr  react-hardware react-fs-renderer react-x11 redocx react-titanium  React-Gibbon react-pdf  react-test-renderer
  • 20. React targets Main react-dom react-native Web iOS android But also react-art  react-canvas react-three ReactLibertyreact-worker-dom react-konsul raxreact-native  react-blessedreact-tvml React-GLreact-vr  react-hardware react-fs-renderer react-x11 redocx react-titanium  React-Gibbon react-pdf  react-test-renderer ink  react-sketchapp 
  • 25. How Native is React Native? JS Thread Business logic & Description of what components to render
  • 26. How Native is React Native? JS Thread Main Thread UI manipulation with native components Business logic & Description of what components to render
  • 27. How Native is React Native? JS Thread Main Thread UI manipulation with native components Business logic & Description of what components to render Bridge
  • 28. How much code can we reuse? Tip: if you develop in one platform, try it in the other from time to time 70%? 80%? 90%?
  • 29. How to start a project
  • 30. Option 1: create-react-native-app $ npm install -g create-react-native-app $ create-react-native-app AwesomeProject
  • 31. Option 1: create-react-native-app Only JS, no iOS or Android code (outside node_modules) If you want to modify native code, $ npm run eject Uses the Expo app to test in real device Meant to have a quick way of trying react-native
  • 32. Option 2: react-native init $ npm install -g react-native-cli $ react-native init AwesomeProject
  • 33. Option 2: react-native init Complete project with native code More control Needed to use things like CodePush Doesn’t need external tools to publish to the store
  • 35. git clone https://github.com/Limenius/workshop-react-native.git You are supposed to have done this 🙏 And then yarn install
  • 36. git checkout dirtyhands react-native run-ios And then Or react-native run-android
  • 37. git checkout dirtyhands react-native run-ios And then Or react-native run-android
  • 38. Debug tools Cmd + d (Cmd + r)
  • 39. Play around Open app/App.js with an editor <Text style={styles.welcome}>Hi there!</Text>Change the text in Try nesting <Text> <Text style={styles.welcome}>Hi there!</Text> Amigo </Text> Try changing some styles welcome: { fontSize: 100, textAlign: 'center', margin: 10, }, Try placing a console.log(‘hi’) before return(… and see it in Chrome dev tools
  • 40. Familiarize with errors What happens if we… remove a closing tag (</View>) <View style={styles.container}> Hi there! </View> put text not wrapped in <Text/> try to comment a JSX line with // return ( <View style={styles.container}> <Text style={styles.welcome}>Hi there!</Text> </View> <View/> ) have two root elements use wrong properties for styles ( rename flex -> flexo ) remove the words export default
  • 42. git checkout elements git reset HEAD --hard (To discard your changes)
  • 43. Exercise: Play with the basic components app/App.js
  • 44. Exercise: Build new components Can you build a new component combining others? Ideas: Image with footer (<Text/>), two buttons that display different alerts Can you pass props to that component? Ideas: Pass the text of the footer with props, pass also the image, pass the titles of the buttons Can your build a component with local state? Ideas: Modify the counter to have a “minus 1” button
  • 46. No CSS. Everything is JS <View style={{ borderLeftColor: Colors.accent, borderLeftWidth: 9, backgroundColor: Colors.backgroundSection, padding: 18, paddingVertical: 9, }}> No class No dimensions in pixels No things like padding: 19 9 3 1 camelCased Use constants
  • 47. StyleSheet <View style={Styles.headline}> const Styles = StyleSheet.create({ headline: { borderLeftColor: Colors.accent, borderLeftWidth: 9, backgroundColor: Colors.backgroundSection, paddingLeft: 18, paddingRight: 18, paddingTop: 9, paddingBottom: 9, }, })
  • 48. Combination <View style={[Styles.headline, {backgroundColor: 'red'}]}> const Styles = StyleSheet.create({ headline: { borderLeftColor: Colors.accent, borderLeftWidth: 9, paddingLeft: 18, paddingRight: 18, paddingTop: 9, paddingBottom: 9, }, })
  • 49. git checkout styles (To discard your changes) git reset HEAD --hard
  • 50. We want to do this
  • 51. Our first goal is to get this (We will practice layouts in the next section)
  • 52. components/MovieHeader.js height: 210 fontWeight:‘bold’ fontSize: FontSizes.LargeTitle 48x48, rounded backgroundColor: Colors.highlight color: Colors.text color: Colors.text fontWeight:‘bold’ border: left, size 9, Colors.accent padding: 9, 18 backgroundColor: Colors.backgroundSection
  • 53. Exercise 1 84x84 Colors.text, bold Container has: border at bottom size 1, Colors.subtleAccent and background is 'white' components/ListItemActor.js
  • 54. Exercise 2 FontSizes.gigantic Colors.background Container has: a background with color: Colors.highlight components/MainHeader.js Image is 40x90 FontSizes.subhead With weight ‘200’ Colors.background Pro exercise:Think how would you add support for themes
  • 55. Dimensions import { Dimensions, } from 'react-native' const windowSize = Dimensions.get('window') mainImage: { height: windowSize.height /3, width: undefined }, components/MovieHeader.js
  • 56. Dimensions import { Dimensions, } from 'react-native' const windowSize = Dimensions.get('window') mainImage: { height: windowSize.height /3, width: undefined }, Our image height depends on the Height of the window Use sparingly components/MovieHeader.js
  • 57. Dimensions import { Dimensions, } from 'react-native' const windowSize = Dimensions.get('window') mainImage: { height: windowSize.height /3, width: undefined }, Our image height depends on the Height of the window Use sparingly Exercise: Can you make another style dependant of Dimensions? What will happen if the device is rotated? Can you find anything in the documentation to fix it? components/MovieHeader.js
  • 60. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap
  • 61. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap flexDirection: ‘column' flexDirection: ‘row’ (Default)
  • 62. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap flexDirection: ‘column' flexDirection: ‘row’ (Default) main direction crossdirection
  • 63. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap flexDirection: ‘column' flexDirection: ‘row’ (Default) main direction crossdirection cross direction maindirection
  • 64. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap flexDirection: ‘column’ (Default) ‘flex-start’ ‘flex-end’ ‘center' ‘space-around’ ‘space-between’ flexDirection: ‘row’ (Default) ‘flex-start’ ‘flex-end’ ‘center' ‘space-around’ ‘space-between’
  • 65. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap flexDirection: ‘column’ (Default) ‘flex-start’ ‘flex-end’ ‘center' ‘stretch’ ‘baseline’ flexDirection: ‘row’ (Default) ‘flex-start’ ‘flex-end’ ‘center' ‘stretch’ ‘baseline’
  • 66. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap flexDirection: ‘row’ ‘baseline’
  • 67. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap flexDirection: ‘column’ alignSelf: ’end’
  • 68. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap flex: 1 flex: 0 flex: 0
  • 69. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap flex: 5 flex: 2 flex: 3
  • 70. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap flex: 0.5 flex: 0.2 flex: 0.3
  • 71. This is flexbox realm flexDirection justifyContent alignItems alignSelf flex alignContent flexBasis flexGrow flexShrink flexWrap flex: 25 flex: 10 flex: 15
  • 72. git checkout layout (To discard your changes) git reset HEAD --hard
  • 77. Exercise 2 Hint: create subviews if you need them Optional: can you come up with a different layout for any of our three components? app/components/MainHeader.js
  • 79. Lists
  • 80. Lists are important in mobile
  • 81. Naive lists, as in the web export default class Movie extends Component { constructor(props) { super(props) this.state = { movie: movies.find((movie) => movie.name === 'Pulp Fiction') } } render() { return ( <View> <MovieHeader movie={this.state.movie}/> { this.state.movie.actors.map(actor => ( <ListItem key={actor} name={actor} image={actors[actor].image}/> ))} </View> ) } } app/components/Movie.js
  • 82. Naive lists, as in the web export default class Movie extends Component { constructor(props) { super(props) this.state = { movie: movies.find((movie) => movie.name === 'Pulp Fiction') } } render() { return ( <View> <MovieHeader movie={this.state.movie}/> { this.state.movie.actors.map(actor => ( <ListItem key={actor} name={actor} image={actors[actor].image}/> ))} </View> ) } } Important to help the reconciler do its work app/components/Movie.js
  • 83. Exercise git checkout lists Can you build a list of movies in app/components/MovieList.js ? (To discard your changes) git reset HEAD --hard
  • 84. FlatList Highly optimized List component Features: • Scroll loading (onEndReached). • Pull to refresh (onRefresh / refreshing). • Configurable viewability (VPV) callbacks (onViewableItemsChanged / viewabilityConfig). • Horizontal mode (horizontal). • Intelligent item and section separators. • Multi-column support (numColumns) • scrollToEnd, scrollToIndex, and scrollToItem • Better Flow typing.
  • 85. FlatList render() { return ( <View> <MovieHeader movie={this.state.movie}/> <FlatList data={this.state.movie.actors} renderItem={({item}) => <ListItem name={item} image={this.state.actors[item].image}/> } /> </View> ) } app/components/Movie.js
  • 88. FlatList What about the keys? <FlatList data={this.state.movie.actors} keyExtractor={item => item} renderItem={({item}) => <ListItem name={item} image={this.state.actors[item].image}/> } />
  • 89. FlatList What about the keys? <FlatList data={this.state.movie.actors} keyExtractor={item => item} renderItem={({item}) => <ListItem name={item} image={this.state.actors[item].image}/> } />
  • 90. FlatList Scrolleable area <FlatList data={this.state.movie.actors} keyExtractor={item => item} renderItem={({item}) => <ListItem name={item} image={this.state.actors[item].image}/> } /> <MovieHeader movie={this.state.movie}/>
  • 92. FlatList Desired scrolleable area <FlatList data={this.state.movie.actors} ListHeaderComponent={<MovieHeader movie={this.state.movie}/>} keyExtractor={item => item} renderItem={({item}) => <ListItem name={item} image={this.state.actors[item].image}/> } />
  • 93. FlatList Desired scrolleable area <FlatList data={this.state.movie.actors} ListHeaderComponent={<MovieHeader movie={this.state.movie}/>} keyExtractor={item => item} renderItem={({item}) => <ListItem name={item} image={this.state.actors[item].image}/> } />
  • 94. Exercise Can you use FlatList in app/components/MovieList.js ? git checkout flatLists item => item reminder In this case works as function(item) { return item } git reset HEAD —hard (To discard your changes)
  • 99. Several options StackNavigator TabNavigator DrawerNavigator Or combine them
  • 100. Several options StackNavigator TabNavigator DrawerNavigator Or combine them
  • 101. Several options StackNavigator TabNavigator DrawerNavigator Or combine them
  • 102. Several options StackNavigator TabNavigator DrawerNavigator Or combine them
  • 103. Let’s do it git checkout navigation (To discard your changes) git reset HEAD --hard
  • 104. Let’s do it const App = StackNavigator({ Home: { screen: MovieList }, Movie: { screen: Movie }, }, { navigationOptions: { headerTintColor: Colors.accent, headerStyle: Styles.header, } }) app/App.js
  • 105. Let’s do it const App = StackNavigator({ Home: { screen: MovieList }, Movie: { screen: Movie }, }, { navigationOptions: { headerTintColor: Colors.accent, headerStyle: Styles.header, } }) app/App.js export default class MovieList extends Component { static navigationOptions = { title: 'Movies', } //… app/components/MovieList.js
  • 106. Let’s do it const App = StackNavigator({ Home: { screen: MovieList }, Movie: { screen: Movie }, }, { navigationOptions: { headerTintColor: Colors.accent, headerStyle: Styles.header, } }) app/App.js export default class MovieList extends Component { static navigationOptions = { title: 'Movies', } //… app/components/MovieList.js <FlatList data={this.state.movies} ListHeaderComponent={<MainHeader/>} keyExtractor={item => item.name} renderItem={({item}) => <TouchableHighlight underlayColor={Colors.subtleAccent} activeOpacity={0.5} onPress={() => navigate('Movie', {name: item.name})} > <View> <ListItem name={item.name} image={item.image}/> </View> </TouchableHighlight> } /> In render()
  • 107. Let’s do it const App = StackNavigator({ Home: { screen: MovieList }, Movie: { screen: Movie }, }, { navigationOptions: { headerTintColor: Colors.accent, headerStyle: Styles.header, } }) app/App.js export default class MovieList extends Component { static navigationOptions = { title: 'Movies', } //… app/components/MovieList.js <FlatList data={this.state.movies} ListHeaderComponent={<MainHeader/>} keyExtractor={item => item.name} renderItem={({item}) => <TouchableHighlight underlayColor={Colors.subtleAccent} activeOpacity={0.5} onPress={() => navigate('Movie', {name: item.name})} > <View> <ListItem name={item.name} image={item.image}/> </View> </TouchableHighlight> } /> In render()
  • 108. Exercise Can you make a navigation transition from Movie to app/components/Actor ? Steps: - Declare the screen in app/App.js - Use a TouchableHighlight to capture onPress in the actors list of <Movie/> - Provide an appropriate title in <Actor/> - Make the actor displayed based on props.navigation.state.params.name Optional: have a look at https://reactnavigation.org/docs/navigators/stack#StackNavigatorConfig And tweak the navigation (Ideas: mode modal, add something to headerRight)
  • 110. Networking React-native uses the Fetch API If you already know it, you are all set 🎉 
  • 111. Let’s do it componentDidMount() { return fetch(baseUrl + '/movies') .then((response) => response.json()) .then((responseJson) => { this.setState({ isLoading: false, movies: responseJson, }) }) .catch((error) => { console.error(error); }) } app/components/MovieList.js
  • 112. Let’s do it git checkout networking yarn start-server (To discard your changes) git reset HEAD --hard
  • 116. Working with state Not specific of React Native, we just use what we know of React 
  • 117. Let’s do it git checkout interactive (To discard your changes) git reset HEAD --hard
  • 119. Cases where it is needed Installing packages that have a native side Making our own changes or components Installing assets, such as fonts …
  • 121. Let’s do it "rnpm": { "assets": ["./assets/fonts/"] } package.json git checkout mod-native (To discard your changes) git reset HEAD --hard
  • 122. Let’s do it "rnpm": { "assets": ["./assets/fonts/"] } package.json react-native link git checkout mod-native (To discard your changes) git reset HEAD --hard
  • 123. Assets linked Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: android/app/src/main/assets/fonts/OleoScript-Bold.ttf new file: android/app/src/main/assets/fonts/OleoScript-Regular.ttf modified: ios/travolta.xcodeproj/project.pbxproj modified: ios/travolta/Info.plist modified: package.json
  • 124. Summary: What is React Native Starting a project Working with Styles Layout Lists Navigation Networking Touching the native side