react native evening

76
ReactNative Evening CoWork South Bay Torrance, CA 26 July 2017 @ 7:00 PM, PDT

Upload: troy-miles

Post on 23-Jan-2018

170 views

Category:

Software


0 download

TRANSCRIPT

ReactNative EveningCoWork South Bay

Torrance, CA 26 July 2017

@ 7:00 PM, PDT

Me• Troy Miles

• Over 38 years of programming experience

• Software engineer, speaker, book and video author

[email protected]

• @therockncoder

• lynda.com Author

Kotlin for Java Developers

“Learn once, write anywhere: Build mobile apps with React”

React Native

• “Deliver native Android, iOS, and Windows apps, using existing skills, teams, and code.”

• Released: March 27, 2015

• 51k+ GitHub Stars

Installation

• Node.js (& npm)

• Android SDK

• iOS SDK (on Mac only)

• React Native

Android Development

• Install Java 8

• Install Android Studio

• Install Android SDK 23 (Marshmallow)

• Install Intel HAXM (x86 Android Emulator)

iOS Development

• Install Xcode from macOS App Store

Mac Installation

• brew install node

• brew install watchman*

• npm i -g react-native-cli

Windows Installation

• choco install nodejs.install

• choco install python2

• choco install jdk8

iOS Development

• In order to build apps for iOS you must have a Mac

React-Native

• react-native init <app name>

• cd <app name>

• react-native run-android / run-ios

react-native CLICommand Purposeinit [app name] creates a react-native app

run-android [options] builds app, starts on Android

run-ios [options] builds app, starts on iOS

start [options] starts webserver

new-library [options] generates a native library bridge

bundle [options] builds offline javascript bundle

unbundle [options] builds unbundle javascript

react-native CLICommand Purposeeject [options] takes the shackles offlink [options] <packageName> links all native dependenciesunlink [options] <packageName> unlink native dependencyinstall [options] <packageName> install+link native dependenciesuninstall [options] <packageName> uninstall+unlink nativeupgrade [options] upgrade app's template files log-android [options] starts adb logcatlog-ios [options] starts iOS device syslog tail

Application Root Directory

• All of the commands, for all of the tools are designed work on the application root directory

• If used anywhere else bad things will happen

• be sure you are in the app root

• double check that you are in the app root

JavaScript

ECMAScript VersionsVersion Date

ES1 June 1997

ES2 June 1998

ES3 December 1999

ES4 DOA 2006

ES5 December 2009

ES2015 / ES6 June 2015

ES2016 / ES7 2016

Collection Operators• .isArray()

• .every()

• .forEach()

• .indexOf()

• .lastIndexOf()

• .some()

• .map()

• .reduce()

• .filter()

maplet junk = [1, 2, 3, 4, 'Alpha', 5, {name: 'Jason'}];let letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'];let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];console.log(nums);// map iterates over all of the elements and returns a new array with the same // number of elementslet nums2 = nums.map((elem) => elem * 2);console.log(nums2); /// [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40]

filterlet junk = [1, 2, 3, 4, 'Alpha', 5, {name: 'Jason'}];let letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'];let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];console.log(nums);// filter iterates over the array and returns a new array with only the elements // that pass the testlet nums3 = nums.filter((elem) => !!(elem % 2));console.log(nums3); /// [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

reducelet junk = [1, 2, 3, 4, 'Alpha', 5, {name: 'Jason'}];let letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'];let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];console.log(nums);// reduce iterates over the array passing the previous value and the current// element it is up to you what the reduction does, let's concatenate the stringslet letters2 = letters.reduce((previous, current) => previous + current);console.log(letters2); /// ABCDEFGHIJK// reduceRight does the same but goes from right to leftlet letters3 = letters.reduceRight((previous, current) => previous + current);console.log(letters3); /// KJIHGFEDCBA

let

• let allows us to create a block scoped variables

• they live and die within their curly braces

• var is considered deprecated

• best practice is to use let instead of var

let// let allows us to create block scoped variables// they live and die within the curly braceslet val = 2;console.info(`val = ${val}`);{ let val = 59; console.info(`val = ${val}`);} console.info(`val = ${val}`);

const

• const creates a variable that can't be changed

• best practice is to make any variable that should not change a constant

• does not apply to object properties or array elements

constconst name = 'Troy';console.info(`My name is ${name}`);// the line below triggers a type errorname = 'Miles';

