KEMBAR78
[React Native Tutorial] Lecture 5: Input and State | PDF
Kobkrit Viriyayudhakorn, Ph.D.
CEO of iApp Technology Limited.
kobkrit@gmail.com
http://www.kobkrit.com
All source code
• https://github.com/kobkrit/react-native-class-2017
BMI Calculator App
Making BMI Calculator App
1. Draw UI on Paper
2. Initial project using react-
native
1. $|> react-native
init bmi
3. Making UI
4. Making Styles
5. Adding User Input Handling
6. Compute and Output
Draft on Paper
Making UI
1. Create container that fill
whole screen
2. Set the flexDirection of
container to ‘column’ and its

justifyContent: ‘center’
3. Start Adding Elements
1. Text
2. TextInput
3. TouchableOpacity
Draft on Paper
Using view to group each items.
Keyboard Types (Cross-Platform)
<TextInput keyboardType=‘default’>
default
numeric email-address
phone-pad
iOS (9.3)
Keyboard Types (Cross-Platform)
<TextInput keyboardType=‘default’>
default
numeric email-address
phone-padAndroid (6.0)
More Keyboard Types (iOS only)
<TextInput keyboardType=‘default’>
ascii-capable
numbers-punctuation number-pad
url
More Keyboard Types (iOS only)
<TextInput keyboardType=‘default’>
name-phone-pad
twitter web-search
decimal-pad
More TextInput Attribute
<TextInput
keyboardType=‘email-address’
autoCaptialize=‘none’
autoCorrect={false}
maxLength={30}
multiline={false}
placeholder=‘Please insert e-mail’
returnKeyType=‘next’
/>
https://facebook.github.io/react-native/docs/textinput.html
Cmd-K to Open/Hide Keyboard
Password TextInput
<TextInput
keyboardType=‘default’
secureTextEntry={true}
…

/>
iOS -> Cmd-K to Open/Hide Keyboard
Add User Input Feedback
Enable JS Debugger
Cmd - D
(iOS)


Menu Button

(Android)
State
• State is a JavaScript Object that we use to track
and response to users’ inputs.
• Each React component has its own instance of
state.
• Most important thing about state:
• Any change in state will cause all components
or any children components inside of it to be re-
rendered.
State’s Rule of Thumb
• When using state in component, always set the
initialize state to the reasonable values.
• Always use
this.setState(changedObjects)instead of
this.state.changedObject = someValue
• If not using this.setState(), React something
will not acknowledge the changes. Components
will not be re-rendered.
• Some strange behavior will happen in the app.
Initialize State
• We first defined 3 variables in state at the class’s constructor
• weight (String) = ‘0’ - It is a string because we use it with TextInput.
• height (String) = ‘0’ - It is a string because we use it with TextInput.
• and calculated bmi (Number) = 0
Showing/Setting State in
TextInput
• value attribute - setting the text according to the state.weight’s 

value
• onChangeText attribute - invoked when user making change the

TextInput, apply the new input value into the state.
See State in Action
• To see state working in action, Print the state value in render()
• Run the application.
• Typing some number into Weight (KG) and then Typing some
number into Height (CM) and see the difference.
At start, Weight (KG) = 0, 

according to the weight

state’s value.
Console in React Native Debugger

will print the state’s content, only when

the text in Weight(KG) is changed, because

the state make the component re-render.
Continue on Height
TextInput
Let’s compute the BMI
Method Binding
• Refresh the app now, input some
number, and push compute button.
You will see the red screen.
• It is because compute() method
is not the standard method in the
component class (We added it by
our own).
• The scope of compute() method
is not yet visible to the class’s state.
Method Binding
• You can bind the scope, by using bind()
statement.
• The best place to bind the method is at the class
constructor.
Showing the output
Full Source Code# 1
Full Source Code #2
Full Source Code #3
Exercise 1
• Showing the obesity level under the BMI number.
• BMI > 32 = Obese
• 25 < BMI < 32 = Over Weight
• 18.5 < BMI < 25 = Normal Weight
• BMI < 18.5 = Under Weight
Making Stopwatch App!
1. Draw UI on Paper
2. Initial project using react-
native
1. $|> react-native
init stopwatch
3. Making UI
4. Adding Style
5. Adding Logic
Initialize State
Showing the timeElapse
Handle Start Button Pressed
Minutes-Second-
Milliseconds Time Format
• Press Start Button
• TimeElapsed in milliseconds is displayed.
• We need to format TimeElapsed to
00:00.00 format, We have a library for that.
• Go to terminal at the working directory
• >|$ npm install minutes-
seconds-milliseconds --save
Minutes-Second-
Milliseconds Time Format
UI Separation
• We need to make the Stop button first. (Only start is
showing now)
• It is a good idea to seperate the start/stop button UI from
the main render method, since the main render method is
very long (hard to read, and hard to maintenance)
Add startButton, stopButton style
startStopButton method
Using startStopButton method
Don’t forget the method binding
Making Timer Stop
Working Start/Stop Timer App
Making Lap Function Works!
• Every time when user press the lap button, record
the current timeElapsed into this.state.lap
and reset the startTime
• Make the lower half of the app’s screen showing
the list of timeElapsed in this.state.lap array.
Implement handleLapPress
Lap Button UI Separation
render method
Display the Lap Array
See the difference
With the UI separation
Without
Full Source Code# 1
Full Source Code# 2
Full Source Code# 3
Full Source Code# 4
Home Work
• How to reset the laps?
• It is leaved as the homework for you.
• See the iOS 9’s stopwatch app for idea.

[React Native Tutorial] Lecture 5: Input and State