Exploración de Expo Snack
Volver a clases
Desarrollo Móvil●Principiante

Exploración de Expo Snack

90 min

Escribe React Native en el navegador y corre tu primera pantalla en tu propio teléfono, sin instalar nada.

Etiquetas

#expo#snack#primeros-pasos

Por qué empezamos sin instalar nada

Instalar el entorno de React Native es la parte más frustrante del curso y la que menos enseña: Node, el CLI de Expo, el SDK de Android, un emulador que pesa varios gigas. Eso viene la semana que entra.

Hoy la meta es otra y es más importante: que veas tu código corriendo en tu propio teléfono el primer día. Expo Snack lo hace posible — es un editor de React Native que vive en el navegador, con un simulador al lado y un código QR para tu dispositivo real.

Snack tiene límites reales: no sirve para librerías nativas, ni para builds de producción, ni para nada que toque el sistema de archivos. Es un patio de juegos. Para lo de hoy, sobra.

Los tres bloques de un componente

Antes de escribir una línea, aprende a leer el archivo que ya está ahí. Todo componente de React Native tiene la misma anatomía:

javascript
1import { StyleSheet, Text, View } from "react-native";   // 1. de dónde vienen las piezas
2
3export default function App() {                          // 2. el componente
4  return (
5    <View style={styles.container}>
6      <Text>Open up App.js to start working on your app!</Text>
7    </View>
8  );
9}
10
11const styles = StyleSheet.create({                       // 3. los estilos, como objeto JS
12  container: { flex: 1, alignItems: "center", justifyContent: "center" },
13});
  • Los imports vienen de react-native, no del DOM. Esa línea es la frontera entre los dos mundos. No existe un <View> global como existe un <div> en HTML: cada componente se trae explícitamente.
  • El componente es React del que ya conoces. Misma función, mismo return, mismo JSX.
  • Los estilos son un objeto de JavaScript. No hay archivo .css, no hay clases, no hay cascada. StyleSheet.create recibe un objeto y devuelve estilos que se pasan por la prop style.

Texto y estilos

En React Native todo texto vive dentro de un <Text>. No es una recomendación: texto suelto dentro de un <View> hace que la app truene.

javascript
1<View style={styles.container}>
2  <Text style={styles.titulo}>Hola, soy Nombre</Text>
3  <Text style={styles.sub}>Mi primera app móvil</Text>
4</View>
javascript
1titulo: { fontSize: 28, fontWeight: "bold", marginBottom: 8 },
2sub: { fontSize: 16, color: "#666" },

Fíjate en fontSize: 28. No es "28px". Las unidades con sufijo no existen en React Native: los tamaños son números sin unidad, y equivalen a puntos independientes de densidad (el sistema los escala según la pantalla). Los porcentajes sí van como string (width: "80%"), y esa inconsistencia es una fuente clásica de confusión.

No hay jerarquía tipográfica heredada: no existe un <h1> que ya venga grande. Si quieres que algo parezca un título, lo dices con estilos.

Interacción: onPress, no onClick

javascript
1const [conteo, setConteo] = useState(0);
2
3<Pressable style={styles.boton} onPress={() => setConteo(conteo + 1)}>
4  <Text style={styles.textoBoton}>Presióname ({conteo})</Text>
5</Pressable>

Tres cosas que cambian respecto a la web:

  • onPress, no onClick. No hay mouse. Los eventos son táctiles.
  • El texto del botón va dentro de un <Text>. <Pressable> es un contenedor que responde al tacto, no un botón con etiqueta.
  • useState es exactamente el mismo hook que ya conoces. Lo que cambia es el componente que lo rodea, nunca la lógica ni el estado.

Existe también <Button>, más simple pero casi imposible de estilar y con apariencia distinta en iOS y Android. En cuanto quieras control visual vas a usar Pressable.

Verlo en tu teléfono

  1. Instala Expo Go desde la App Store o Google Play.
  2. En Snack, abre la pestaña My Device: aparece un código QR.
  3. Escanéalo — con la cámara en iOS, con la propia app de Expo Go en Android.
  4. Tu teléfono y tu computadora deben estar en la misma red.

A partir de ahí, cada cambio que guardes en Snack se refleja solo en el teléfono. Si el QR no conecta, casi siempre es que el teléfono está en datos móviles y no en el WiFi.

Errores típicos del primer día

Qué hacesQué pasa
Texto suelto fuera de un <Text>La app truena con un error explícito
fontSize: "20px"Falla o se ignora: los números van sin unidad
Olvidar el import de un componenteError en tiempo de ejecución, no al escribir
<Image> sin width ni heightFalla en silencio: mide 0×0 y simplemente no se ve

