Upgrade to Pro — share decks privately, control downloads, hide ads and more …

React Native - Apps multiplataforma

React Native - Apps multiplataforma

Aprende todo lo necesario para crear apps multiplataforma nativas iOS y Android, utilizando Javascript, gracias al framework de Facebook, React Native.

Avatar for Imanol Terán

Imanol Terán

October 17, 2016
Tweet

More Decks by Imanol Terán

Other Decks in Programming

Transcript

  1. TEMARIO > ¿Qué es React Native y por qué aprenderlo?

    > Conceptos básicos > Crear un Proyecto > Proyecto avanzado. App multiplataforma (iOS y Android)
  2. > Facebook no es solo una red social, también colabora

    activamente con la comunidad de desarrolladores > Principios de 2015 lanza un extensión de su librería React
  3. > Capaz de generar apps nativas para dispositivos móviles iOS

    y Android > Utilizando javascript > Con la capacidad de servir de puente entre los componentes nativos de cada sistema
  4. > Apps más lentas, sobre todo si usamos muchos gráficos.

    > Menos opciones en un WebView que en un Browser. > En muchos casos, sensación y comportamiento diferente que una app nativa. > PhoneGap / Cordova
  5. > Apps más eficientes. > Plataformas cerradas. > Menos control

    sobre lo que hay "por debajo". > Actualizaciones del sistema pueden hacer nuestra app inservible. > Esfuerzos para sacar actualizaciones.
  6. > Utilizar motor Javascript del entorno movil y ejecutar nuestro

    Javascript ahí. > Los controles nativos se mapean a objetos y funciones Javascript. > Appcelerator Titanium. > React Native podría estar dentro de este grupo.
  7. > En iOS, utiliza JavaScriptCore, motor JavAscript por defecto en

    iOS y en Safari. > Desarrolladores iOS pueden interactuar con el directamente. > Diferencia: React ejecuta el código Javascript en un hilo separado, por lo que mejora el rendimiento de la interfaz, sin bloqueos y mayor fluidez en las animaciones.
  8. > Componentes UI específicos de cada plataforma. > No sirve

    mismo código para iOS y Android. > React Native permite aprender una serie de habilidades y utilizarlas para desarrollar para varias plataformas.
  9. import React, { Component } from 'react'; import { Text,

    View } from 'react-native'; class WhyReactNativeIsSoGreat extends Component { render() { return ( <View> <Text> If you like React on the web, you'll like React Native. </Text> <Text> You just use native components like 'View' and 'Text', instead of web components like 'div' and 'span'. </Text> </View> ); } }
  10. > Una App hecha en React Native es una app

    NATIVA > No hablamos de apps en HTML5, web-apps ni apps híbridas. > Utiliza elementos nativos, los cuales juntamos utilizando Javascript y React.
  11. import React, { Component } from 'react'; import { Image,

    ScrollView, Text } from 'react-native'; class AwkwardScrollingImageWithText extends Component { render() { return ( <ScrollView> <Image source={{uri: 'https://i.chzbgr.com/full/7345954048/h7E2C65F9/'}} /> <Text> On iOS, a React Native ScrollView uses a native UIScrollView. On Android, it uses a native ScrollView. On iOS, a React Native Image uses a native UIImageView. On Android, it uses a native ImageView. React Native wraps the fundamental native components, giving you the performance of a native app, plus the clean design of React. </Text> </ScrollView> ); } }
  12. > Programación no es 100% "cross-platform", pero casi. > La

    base es React Native. > Nos permite trabajar a nivel de programación funcional en la construcción de interfaces y que estos reaccionen dinámicamente a través del framework
  13. > No "perdemos" tiempo recompilando nuestra app. > Se recarga

    de forma instantánea cada vez que hay un cambio. > Incluso podemos ejecutar código nuevo manteniendo el estado actual de la app.
  14. > Podemos utilizar / mezclar código nativo en cualquier momento

    que lo necesitemos. > App de Facebook funciona así: parte en React Native y parte en Swift/Objective-C , Java.
  15. import React, { Component } from 'react'; import { Text,

    View } from 'react-native'; import { TheGreatestComponentInTheWorld } from './your-native-code'; class SomethingFast extends Component { render() { return ( <View> <TheGreatestComponentInTheWorld /> <Text> TheGreatestComponentInTheWorld could use native Objective-C, Java, or Swift - the product development process is the same. </Text> </View> ); } }
  16. > Podemos modificar los componentes de React Native en el

    momento de crearlos mediante parámetros. > Estos parámetros se llaman props > Image es uno de los componentes de React Native.
  17. import React, { Component } from 'react'; import { AppRegistry,

    Image } from 'react-native'; class Bananas extends Component { render() { let pic = { uri: 'https://upload.wikimedia.org/wikipedia/commons/d/de/Bananavarieties.jpg' }; return ( <Image source={pic} style={{width: 193, height: 110}}/> ); } } AppRegistry.registerComponent('Bananas', () => Bananas);
  18. {pic} > De esta forma, convertimos el objeto en JSX

    > JSX nos permite meter cualquier código Javascript entre { }
  19. > También podemos usar props con nuestros propios componentes. >

    Así, podremos crear un componente y utilizarlo en diferentes lugares de la app, cambiando sus propiedades. > Tenemos que llamar a this.props dentro de nuestra función render
  20. import React, { Component } from 'react'; import { AppRegistry,

    Text, View } from 'react-native'; class Greeting extends Component { render() { return ( <Text>Hello {this.props.name}!</Text> ); } } class LotsOfGreetings extends Component { render() { return ( <View style={{alignItems: 'center'}}> <Greeting name='Rexxar' /> <Greeting name='Jaina' /> <Greeting name='Valeera' /> </View> ); } } AppRegistry.registerComponent('LotsOfGreetings', () => LotsOfGreetings);
  21. > Al utilizar name como un prop, podemos personalizar nuestro

    componente Greeting y reutilizarlo para cada uno de nuestros mensajes.
  22. > Uno de los componentes más útiles y que más

    utilizaremos. > Nos sirve como contenedor para otros componentes.
  23. Con props y los componentes Text, Image y View, podemos

    crear una gran cantidad de vistas estáticas de nuestra app.
  24. > Lo usamos para manipular los datos de nuestra app

    que van a cambiar > Inicializamos state en el constructor, y después llamamos a setState cuando quieres cambiar el componente. > Estos estados cambiarán en función de algún cambio en el servidor o recibimos algún input por parte del usuario.
  25. import React, { Component } from 'react'; import { AppRegistry,

    Text, View } from 'react-native'; class Blink extends Component { constructor(props) { super(props); this.state = {showText: true}; // Toggle the state every second setInterval(() => { this.setState({ showText: !this.state.showText }); }, 1000); } render() { let display = this.state.showText ? this.props.text : ' '; return ( <Text>{display}</Text> ); } } class BlinkApp extends Component { render() { return ( <View> <Blink text='I love to blink' /> <Blink text='Yes blinking is so great' /> <Blink text='Why did they ever take this out of HTML' /> <Blink text='Look at me look at me look at me' /> </View> ); } } AppRegistry.registerComponent('BlinkApp', () => BlinkApp);
  26. > React Native no tiene una forma específica de dar

    estilo a nuestras apps. > Debemos hacerlo utilizando Javascript. > Todos los componentes del framework aceptan el atributo style
  27. CSS

  28. > Los nombres de estilos y valores son muy similares

    a los utilizados en CSS. > Ligeras variaciones: backgroundColor en lugar de background-color
  29. > Normalmente, para pasar el estilo, usamos un objeto Javascript

    típico. > Si la app crece en complejidad, podemos pasar un array de estilos (el último elemento tiene preferencia, como CSS)
  30. import React, { Component } from 'react'; import { AppRegistry,

    StyleSheet, Text, View } from 'react-native'; class LotsOfStyles extends Component { render() { return ( <View> <Text style={styles.red}>just red</Text> <Text style={styles.bigblue}>just bigblue</Text> <Text style={[styles.bigblue, styles.red]}>bigblue, then red</Text> <Text style={[styles.red, styles.bigblue]}>red, then bigblue</Text> </View> ); } } const styles = StyleSheet.create({ bigblue: { color: 'blue', fontWeight: 'bold', fontSize: 30, }, red: { color: 'red', }, }); AppRegistry.registerComponent('LotsOfStyles', () => LotsOfStyles);
  31. > Los tamaños en React Native, no van en unidades,

    representan pixeles independientemente de la densidad.
  32. TAMAÑO FIJO > Usar cuando queremos que un componente tenga

    siempre el mismo tamaño, sin importar las dimensiones de la pantalla del dispositivo. > Debemos añadir al componente un widthy un height fijos
  33. import React, { Component } from 'react'; import { AppRegistry,

    View } from 'react-native'; class FixedDimensionsBasics extends Component { render() { return ( <View> <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} /> <View style={{width: 100, height: 100, backgroundColor: 'skyblue'}} /> <View style={{width: 150, height: 150, backgroundColor: 'steelblue'}} /> </View> ); } }; AppRegistry.registerComponent('AwesomeProject', () => FixedDimensionsBasics);
  34. TAMAÑO FLEXIBLE > Si usamos flex en un componente, conseguimos

    que crezca o decrezca, en función del espacio disponible en pantalla.
  35. > Normalmente usaremos flex: 1, de forma que el componente

    ocupe TODO el espacio disponible. > Este espacio se comparte con el resto de componentes que estén en su mismo nivel. > Cuanto mayor sea el valor flex, mayor será la proporción de espacio que ocupe con respecto a los otros componentes.
  36. import React, { Component } from 'react'; import { AppRegistry,

    View } from 'react-native'; class FlexDimensionsBasics extends Component { render() { return ( // Try removing the `flex: 1` on the parent View. // The parent will not have dimensions, so the children can't expand. // What if you add `height: 300` instead of `flex: 1`? <View style={{flex: 1}}> <View style={{flex: 1, backgroundColor: 'powderblue'}} /> <View style={{flex: 2, backgroundColor: 'skyblue'}} /> <View style={{flex: 3, backgroundColor: 'steelblue'}} /> </View> ); } }; AppRegistry.registerComponent('AwesomeProject', () => FlexDimensionsBasics);
  37. > Especificación de la W3C para layout web. > Soporte

    en navegadores mejorado. > Muchos frameworks lo están incluyendo > Permite controlar orientación, espacio y orden de los elementos de la interfaz.
  38. Consiste en proporcionar al contenedor la habilidad para cambiar la

    anchura y altura de los elementos que contiene, con el fin de rellenar de la forma más eficiente posible el espacio en blanco y prevenir los desbordes > Flexbox
  39. import React, { Component } from 'react'; import { AppRegistry,

    View } from 'react-native'; class FlexDirectionBasics extends Component { render() { return ( // Try setting `flexDirection` to `column`. <View style={{flex: 1, flexDirection: 'row'}}> <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} /> <View style={{width: 50, height: 50, backgroundColor: 'skyblue'}} /> <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} /> </View> ); } }; AppRegistry.registerComponent('AwesomeProject', () => FlexDirectionBasics);
  40. JUSTIFYCONTENT > Determina la alineación de un componente en el

    eje principal. > flex-start | center | flex-end | space- around | space-between
  41. import React, { Component } from 'react'; import { AppRegistry,

    View } from 'react-native'; class JustifyContentBasics extends Component { render() { return ( // Try setting `justifyContent` to `center`. // Try setting `flexDirection` to `row`. <View style={{ flex: 1, flexDirection: 'column', justifyContent: 'space-between', }}> <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} /> <View style={{width: 50, height: 50, backgroundColor: 'skyblue'}} /> <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} /> </View> ); } }; AppRegistry.registerComponent('AwesomeProject', () => JustifyContentBasics);
  42. ALIGNITEMS > Determina la alineación de un componente en el

    eje secundario. > flex-start | center | flex-end | stretch
  43. import React, { Component } from 'react'; import { AppRegistry,

    View } from 'react-native'; class AlignItemsBasics extends Component { render() { return ( // Try setting `alignItems` to 'flex-start' // Try setting `justifyContent` to `flex-end`. // Try setting `flexDirection` to `row`. <View style={{ flex: 1, flexDirection: 'column', justifyContent: 'center', alignItems: 'center', }}> <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} /> <View style={{width: 50, height: 50, backgroundColor: 'skyblue'}} /> <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} /> </View> ); } }; AppRegistry.registerComponent('AwesomeProject', () => AlignItemsBasics);
  44. > Para manejar la introdución de texto en la app

    por parte del usuario, tenemos el componente TextInput > Tiene dos props: onChangeText y onSubmitEditing
  45. import React, { Component } from 'react'; import { AppRegistry,

    Text, TextInput, View } from 'react-native'; class PizzaTranslator extends Component { constructor(props) { super(props); this.state = {text: ''}; } render() { return ( <View style={{padding: 10}}> <TextInput style={{height: 40}} placeholder="Type here to translate!" onChangeText={(text) => this.setState({text})} /> <Text style={{padding: 10, fontSize: 42}}> {this.state.text.split(' ').map((word) => word && '!').join(' ')} </Text> </View> ); } } AppRegistry.registerComponent('PizzaTranslator', () => PizzaTranslator);
  46. > Componente de tipo contenedor que permite hacer scroll. >

    Puede contener varios componentes y vistas. > Se puede hacer scroll vertical y horizontal (configurando la propiedad horizontal)
  47. > Componente reocmendado para mostrar pocos elementos. > Todos los

    componentes contenidos se renderizan, aunque no se estén mostrando en ese momento por pantalla. > Si tienes que mostrar muchos elementos utiliza ListView
  48. import React, { Component } from 'react'; import{ AppRegistry, ScrollView,

    Image, Text, View } from 'react-native' class IScrolledDownAndWhatHappenedNextShockedMe extends Component { render() { return( <ScrollView> <Text style={{fontSize:96}}>Scroll me plz</Text> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Text style={{fontSize:96}}>If you like</Text> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Text style={{fontSize:96}}>Scrolling down</Text> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Text style={{fontSize:96}}>What's the best</Text> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Text style={{fontSize:96}}>Framework around?</Text> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Image source={require('./img/favicon.png')} /> <Text style={{fontSize:80}}>React Native</Text> </ScrollView> ); } } AppRegistry.registerComponent( 'IScrolledDownAndWhatHappenedNextShockedMe', () => IScrolledDownAndWhatHappenedNextShockedMe);
  49. > Para mostrar una lista vertical de elementos, que aunque

    con contenido diferente, cuentan con una estructura similar. > Ideal para mostrar cantidades grandes de datos. > Sólo renderiza los elementos que se están mostrando en pantalla.
  50. TIENE DOS PROPS > dataSource: fuente de información para mostrar

    en la lista. > renderRow: coge un elemento de la fuente y devuelve un componente formateado listo para renderizar.
  51. import React, { Component } from 'react'; import { AppRegistry,

    ListView, Text, View } from 'react-native'; class ListViewBasics extends Component { // Initialize the hardcoded data constructor(props) { super(props); const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2}); this.state = { dataSource: ds.cloneWithRows([ 'John', 'Joel', 'James', 'Jimmy', 'Jackson', 'Jillian', 'Julie', 'Devin' ]) }; } render() { return ( <View style={{paddingTop: 22}}> <ListView dataSource={this.state.dataSource} renderRow={(rowData) => <Text>{rowData}</Text>} /> </View> ); } } // App registration and rendering AppRegistry.registerComponent('ListViewBasics', () => ListViewBasics);
  52. > Muchas veces necesitamos cargar datos desde una URL remota.

    > Unas veces necesitaremos hacer peticiones POST a una API REST. > Otras, coger una serie de datos estáticos desde un servidor externo.
  53. FETCH API > API proporcioanda por React Native. > Similar

    a XMLHttpRequest u otras APIS que hayas utilizado.
  54. HACER PETICIONES > Para poder acceder a datos desde una

    URL externa, solo hay que pasarle la URL: fetch('https://mywebsite.com/mydata.json')
  55. > Utilizamos el componente Navigator para realizar transiciones entre las

    diferentes vistas de nuestra aplicación. > Puede ser navegación lateral, tipo maestro-detalle o popups modales.
  56. NAVIGATOR COMPONENT > Proporciona una implementación en Javascript de una

    pila de navegación. > Funciona tanto para iOS como para Android. > Fácil de personalizar.
  57. EJEMPLO > Crear escena MyScene.js import React, { Component }

    from 'react'; import { View, Text, Navigator } from 'react-native'; export default class MyScene extends Component { static get defaultProps() { return { title: 'MyScene' }; } render() { return ( <View> <Text>Hi! My name is {this.props.title}.</Text> </View> ) } }
  58. export default nos permite exportar la escena como un componente

    para que después podamos importarla desde cualquier otro componente.
  59. import React, { Component } from 'react'; import { AppRegistry

    } from 'react-native'; import MyScene from './MyScene'; class YoDawgApp extends Component { render() { return ( <MyScene /> ) } } AppRegistry.registerComponent('YoDawgApp', () => YoDawgApp);
  60. > Ahora tenemos una app que renderiza nuestra escena y

    poco más. > Decimos que nuestra escena es un componente reutilizable.
  61. > Navegación render() { return ( <Navigator initialRoute={{ title: 'My

    Initial Scene', index: 0 }} renderScene={(route, navigator) => { return <MyScene title={route.title} /> }} /> ); }
  62. ROUTES > Un route es un objeto que contiene información

    sobre la escena. > Proporciona todo el contexto que funcion del Navigator renderScene necesita.
  63. > Métodos del objeto navigator que hemos pasado a la

    función renderScene > Sirven para meter o sacar routes en nuestra pila de navegación.
  64. import React, { Component } from 'react'; import { AppRegistry,

    Navigator, Text, View } from 'react-native'; import MyScene from './MyScene'; class SimpleNavigationApp extends Component { render() { return ( <Navigator initialRoute={{ title: 'My Initial Scene', index: 0 }} renderScene={(route, navigator) => <MyScene title={route.title} // Function to call when a new scene should be displayed onForward={ () => { const nextIndex = route.index + 1; navigator.push({ title: 'Scene ' + nextIndex, index: nextIndex, }); }} // Function to call to go back to the previous scene onBack={() => { if (route.index > 0) { navigator.pop(); } }} /> } /> ) } } AppRegistry.registerComponent('SimpleNavigationApp', () => SimpleNavigationApp);
  65. import React, { Component, PropTypes } from 'react'; import {

    View, Text, TouchableHighlight } from 'react-native'; export default class MyScene extends Component { static propTypes = { title: PropTypes.string.isRequired, onForward: PropTypes.func.isRequired, onBack: PropTypes.func.isRequired, } render() { return ( <View> <Text>Current Scene: { this.props.title }</Text> <TouchableHighlight onPress={this.props.onForward}> <Text>Tap me to load the next scene</Text> </TouchableHighlight> <TouchableHighlight onPress={this.props.onBack}> <Text>Tap me to go back</Text> </TouchableHighlight> </View> ) } }
  66. > Cuando desarrollamos para la web, utilizamos elementos como <div>

    <span> <img> <ol> <ul> <table>... > Al desarrollar para React Native, no usamos estos elementos, pero si otros equivalentes bastante similares
  67. TEXT > En HTML, se puede diferentes textos en una

    amplia variedad de elementos y darles estilo. <p>The quick <em>brown</em> fox jumped over the lazy <strong>dog</strong>.</p>
  68. TEXT > En React Native, no se tiene acceso a

    subtags como strong o em <Text> The quick <Text style={{fontStyle: "italic"}}>brown</Text> fox jumped over the lazy <Text style={{fontWeight: "bold"}}>dog</Text>. </Text>
  69. TEXT > Esto es poco reusable y sería similar a

    los estilos en linea de HTML, por lo que sería mejor crear shorthands que nos ayuden a replciar esos estilos.
  70. TEXT var styles = StyleSheet.create({ bold: { fontWeight: "bold" },

    italic: { fontStyle: "italic" } }); var Strong = React.createClass({ render: function() { return ( <Text style={styles.bold}> {this.props.children} </Text>); } }); var Em = React.createClass({ render: function() { return ( <Text style={styles.italic}> {this.props.children} </Text>); } });
  71. TEXT > Una vez creados estos componentes, podemos crear estilos

    anidados, de forma similar a HTML <Text> The quick <Em>brown</Em> fox jumped over the lazy <Strong>dog</Strong>. </Text>
  72. IMAGE > Otro de los elementos más comunes en web

    y en apps junto con el texto. > En web, las introducimos mediante HTML con <img> o CSS con propiedades como background-image > En React Native utilizamos el componente <Image>
  73. IMAGE <Image source={require('image!puppies')} />` > Esta llamada a la imagen

    funciona de forma diferente dependiendo de la plataforma en la que estemos trabajando.
  74. IMAGE > En iOS, hay que importar las imágenes en

    la la carpeta assets del proyecto en Xcode. > Hay que pasar las imágenes en todas las resoluciones necesarias (@1x, @2x, @3x) y Xcode sirve el asset apropiado dependiendo de la resolución de la pantalla.
  75. IMAGE > Esto es una gran ventaja, debido a lo

    limitado del número de dispositivos en iOS. > En Android, apunta a la carpeta de res/drawable
  76. IMAGE > También se puede uilizar una aproximación similar a

    la de HTML, Facebook lo hace en alguna app de ejemplo. <Image source={{uri: 'https:// facebook.github.io/react/img/logo_og.png'}} style={{width: 400, height: 400}} />
  77. IMAGE > También podemos cargar las imágenes desde la web.

    > En fase de prototipado, no tenemos que preocuparnos por preparar todos los assets. > Tamaño del paquete de la app más pequeño.
  78. IMAGE > Lo peor es que el usuario va a

    tener que descargarse todo el contenido cada vez. > Dependes demasiado de su plan de datos. > En la mayoría de los casos, habrá que evitar este enfoque.
  79. IMAGE > React Native hace hincapié en el uso de

    componentes, por lo que mejor olvidarnos del modelo HTML-CSS. > Si queremos poner una imagen de fondo: <Image source={require('image!puppies')}> {/* Your content here... */} </Image>
  80. IMAGE > El componente Image tiene la prop resizeMode, que

    acepta los valores: resize | cover | contain > Es un componente muy fácil de utilizar, y muy flexible.
  81. > Entorno Javascript del lado del servidor, basado en eventos.

    > Utiliza motor V8 de Google. > Compila y ejecuta Javascript a velocidades increíbles. > Código abierto: ejecuta en Windows, macOS y Linux. > Proporciona una manera fácil para construir programas de red escalables.
  82. > Desarrollo más rápido. > Ejecución de tests de unidad

    se puede hacer más rápido. > Las aplicaciones son más rápidas. > Mejor experiencia de usuario. > Menor coste de infraestructura. > Tiene una gran comunidad.
  83. > Dificultad de implementar en alojamientos existentes. > API inestable.

    > Falta de una librería estándar. > Muchas formas diferentes de programar. > Le falta "rodaje".
  84. INSTALAR WATCHMAN > "Observador" de Facebook. React Native lo utiliza

    para detectar cambios en el código, y así poder recompilar cuando ocurran. brew install watchman
  85. INSTALAR HERRAMIENTA REACT NATIVE CLI npm install -g react-native-cli **npm

    es el gestor de paquetes de Node. Nos permite descargar y gestionar cualquier dependencia que necesite nuestro proyecto**
  86. EN LA TERMINAL, IR A LA CARPERTA DONDE QUEREMOS GUARDAR

    NUESTRO PROYECTO react-native init nombreProyecto
  87. INSTALAR HERRAMIENTA REACT NATIVE CLI npm install -g react-native-cli **npm

    es el gestor de paquetes de Node. Nos permite descargar y gestionar cualquier dependencia que necesite nuestro proyecto**
  88. > Abrimos proyecto generado. > Se abrirá una ventana de

    terminal para gestionar el React Packager > Cuando se ejecuta una app React Native, carga la aplicación Javascript desde la siguiente URL. http://localhost:8081/index.ios.bundle
  89. > Vista principal nos da instrucciones a tener en cuenta.

    > Para editar UI, debemos editar el fichero index.ios.js > Recargamos la vista con CMD+R > CMD+D para ver opciones de desarrollador
  90. > Si hay errores, veremos una vista roja en pantalla.

    > Error puede ser de nuestra app o del servidor. > Mirar tipo de error, si persiste, cerrar terminal, proyecto y reiniciar.
  91. > Importamos los componentes que vamos a utilizar import {

    AppRegistry, StyleSheet, Text, View } from 'react-native';
  92. > Aquí está la app. > Invocamos a render, el

    motor que creará la interfaz. class EnpresaDigitala extends Component { render() { return ( <View style={styles.container}> <Text style={styles.welcome}> Welcome to React Native! </Text> <Text style={styles.instructions}> To get started, edit index.ios.js </Text> <Text style={styles.instructions}> Press Cmd+R to reload,{'\n'} Cmd+D or shake for dev menu </Text> </View> ); } }
  93. > Aquí están los estilos, los cuales creamos para después

    utilizar en el cuerpo del código. const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: '#F5FCFF', }, welcome: { fontSize: 20, textAlign: 'center', margin: 10, }, instructions: { textAlign: 'center', color: '#333333', marginBottom: 5, }, });
  94. > Y, por último, la línea que asigna nuestra variable

    EnpresaDigitala que contiene la clase que hemos creado a la ejecución: > De esta forma se crea el punto de entrada y el contenido de la raíz del programa. AppRegistry.registerComponent('EnpresaDigitala', () => EnpresaDigitala);
  95. import React, { Component } from 'react'; import { AppRegistry,

    Text } from 'react-native'; class EnpresaDigitala extends Component { render() { return ( <Text>Hello world!</Text> ); } } AppRegistry.registerComponent('EnpresaDigitala', () => EnpresaDigitala);
  96. <View style={styles.container}> <View> <Text> Campo 1 </Text> <TextInput style={styles.input}/> </View>

    <View> <Text> Campo 2 </Text> <TextInput style={styles.input}/> </View> <View> <Text> Campo 3 </Text> <TextInput style={styles.input}/> </View> <View> <Text> Campo 4 </Text> <TextInput style={styles.input}/> </View> </View>
  97. formulario: function(){ return ( <View> <Text> Campo 1 </Text> <TextInput

    style={styles.input}/> </View> ) } {this.formulario()}
  98. MODIFICAR STATE DE NUESTRA APP > En RN tenemos lo

    que se denomina state > Son valores de nuestros componentes > Al modificarlos, hacen que los componentes se vuelvan a renderizar > Siempre utilizar setState para asegurarnos que se renderizan los cambios
  99. MAQUETAR VISTAS CON FLEXBOX FÁCILMENTE > Si no tenemos claro

    como maquetar app, Flexbox puede resultar confuso > Podemos crear función helper, para asignar borde de color a los contenedores y trabajar más fácilmente con ellos.
  100. CROSS-PLATFORM > Puede convivir con código Java, Swift, Objective-C...y unirse

    mediante JavaScriptCore de forma que puedas usarlo en tu app > Ahora Apple deja actualizar apps mediante JavaScriptCore sin pasar por validación App Store
  101. CICLO DE DESARROLLO RAPIDÍSIMO ! > Cambias una linea de

    texto y actualizas la app a la vez en iOS y Android, sin compilar.
  102. CURVA DE APRENZIDAJE POCO PRONUNCIADA > Muy fácil adentrarse en

    el desarrollo de apps nativas. > No nos abruma tanto como el uso de las plataformas nativas de Apple y Google.
  103. A VECES, AL COMPILAR, DEJA DE FUNCIONAR, HAY COMPORTAMIENTOS EXTRAÑOS

    > Cerrar y reiniciar desde terminal > Limpiar proyecto y caché > npm install
  104. NUEVAS VERSIONES DE RN > Proyecto no se ejecuta >

    Actualizar RN npm upgrade react-native
  105. > React Native App Intro > React Native Vector Icons

    > React Native Gifted Form > React Native Push Notifications > React Native Share
  106. > React Native Image progress > React Native Google Analytics

    Bridge > React Native Fabric > React Native Code Push > React Native Sleek Loading Indicator