Quiz: Fundamentos de React Native y Expo

Quiz
10 min~9 min lectura
Objetivo de la lección

Introducción al Quiz de Fundamentos Este quiz no es una simple evaluación, sino una herramienta de consolidación activa del conocimiento.

Puntos de control
  • Introducción al Quiz de Fundamentos
  • Concepto Clave: El Puente de React Native
  • Cómo Funciona en la Práctica: El Ciclo de un Componente
  • Ejemplo Paso a Paso de una Actualización de Estado

Quiz Interactivo

Pon a prueba tus conocimientos

Introducción al Quiz de Fundamentos

Este quiz no es una simple evaluación, sino una herramienta de consolidación activa del conocimiento. En el desarrollo con React Native y Expo, la teoría se vuelve tangible solo cuando se aplica para resolver problemas. Este cuestionario está diseñado para que reflexiones sobre los conceptos centrales del módulo, identifiques áreas de confusión y fortalezcas tu comprensión antes de avanzar a temas más complejos como la navegación o el estado global.

Las preguntas abarcan desde la filosofía detrás de React Native hasta los detalles prácticos de la configuración con Expo. No se trata de memorizar comandos, sino de entender el porqué y el cómo de cada decisión arquitectónica. Al finalizar, tendrás una visión mucho más clara de los cimientos sobre los que construirás tus aplicaciones, y un checklist para verificar tu propio dominio.

Concepto Clave: El Puente de React Native

Imagina que estás construyendo una casa con dos equipos: uno que solo habla español y trabaja con ladrillos (JavaScript) y otro que solo habla inglés y trabaja con acero (plataformas nativas: iOS y Android). Para coordinar la construcción, necesitas un intérprete excepcional que traduzca las instrucciones en tiempo real. Ese es el puente (Bridge) de React Native. No es una metáfora vaga; es un componente de software real que serializa mensajes entre el hilo de JavaScript y los hilos nativos de la UI.

Este diseño es lo que permite escribir lógica en JavaScript y obtener interfaces de usuario nativas de alto rendimiento. Cuando tu componente JSX devuelve una <View>, no se está dibujando un div de web. En su lugar, el puente comunica a los módulos nativos de UIKit (iOS) o View (Android) que deben instanciar y colocar un objeto UIView o android.view correspondiente. Esta separación es la razón por la que React Native puede acceder a todas las capacidades del dispositivo, como la cámara o el GPS, a través de módulos que también se comunican a través de este puente.

Tip: El rendimiento de una app React Native depende en gran medida de la eficiencia de la comunicación a través de este puente. Operaciones excesivas o mal estructuradas pueden causar cuellos de botella. Herramientas como el Hermes Engine, que ahora es el motor por defecto, optimizan esta comunicación y el parsing de JavaScript.

Cómo Funciona en la Práctica: El Ciclo de un Componente

Vamos a seguir el viaje de un simple componente, desde tu editor de código hasta la pantalla del dispositivo. Supongamos que creas un componente Saludo. Primero, lo defines en JavaScript usando JSX. Este código se empaqueta por el servidor de desarrollo de Metro (el bundler de React Native) y se envía al dispositivo. En el dispositivo, el runtime de JavaScript (Hermes) ejecuta tu lógica y genera una descripción serializada de la interfaz de usuario, una especie de "árbol de elementos".

Esta descripción se envía a través del puente al lado nativo. Allí, el "Shadow Tree" de React Native (un hilo de fondo) calcula el diseño exacto (layout) usando el motor de Yoga, que es una implementación de Flexbox. Una vez calculadas las posiciones y dimensiones, se envían las instrucciones finales al hilo principal de la UI (Main Thread/UI Thread), que es el único autorizado para manipular los elementos visuales. Finalmente, las vistas nativas se crean o actualizan en pantalla. Todo este proceso es increíblemente rápido y permite la interactividad fluida que esperan los usuarios.

Ejemplo Paso a Paso de una Actualización de Estado

1. El usuario toca un TouchableOpacity, un evento que se captura en el hilo nativo.
2. El evento viaja a través del puente al hilo de JavaScript.
3. Tu manejador de eventos onPress se ejecuta, llamando a un setEstado.
4. React reconcilia el cambio y genera un nuevo árbol de elementos (la nueva descripción de la UI).
5. Las diferencias entre el árbol viejo y el nuevo se calculan (diffing).
6. Solo los cambios mínimos necesarios se serializan y envían de vuelta a través del puente.
7. El lado nativo aplica esos cambios a las vistas específicas, resultando en una actualización visual.

Código en Acción: De JSX a Vista Nativa

