Pasar funciones del padre al hijo en React Native


馃幆 Objetivo

Aprender a:

  1. Pasar funciones del padre al hijo mediante props.

  2. Que el hijo ejecute esa funci贸n.

  3. Que el hijo devuelva informaci贸n al padre.


馃З Punto de partida

Tenemos un componente que renderiza un bot贸n "Saludar". Al presionarlo, queremos que aparezca un mensaje de saludo con el nombre de un usuario.

La clave: la l贸gica del saludo debe vivir en el padre, no en el hijo.


⚠️ Antes de empezar: el error que hay que evitar

Muchos tutoriales arrancan mostrando el "problema" as铆:

jsx
// ❌ VERSI脫N INCORRECTA (solo para entender qu茅 NO hacer)
export default function Saludar(props) {
    const saludar = () => {
        Alert.alert('Saludo', 'Hola Agust铆n');
    };
    return <Button title="Saludar" onPress={saludar} />;
}

¿Por qu茅 est谩 mal?

  • La funci贸n saludar est谩 dentro del hijo.

  • El hijo sabe demasiado: sabe el nombre, sabe qu茅 mostrar, sabe c贸mo mostrarlo.

  • El padre no tiene ning煤n control.

  • Si ma帽ana quieres saludar a otra persona, tienes que tocar el hijo.

馃憠 Regla: la l贸gica vive en el padre. El hijo solo dispara la acci贸n.


馃敡 Paso 1: Definir la funci贸n y los datos en el PADRE

jsx
// App.js
import React from 'react';
import { View } from 'react-native';
import Saludar from './components/Saludar';

function App() {
    // Datos del usuario (los maneja el padre)
    const user = {
        nombre: 'Agust铆n Navarro Gald贸n',
        edad: 26,
        color: 'Azul',
    };

    // L贸gica del saludo (vive en el padre)
    const saludarFn = () => {
        console.log('Hola Agust铆n');
    };

    return (
        <View>
            <Saludar userInfo={user} saludarFn={saludarFn} />
        </View>
    );
}

export default App;

馃攽 Puntos clave

  • user → datos que el padre posee.

  • saludarFn → acci贸n que el padre define.

  • Se pasan al hijo como props.

  • ⚠️ Se pasa saludarFn sin par茅ntesis (es la referencia, no la ejecuci贸n).

馃挕 Nota Android: console.log se ve en la terminal de Metro Bundler o en Logcat de Android Studio.


馃敡 Paso 2: Recibir y ejecutar la funci贸n en el HIJO

jsx
// components/Saludar.js
import React from 'react';
import { View, Button } from 'react-native';

export default function Saludar({ userInfo, saludarFn }) {
    console.log('Props recibidas:', { userInfo, saludarFn });

    return (
        <View style={{ padding: 20 }}>
            <Button title="Saludar" onPress={saludarFn} />
        </View>
    );
}

馃攽 Puntos clave

  • El hijo no define ninguna funci贸n propia.

  • Solo recibe saludarFn y la conecta al onPress.

  • Se usa destructuring { userInfo, saludarFn } en lugar de props.saludarFn → m谩s limpio.

馃搵 Resultado en consola

text
Props recibidas: {
  userInfo: { nombre: 'Agust铆n Navarro Gald贸n', edad: 26, color: 'Azul' },
  saludarFn: [Function: saludarFn]
}

✅ Al presionar el bot贸n → se ejecuta saludarFn del padre → aparece "Hola Agust铆n" en la consola.


馃殌 Paso 3: Que el hijo DEVUELVA informaci贸n al padre

Hasta ahora el padre solo dice "Hola Agust铆n" fijo. Pero el objetivo dice:

"c贸mo el hijo puede devolver informaci贸n al padre"

Para eso, el hijo debe enviarle datos a la funci贸n del padre.

馃敡 Modificamos el hijo para pasar el nombre

jsx
// components/Saludar.js
import React from 'react';
import { View, Button } from 'react-native';

export default function Saludar({ userInfo, saludarFn }) {
    return (
        <View style={{ padding: 20 }}>
            <Button
                title="Saludar"
                // 馃憞 el hijo le pasa el nombre al padre
                onPress={() => saludarFn(userInfo.nombre)}
            />
        </View>
    );
}

