This series contents:
- Part 1: Create a new React Native app
- Part 2: Create a simple Salary Calculator Form (current)
- Part 3: Create custom form input and button components
- Part 4: Work on the
FormBuilder
component - Part 5: Enable/disable form buttons on-the-fly
- Part 6: Create a Sign Up form
- Part 7: Add support for Boolean field type
Part 2: Create a simple Salary Calculator Form
We'll start by creating a very basic form with two text inputs and two buttons. The updated App.js
file should look something like this:
import React, { Component } from 'react'; import { StyleSheet, KeyboardAvoidingView, Text, Keyboard, TextInput, TouchableOpacity, Alert, } from 'react-native'; export default class App extends Component { constructor(props) { super(props); // define the initial state, so we can use it later // when we'll need to reset the form this.initialState = { hourlyRate: '', hoursPerWeek: '' }; this.state = this.initialState; } /** * Grab user's input data and do the math. */ handleSubmit = () => { // using Javascript object destructuring to // get user's input data from the state. const { hourlyRate, hoursPerWeek } = this.state; // hide the keyboard // NOTE: the keyboard seems to show up after being dismissed // when using the Alert react native component. // Not a big deal at the moment (this is fine π). Keyboard.dismiss(); // make sure we have some numeric values to work with if (!parseFloat(hourlyRate) || !parseFloat(hoursPerWeek)) { Alert.alert('Input error', 'Please input some positive numeric values.'); return; } // do the Math const annualIncome = Math.abs(parseFloat(hourlyRate) * parseFloat(hoursPerWeek) * 52); // show results Alert.alert( 'Your input and result', `$/hour: ${hourlyRate},\n Hours/week: ${hoursPerWeek}, \n Annual Income: $${annualIncome}`, ); }; /** * Reset the form and hide the keyboard. */ resetForm = () => { Keyboard.dismiss(); this.setState(this.initialState); }; render() { const { hourlyRate, hoursPerWeek } = this.state; return ( <KeyboardAvoidingView behavior="padding" style={styles.container}> <Text style={styles.screenTitle}>Salary Calculator</Text> <TextInput style={styles.textInput} placeholder="$/hour" keyboardType="numeric" returnKeyType="done" blurOnSubmit onChangeText={text => this.setState({ hourlyRate: text })} value={hourlyRate} /> <TextInput style={styles.textInput} placeholder="Hours/week" keyboardType="numeric" returnKeyType="done" blurOnSubmit onChangeText={text => this.setState({ hoursPerWeek: text })} value={hoursPerWeek} /> <TouchableOpacity style={styles.button} onPress={this.handleSubmit}> <Text style={styles.buttonText}>Calculate</Text> </TouchableOpacity> <TouchableOpacity style={styles.button} onPress={this.resetForm}> <Text style={styles.buttonText}>Reset</Text> </TouchableOpacity> </KeyboardAvoidingView> ); } } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', paddingHorizontal: 20, backgroundColor: '#3F4EA5', }, screenTitle: { fontSize: 35, textAlign: 'center', margin: 10, color: '#FFF', }, textInput: { height: 40, borderColor: '#FFF', borderWidth: 1, borderRadius: 3, backgroundColor: '#FFF', paddingHorizontal: 10, marginBottom: 10, fontSize: 18, color: '#3F4EA5', }, button: { backgroundColor: '#FD6592', borderRadius: 3, height: 40, marginBottom: 10, justifyContent: 'center', alignItems: 'center', }, buttonText: { color: '#FFF', fontWeight: 'bold', fontSize: 16, }, });
And as a result we'll end up having a calculator screen which looks and works like this:
So what do we have here?
a main container created using the KeyboardAvoidingView component. You can normally use simple View components to create containers, but when you're dealing with showing/hiding the virtual keyboard, then it's recommended to use
KeyboardAvoidingView
to improve user's experience.a form title created via a Text component
two text inputs to ask the user what's its
hourlyRate
and how manyhoursPerWeek
are billable. We use the TextInput for that. This component has anonChangeText
prop that takes a function to be called every time the text changed. We use that prop to store the user's input into thestate
. That way we can easily access and manipulate that value anywhere in our component.a submit button created using the TouchableOpacity. We could also use the default Button component to create a button, but this one doesn't allow much customization when it comes to UI changes. Both the
TouchableOpacity
andButton
components accept anonPress
prop which takes a function to be called when the user taps the button.a reset button which resets both text inputs and hides the virtual keyboard when tapped.
For a full list of changes, check out this commit on GitHub.
Now that we have this simple form ready, let's move on to Part 3 of this series where we'll create some wrapper components for our text inputs and buttons.
Top comments (0)