El siguiente código parece HTML, pero cada etiqueta es un componente de React Native que se traduce a un elemento nativo. Observa cómo se utilizan StyleSheet para crear estilos optimizados y el componente Pressable para manejar interacciones táctiles de manera eficiente.

// App.js
import React, { useState } from 'react';
import { StyleSheet, View, Text, Pressable, SafeAreaView } from 'react-native';

export default function App() {
  const [contador, setContador] = useState(0);
  const [colorFondo, setColorFondo] = useState('#f5f5f5');

  const incrementar = () => {
    const nuevoValor = contador + 1;
    setContador(nuevoValor);
    // Cambia el color de fondo basado en el valor
    if (nuevoValor % 5 === 0) {
      setColorFondo('#e3f2fd'); // Azul claro cada 5 toques
    } else {
      setColorFondo('#f5f5f5');
    }
  };

  const reiniciar = () => {
    setContador(0);
    setColorFondo('#f5f5f5');
  };

  return (
    <SafeAreaView style={[styles.contenedor, { backgroundColor: colorFondo }]}>
      <View style={styles.contenido}>
        <Text style={styles.titulo}>Contador Interactivo</Text>
        <Text style={styles.contadorTexto}>{contador}</Text>
        <Text style={styles.subtitulo}>
          Toca el botón para incrementar. Cada 5 toques, el fondo cambiará.
        </Text>

        <Pressable
          style={({ pressed }) => [
            styles.boton,
            pressed && styles.botonPresionado,
          ]}
         
          accessibilityLabel="Incrementar contador"
        >
          <Text style={styles.textoBoton}>Presióname</Text>
        </Pressable>

        <Pressable
          style={[styles.boton, styles.botonSecundario]}
         
        >
          <Text style={styles.textoBotonSecundario}>Reiniciar</Text>
        </Pressable>

        <Text style={styles.explicacion}>
          Este componente usa: useState (Estado), Pressable (Interacción),
          StyleSheet (Estilos), y actualizaciones condicionales. Cada vez que
          presionas, el puente de React Native comunica el cambio de estado y
          actualiza la vista nativa.
        </Text>
      </View>
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  contenedor: {
    flex: 1,
  },
  contenido: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    padding: 20,
  },
  titulo: {
    fontSize: 28,
    fontWeight: '700',
    marginBottom: 20,
    color: '#333',
  },
  contadorTexto: {
    fontSize: 72,
    fontWeight: '300',
    color: '#007AFF',
    marginVertical: 20,
  },
  subtitulo: {
    fontSize: 16,
    color: '#666',
    textAlign: 'center',
    marginBottom: 40,
    paddingHorizontal: 10,
  },
  boton: {
    backgroundColor: '#007AFF',
    paddingHorizontal: 40,
    paddingVertical: 16,
    borderRadius: 14,
    marginBottom: 15,
    minWidth: 200,
    alignItems: 'center',
  },
  botonPresionado: {
    opacity: 0.8,
    transform: [{ scale: 0.98 }],
  },
  botonSecundario: {
    backgroundColor: 'transparent',
    borderWidth: 2,
    borderColor: '#007AFF',
  },
  textoBoton: {
    color: 'white',
    fontSize: 18,
    fontWeight: '600',
  },
  textoBotonSecundario: {
    color: '#007AFF',
    fontSize: 18,
    fontWeight: '600',
  },
  explicacion: {
    marginTop: 40,
    fontSize: 14,
    color: '#888',
    textAlign: 'center',
    fontStyle: 'italic',
    lineHeight: 20,
  },
});

Este ejemplo integra múltiples conceptos fundamentales: Estado con useState, Componentes Core (View, Text, Pressable), Estilos con StyleSheet y estilos en línea, y Feedback visual mediante el cambio dinámico de estilos. Ejecútalo en un dispositivo o emulador a través de Expo Go para ver la traducción perfecta a controles nativos.

Errores Comunes y Cómo Evitarlos

Al comenzar con React Native y Expo, es fácil caer en ciertos patrones problemáticos. Identificarlos a tiempo ahorra horas de depuración.

1. Confundir estilos web con estilos de React Native: Intentar usar display: block, unidades como em, o propiedades abreviadas como background. React Native usa un subconjunto de Flexbox y propiedades específicas. Solución: Consulta siempre la documentación oficial de StyleSheet y recuerda que los estilos se escriben en camelCase (ej. backgroundColor, fontSize).