El último es el importante. Los tres primeros gritan; el cuarto no dice nada y te deja mirando una pantalla en la que "no pasó nada". Ese contraste entre fallar ruidosamente y fallar en silencio es algo a lo que vas a volver todo el semestre.

Ejemplos de Código

3 ejemplos

El App.js que trae Snack

javascript
1import { StyleSheet, Text, View } from "react-native";
2
3export default function App() {
4  return (
5    <View style={styles.container}>
6      <Text>Open up App.js to start working on your app!</Text>
7    </View>
8  );
9}
10
11const styles = StyleSheet.create({
12  container: {
13    flex: 1,
14    alignItems: "center",
15    justifyContent: "center",
16  },
17});

Texto con estilos propios

javascript
1<View style={styles.container}>
2  <Text style={styles.titulo}>Hola, soy Nombre</Text>
3  <Text style={styles.sub}>Mi primera app móvil</Text>
4</View>
5
6const styles = StyleSheet.create({
7  container: {
8    flex: 1,
9    alignItems: "center",
10    justifyContent: "center",
11  },
12  titulo: { fontSize: 28, fontWeight: "bold", marginBottom: 8 },
13  sub: { fontSize: 16, color: "#666" },
14});

Un botón con estado

javascript
1import { useState } from "react";
2import { Pressable, Text, View, StyleSheet } from "react-native";
3
4export default function App() {
5  const [conteo, setConteo] = useState(0);
6
7  return (
8    <View style={styles.container}>
9      <Pressable
10        style={styles.boton}
11        onPress={() => setConteo(conteo + 1)}
12      >
13        <Text style={styles.textoBoton}>Presióname ({conteo})</Text>
14      </Pressable>
15    </View>
16  );
17}
18
19const styles = StyleSheet.create({
20  container: { flex: 1, alignItems: "center", justifyContent: "center" },
21  boton: { backgroundColor: "#007AFF", padding: 15, borderRadius: 8 },
22  textoBoton: { color: "#fff", fontSize: 16, fontWeight: "bold" },
23});

Recursos

4 recursos disponibles

Documentación Oficial

DocumentaciónPrincipiante

Expo Snack

El editor de React Native que corre en el navegador. No necesitas cuenta para trabajar.

Documentación Oficial

DocumentaciónPrincipiante10 min

Expo Go

La app que ejecuta tu Snack en tu teléfono. Instálala antes de la sesión.

¡Hora de Practicar!

PrácticaPrincipiante45 min🟡 IA con bitácora

Práctica Guiada — Tu primera pantalla

Cinco pasos para pasar del Snack vacío a una pantalla con estilos y un botón que responde, corriendo en tu teléfono.

Trabaja directo en snack.expo.dev. No instales nada todavía.

  1. Lee antes de tocar. Abre App.js e identifica tres cosas: de dónde vienen los imports, cuál es el componente y dónde está el objeto de estilos. Si no puedes señalarlas, no sigas.
  2. Cambia el texto. Sustituye el <Text> por tu nombre y agrega un segundo <Text> como subtítulo, cada uno con su estilo.
  3. Agrega un botón de verdad. Un <Pressable> con onPress que incremente un contador con useState.
  4. Córrelo en tu teléfono. Pestaña My Device, escanea el QR con Expo Go. Tu teléfono y tu computadora deben estar en la misma red.
  5. Comparte. Botón Share > Copy link. Verifica que el link abra sin iniciar sesión.

Entrega: el link de tu Snack + tu bitácora de IA si la usaste. Opcional pero recomendado: una captura de tu teléfono con la app corriendo.

Desafío de Código

EjercicioPrincipiante25 min🔴 Sin IA

Ejercicios — Rómpelo a propósito

Cuatro errores que vas a cometer sin querer durante el semestre. Provócalos hoy, con red de seguridad.

Haz cada cambio, observa qué pasa exactamente y escribe el mensaje de error o el comportamiento que viste. Después deshazlo.

  1. Escribe texto suelto dentro del <View>, fuera de cualquier <Text>. ¿Qué dice el error?
  2. Cambia fontSize: 28 por fontSize: "28px". ¿Truena, se ignora o se ve raro?
  3. Borra el import de Pressable y deja el componente usándolo. ¿En qué momento te enteras del problema?
  4. Agrega <Image source={{ uri: "https://picsum.photos/400" }} /> sin width ni height. ¿Dónde quedó la imagen?

La pregunta que amarra las cuatro: ¿cuáles fallan con un error ruidoso y cuáles fallan en silencio? Las silenciosas son las que te van a costar horas más adelante.