馃攽 ¿Por qu茅 () => saludarFn(...) y no saludarFn(...)?

  • onPress={saludarFn(userInfo.nombre)} → ❌ ejecuta la funci贸n en el render (error).

  • onPress={() => saludarFn(userInfo.nombre)} → ✅ envuelve la llamada para que se ejecute solo al presionar.


馃敡 Paso 4: El padre recibe el dato y reacciona

jsx
// App.js
import React, { useState } from 'react';
import { View, Text } from 'react-native';
import Saludar from './components/Saludar';

function App() {
    const user = {
        nombre: 'Agust铆n Navarro Gald贸n',
        edad: 26,
        color: 'Azul',
    };

    // Estado para guardar el 煤ltimo saludo recibido
    const [ultimoSaludo, setUltimoSaludo] = useState('');

    // 馃憞 recibe el nombre que le manda el hijo
    const saludarFn = (nombre) => {
        console.log(`Hola ${nombre}`);
        setUltimoSaludo(nombre);
    };

    return (
        <View>
            <Saludar userInfo={user} saludarFn={saludarFn} />

            {ultimoSaludo !== '' && (
                <Text style={{ padding: 20, fontSize: 18 }}>
                    脷ltimo saludo: {ultimoSaludo}
                </Text>
            )}
        </View>
    );
}

export default App;

馃 ¿Qu茅 acaba de pasar? (flujo completo)

  1. El usuario toca el bot贸n (en el hijo).

  2. El hijo llama saludarFn(userInfo.nombre) → le pasa el nombre al padre.

  3. El padre recibe nombre → hace console.log y actualiza su estado con setUltimoSaludo.

  4. React vuelve a renderizar → aparece "脷ltimo saludo: Agust铆n Navarro Gald贸n" en pantalla.


馃搳 Diagrama del flujo

text
┌─────────────────────────────────────────────┐
│  PADRE (App.js)                             │
│  ├── datos: user { nombre, edad, color }    │
│  ├── l贸gica: saludarFn(nombre)              │
│  ├── estado: ultimoSaludo                   │
│  └── renderiza <Saludar ... />              │
└──────────────────┬──────────────────────────┘
                   │  props: { userInfo, saludarFn }
                   ▼
┌─────────────────────────────────────────────┐
│  HIJO (Saludar.js)                          │
│  ├── recibe props                           │
│  ├── muestra el bot贸n                       │
│  └── onPress → saludarFn(userInfo.nombre)   │
└──────────────────┬──────────────────────────┘
                   │  dato: nombre
                   ▼
┌─────────────────────────────────────────────┐
│  PADRE reacciona                            │
│  ├── console.log(`Hola ${nombre}`)          │
│  └── setUltimoSaludo(nombre) → re-render    │
└─────────────────────────────────────────────┘

✅ Resumen de correcciones al tutorial original

#Problema del tutorial originalCorrecci贸n aplicada
1El Paso 1 mostraba la funci贸n viviendo en el hijo, lo que confundeSe aclar贸 que es solo el "anti-ejemplo"
2El hijo no devolv铆a datos al padreSe agreg贸 onPress={() => saludarFn(userInfo.nombre)}
3El padre no reaccionaba al datoSe agreg贸 useState para mostrar el saludo en pantalla
4Se acced铆a a props.saludarFnSe us贸 destructuring { userInfo, saludarFn }
5No se explicaba por qu茅 () rompe el onPressSe explic贸 el uso de () => fn(...)

馃巵 ¿Por qu茅 este patr贸n importa?

Es la base de toda comunicaci贸n hijo → padre en React:

Caso realHijo env铆a al padre…
Formulario de loginusuario y contrase帽a
Lista de tareasid de la tarea a borrar
Carrito de comprasid del producto a agregar
Modalconfirmaci贸n o cancelaci贸n

El hijo no decide nada. Solo avisa con datos. El padre decide qu茅 hacer.

¿Quieres que armemos el siguiente ejemplo con una lista de tareas aplicando este mismo patr贸n (el hijo manda el id al padre para eliminar

Comentarios

Entradas m谩s populares de este blog

9. Componente SafeArea

Pasar funciones como props, explicado con analog铆as

Comunicaci贸n entre Padre e Hijo con Funciones en React Native