2. Bloquear el hilo de JavaScript con operaciones pesadas: Realizar cálculos complejos o bucles infinitos en el hilo principal de JS bloqueará el puente, congelando la UI. Solución: Para tareas pesadas, utiliza APIs como InteractionManager para posponerlas, o considera Web Workers (aunque con soporte experimental) o despliega la lógica a un servidor backend.

3. No probar en ambos sistemas (iOS y Android) desde el inicio: Asumir que un componente o estilo se verá y comportará igual en ambas plataformas es un error clásico. Los componentes se mapean a controles nativos diferentes. Solución: Configura tu entorno para poder ejecutar en un emulador/simulador de iOS y otro de Android en paralelo. Usa Platform.OS para aplicar estilos o lógica condicional cuando sea necesario.

// Ejemplo de uso de Platform
import { Platform, StyleSheet } from 'react-native';

const styles = StyleSheet.create({
  texto: {
    fontSize: 16,
    fontFamily: Platform.OS === 'ios' ? 'Helvetica Neue' : 'Roboto',
    marginTop: Platform.OS === 'ios' ? 8 : 4, // Ajustes de espaciado específicos
  },
});

4. Mal manejo del ciclo de vida y memoria en Expo: No suscribirse y desuscribirse correctamente de listeners (como EventListener de React Navigation o suscripciones a eventos del dispositivo) puede causar fugas de memoria y comportamientos erráticos al navegar entre pantallas. Solución: Usa efectos de limpieza en useEffect de manera rigurosa.

// Ejemplo de limpieza en useEffect
import { useEffect } from 'react';
import { AppState } from 'react-native';

function MiComponente() {
  useEffect(() => {
    const subscription = AppState.addEventListener('change', (nextAppState) => {
      console.log('El estado de la app cambió a:', nextAppState);
    });

    // Función de limpieza: Se ejecuta al desmontar el componente
    return () => {
      subscription.remove();
    };
  }, []); // Array de dependencias vacío = se ejecuta solo al montar
}

5. Ignorar los logs de Metro y las advertencias de React: Las advertencias amarillas y rojas en la terminal o en el dispositivo son cruciales. Indican problemas de rendimiento, depreciaciones o errores potenciales. Solución: No las ignores. Léelas, búscalas si no las entiendes y corrígelas. Configura tu entorno para pausar en errores de JavaScript durante el desarrollo.

Checklist de Dominio

Antes de considerar que has dominado los fundamentos de este módulo, deberías poder verificar positivamente los siguientes puntos. Si hay alguno que no comprendes por completo, es el momento ideal para repasar.

  • Puedo explicar la diferencia entre React Native y un WebView, y por qué la primera ofrece una experiencia nativa.
  • Comprendo el rol del puente (Bridge) y por qué una comunicación excesiva a través de él puede degradar el rendimiento.
  • Sé cómo iniciar un nuevo proyecto con Expo (usando npx create-expo-app) y las diferencias clave entre el flujo de trabajo "managed" y "bare".
  • Puedo nombrar al menos 10 componentes core de React Native (View, Text, Image, ScrollView, etc.) y describir su propósito principal.
  • Sé crear y aplicar estilos usando StyleSheet.create(), comprendo el modelo de layout basado en Flexbox, y sé cómo depurar diseños.
  • Puedo gestionar el estado dinámico de un componente utilizando el Hook useState y hacer que la UI reaccione a sus cambios.
  • He probado mi aplicación en al menos dos entornos diferentes: un dispositivo físico con Expo Go y un emulador/simulador.
  • Entiendo el propósito básico de los archivos de configuración clave: app.json/app.config.js de Expo y el package.json.

Consejo Final del Quiz: El verdadero dominio no se mide por acertar todas las preguntas teóricas, sino por la capacidad de aplicar estos conceptos para construir, depurar y optimizar una aplicación real. Usa este checklist como tu guía de autoevaluación continua.

Falar no WhatsApp
De lección a portfolio

Convertí esta lección en una prueba técnica visible.

Una app pequeña publicada, con README y decisiones explicadas, funciona mejor que una lista de tecnologías sueltas.

Paso 1

Creá una demo mínima que use el concepto de la lección.

Paso 2

Escribí un README corto con objetivo, stack, decisión técnica y mejora futura.

Paso 3

Publicá la demo y enlazala desde tu perfil profesional.

Newsletter Cursalo

Recibí rutas y cursos nuevos

Sumate para recibir recursos orientados a empleo y portfolio.

  • Rutas de empleo
  • Cursos prácticos
  • Portfolio y entrevistas

Sin spam. También podés entrar con tu cuenta para guardar progreso. Iniciá sesión

Quiz: Fundamentos de React Native y Expo | Cursalo