Template strings

• Defined by using opening & closing back ticks

• Templates defined by ${JavaScript value}

• The value can be any simple JavaScript expression

• Allows multi-line strings (return is pass thru)

Template strings let state = 'California'; let city = 'Long Beach'; console.info(`This weekend's workshop is in ${city}, ${state}.`); // template strings can run simple expressions like addition let cup_coffee = 4.5; let cup_tea = 2.5; console.info(`coffee: $${cup_coffee} + tea: $${cup_tea} = $${cup_coffee + cup_tea}.`); // they can allow us to create multi-line strings console.info(`This is line #1.this is line #2.`);

Arrow functions

• Succinct syntax

• Doesn’t bind its own this, arguments, or super

• Facilitate a more functional style of coding

• Can’t be used as constructors

Arrow functions

• When only one parameter, parenthesis optional

• When zero or more than one parameter, parenthesis required

Arrow functionlet anon_func = function (num1, num2) { return num1 + num2;}; console.info(`Anonymous func: ${anon_func(1, 2)}`);let arrow_func = (num1, num2) => num1 + num2;console.info(`Arrow func: ${arrow_func(3, 4)}`);

this

• this is handled different in arrow functions

• In anonymous function this is bound to the global object

• In arrow function this is what it was in the outer scope

Destructuring

• Maps the data on the right side of the equals sign to the variables on the left

• The data type decides the way values are mapped

• It is either object or array destructuring

Object Destructuring16// this is a demo of the power of destructuring 17// we have two objects with the same 3 properties 18 const binary = {kb: 1024, mb: 1048576, gb: 1073741824}; 19 const digital = {kb: 1000, mb: 1000000, gb: 1000000000}; 20// We use a ternary statement to choose which object 21// assign properties based on their property names 22 const {kb, mb, gb} = (useBinary) ? binary : digital;

Array Destructuring5 6 let [param1, bob, key] = ['first', 'second', '3rd']; 7 console.info(`param1 = ${param1}, bob = ${bob}, key = ${key}`); 8 // param1 = first, bob = second, key = 3rd

Spread syntax

• Expands an expression in places where multiple arguments, elements, or variables are expected

The spread operator11 12 // the spread operator 13 const myArray = ['Bob', 'Sue', 'Fido']; 14 function printFamily(person1, person2, pet) { 15 console.info(`Person 1: ${person1}, Person 2: ${person2}, and their pet: ${pet}`); 16 } 17 printFamily(...myArray); 18 // Person 1: Bob, Person 2: Sue, and their pet: Fido 19

Class• Syntactic sugar over JavaScript use of function

constructors

• JavaScript uses proto-typical inheritance

• If a class extends another, it must include super() as first instruction in its constructor

• Only create a constructor if it does something

Class• Syntactic sugar over JavaScript use of function

constructors

• JavaScript uses proto-typical inheritance

• If a class extends another, it must include super() as first instruction in its constructor

• Only create a constructor if it does something

import• Imports functions, objects, or primitives from other

files

• import <name> from “<module name>”;

• import {name } from “<module name>”;

• import * as Greetings from “<module name>”;

• relative path indicates not an npm package

export

• export <var a>

• export {a, b};

export default• only one per file

• common pattern for libraries

• const Greetings = {sayHi, sayBye};

• export default Greetings;

• export default {sayHi, sayBye};

Importing Old School JS

• Many JS libraries don’t support the new syntax

• How do we use them?

• import ‘jquery’;

React

React• A JavaScript library for building user interfaces

• Created by Facebook & Instagram

• Initial release March 2013

• Current version 15.6.1

• Next major version 16.0.0, will have breaking changes

React

• Virtual DOM

• One-way data flow

• JSX - JavaScript eXtension allows in HTML generation

• Component-based

React API

• The use of JSX is optional in React

• You can use the React “API” instead

• The createClass method is deprecated and will be removed in React 16

Component

• Fundamental building block of React

• Can be created with a JS Class or Function

• The render method is mandatory

Class Component3 4 class Square extends React.Component { 5 render() { 6 return ( 7 <button 8 className="square" 9 onClick={() => this.props.onClick()}> 10 {this.props.value} 11 </button> 12 ); 13 } 14 } 15

