Taller 1 React Native
Taller 1 React Native
SOLUCION:
cd nombreApp
Una vez dentro ya arrancamos Expo:
expo start
Expo utiliza Expo SDK, el cual es una librería nativa y de JavaScript que provee acceso a la
funcionalidad del dispositivo como a la cámara, contactos, almacenamiento local, entre
otros.
Expo proporciona componentes de UI que las apps mantienen pero que en React Native
puro no, como, por ejemplo: íconos, imágenes con blur, etc.
3. Listo
4. Los componentes permiten separar la interfaz de usuario en piezas independientes,
reutilizables y pensar en cada pieza de forma aislada.
los componentes son como las funciones de JavaScript. Aceptan entradas arbitrarias
(llamadas “props”) y devuelven a React elementos que describen lo que debe aparecer
en la pantalla.
Para enviar accesorios a un componente, use la misma sintaxis que los atributos
HTML:
Ej:
Ej:
6. La mayoría de los estilos nativos de React son sus formularios CSS, pero en camel case.
Así, el text-decoration convierte en textDecoration .
A diferencia de CSS, los estilos no se heredan. Si desea que los componentes
secundarios hereden un cierto estilo, debe proporcionárselos explícitamente al niño.
Esto significa que no puede establecer una familia de fuentes para
una View completa.
Estilo condicional
7. Los props se envían a los componentes al momento de crearlos, y es tan fácil como
mandar las propiedades como un atributo del <tag> del componente, por ejemplo,
supongamos que tenemos un componente <ItemList> , el cual necesita recibir los
datos de un producto, dicho producto debe contener el nombre y un precio:
<ItemList product={item}/>
Mandar objetos es una forma simple y limpia de mandar propiedades, pero también lo
podríamos hacer en varias propiedades, por ejemplo:
console.log(Object.values(object1));
// expected output: Array ["somestring", 42, false]
render() {
return (
<div>Cuenta actual: {this.state.contador}</div>
)
}
}
11. Este es el link de la documentación oficial de react navigation:
https://reactnavigation.org/docs/getting-started/
12.
Para instalar se requiere el siguiente código en la terminal:
npm install @react-navigation/native
Para usar el navegador de pila, necesitamos instalar @react-navigation/stack:
npm install @react-navigation/stack
Toda la configuración de la ruta se especifica como accesorios para nuestro
navegador. No hemos pasado ningún accesorio a nuestro navegador, por lo que solo
usa la configuración predeterminada.
Agreguemos una segunda pantalla a nuestro navegador de pila y configuremos
la Homepantalla para renderizar primero:
function DetailsScreen() {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent:
'center' }}>
<Text>Details Screen</Text>
</View>
);
}
function App() {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
Ahora nuestra pila tiene dos rutas , una Homeruta y una Detailsruta. Se puede
especificar una ruta utilizando el Screencomponente. El Screencomponente acepta
un nameaccesorio que corresponde al nombre de la ruta que usaremos para navegar, y
un componentaccesorio que corresponde al componente que renderizará.
Luego, en SomeTaskName.js:
module.exports = async (taskData) => {
// do stuff
};
Sí, esto todavía requiere algo de código nativo, pero es bastante delgado. Necesita
extender HeadlessJsTaskServicey anular getTaskConfig, por ejemplo:
package com.your_application_name;
import android.content.Intent;
import android.os.Bundle;
import com.facebook.react.HeadlessJsTaskService;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.jstasks.HeadlessJsTaskConfig;
import javax.annotation.Nullable;
@Override
protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null) {
return new HeadlessJsTaskConfig(
"SomeTaskName",
Arguments.fromBundle(extras),
5000, // timeout for the task
false // optional: defines whether or not the task is allowed in foreground. Default is false
);
}
return null;
}
}
Luego agregue el servicio a su AndroidManifest.xmlarchivo:
<service android:name="com.example.MyTaskService" />
Ahora, siempre que inicie su servicio , por ejemplo, como una tarea periódica o en
respuesta a algún evento / transmisión del sistema, JS girará, ejecutará su tarea y luego se
detendrá.
Ejemplo:
Intent service = new Intent(getApplicationContext(), MyTaskService.class);
Bundle bundle = new Bundle();
bundle.putString("foo", "bar");
service.putExtras(bundle);
getApplicationContext().startService(service);
15. Antes de nada lo que vamos a hacer va a ser renombrar de content a body allí dónde se
haga referencia, porque en la API que vamos a utilizar, la variable que tiene el
contenido del post se llama body en vez de content.
1 // src/components/PostItem.js
2 ...
3 <p>{this.props.post.body}</p>
4 ...
5
6 body: PropTypes.string.isRequired
7 ...
8
9
10 // src/components/PostForm.js
11 ...
12 <label htmlFor="body">Content</label>
13 <textarea id="body" />
14 ...
Ahora, vamos hacer el listado. Para ello, debemos tener un estado ( state) para guardar los
posts (ya lo tenemos de las entradas anteriores) y vamos a utilizar un método del ciclo de vida
de un componente para que cuando cargue el componente nos haga una llamada a la API y
nos rellene el estado con los posts.
Con esto, si arrancas el servidor ( npm run start ) ya deberías ver los posts que nos devuelve
la API.
1 ...
2 handleSubmit = event => {
3 event.preventDefault();
4 const lastPost = this.state.posts.slice(-1).pop();
5 let newPostObj = {
6 id: lastPost ? lastPost.id + 1 : 0,
7 title: event.target.title.value,
8 body: event.target.body.value
9 };
10
11 fetch("https://jsonplaceholder.typicode.com/posts", {
12 method: "POST",
13 body: JSON.stringify(newPostObj),
14 headers: {
15 "Content-type": "application/json; charset=UTF-8"
16 }
17 })
18 .then(response => response.json())
19 .then(newPost => {
20 const posts = [...this.state.posts, newPost];
21 this.setState({ posts: posts });
22 });
23 };
24 ...
Básicamente, lo que se hace es crear el objeto del nuevo posts, se envía a la API mediante
POST y si la respuesta es correcta se añade al listado de posts.
1 ...
2 handleDelete = postToDelete => {
3 fetch(`https://jsonplaceholder.typicode.com/posts/${postToDelete.id}`, {
4 method: "DELETE"
5 }).then(response => {
6 let posts = this.state.posts.filter(post => post.id !== postToDelete.id);
7 this.setState({ posts: posts });
8 });
9 };
10 ...
Se pasa por parámetro en la URL el id del post que queremos eliminar y si la respuesta
es correcta, se elimina del array de posts.
17. Para definir las diferentes rutas de nuestra aplicación, podemos usar el