Functional Component15 16 function Square(props) { 17 return ( 18 <button 19 className="square" 20 onClick={() => props.onClick()}> 21 {props.value} 22 </button> 23 ); 24 }

React.PropTypes

• React.PropTypes is deprecated

• It will be deleted in React 16

• Use the npm package “prop-types” instead

• importPropTypesfrom‘prop-types’;

PropTypes

• PropTypes allow you to declare what properties your component expects

• React validates property at runtime

• Using propTypes is optional

Some PropTypesComponent CommandPropTypes.array an optional arrayPropTypes.bool an optional boolPropTypes.element An optional React elementPropTypes.func An optional functionPropTypes.node Anything that can be renderedPropTypes.number An optional numberPropTypes.object An optional objectPropTypes.string An optional stringPropTypes.symbol An optional Symbol

PropType in code1 2 import React from 'react'; 3 import ReactDOM from 'react-dom'; 4 import PropTypes from 'prop-types'; 5 6 class App extends React.Component { 7 render () { 8 return React.DOM.span(null, `My name is ${this.props.name}`); 9 } 10 } 11 12 App.propTypes = { 13 name: PropTypes.string.isRequired 14 }; 15 16 ReactDOM.render( 17 React.createElement(App, {}), 18 document.getElementById('root') 19 ); 20 21

When property is missing

React Components

• Can be created two ways:

• Using JavaScript

• Using JSX

Components via JS• React’s API contains method createElement()

• Takes 3 parameters: type, props, children render() { return React.createElement('h1', null, "Hello there.");

JSX• JavaScript Syntax EXtension

• A mixture of JavaScript and HTML syntax

• Compiles to JavaScript

• Is optional but preferred over using JavaScript

• Is easier to read

JSX Attributes

• Can assign either a string or an expression

• Strings can be either single or double quotes

• Expressions must be enclosed with curly braces

Boolean Attributes• HTML has a few boolean attributes, if present they

are true

• Some of these include: checked, selected, disabled

• In JSX,

• <Component disabled={true / false} />

Forbidden Attributes

• Two attributes are JavaScript keywords

• JavaScript keywords can’t be used in JSX

• class -> className

• for -> htmlFor

JSX Spread Syntax

• a shortcut to passing props to a component

• uses ES2015 spread operator

• <Component {…object} />

JSX Spread Syntax return ( <Timer id={this.props.id} amount={this.props.amount} elapsed={this.props.elapsed} runningSince={this.props.runningSince} onStartClick={this.props.onStartClick} onStopClick={this.props.onStopClick} onResetClick={this.props.onResetClick} onSetClick={this.handleSetClick} /> );

JSX Spread Syntax return ( <Timer {...this.props} onSetClick={this.handleSetClick} /> );

JSX Debugging Tip

• Assign component to a variable

• console.log the variable

JSX Debugging Tip const timerComp = ( <Timer troy='miles' {...this.props} onSetClick={this.handleSetClick} /> ); console.log(timerComp);

JSX Debugging Tip

JSX Debugging Tip

Lifecycle EventsEvent WhencomponentWillMount invoked once before rendering

componentDidMount invoked after component loaded

componentWillReceiveProps invoked when receiving new props

shouldComponentUpdate asks if component should update

componentWillUpdate invoked before rendering new props

componentDidUpdate invoked after rendered new props

componentWillUnmount invoked before component removed

System ComponentsComponentActivityIndicator

Button

DatePickerIOS

DrawerLayoutAndroid

FlatList

Image

KeyboardAvoidingView

System ComponentsComponentListView

Modal

NavigatorIOS

Picker

PickerIOS

ProgressBarAndroid

ProgressViewIOS

System ComponentsComponentRefreshControl

ScrollView

SectionList

SegmentedControlIOS

Slider

SnapshotViewIOS

StatusBar

System ComponentsComponentSwitch

TabBarIOS

TabBarIOS.Item

Text

TextInput

ToolbarAndroid

TouchableHighlight

System ComponentsComponentTouchableNativeFeedback

TouchableOpacity

TouchableWithoutFeedback

View

ViewPagerAndroid

VirtualizedList

WebViewAPIs

Platform Differences

• Not all components work with all devices

• Some are for iOS only or Android only

• Those that end in IOS are for iOS

• Those that end in Android are for Android

Summary

• React Native allows you to make mobile apps in JS

• While easier than native development, it is not easy