0Pricing
React Academy · Lección

Patrón de selectores de contexto

Implemente un hook selector sencillo que solo vuelva a renderizar cuando cambie una parte del contexto.

Patrón de selectores de contexto es una lección gratuita de React Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.

Bienvenida

En esta lección implementará un hook selector de contexto que suscriba un componente únicamente a una parte del estado del contexto, evitando nuevas renderizaciones cuando cambien partes no relacionadas del contexto.

El problema de los selectores

useContext vuelve a renderizarse cuando cambia CUALQUIER parte del contexto. Si un componente solo necesita el nombre del usuario, pero el contexto también contiene una lista de notificaciones, añadir una notificación hace que el componente del nombre vuelva a renderizarse innecesariamente.

¿Qué es un selector?

Un selector es una función que extrae una parte específica del estado de un objeto de estado más grande: `state => state.user.name`. Un hook selector se suscribe al contexto, pero solo desencadena una nueva renderización cuando cambia el valor seleccionado.

Hook selector sencillo

Cree un hook useSelector que lea el contexto y lo envuelva en useMemo utilizando como dependencia el resultado del selector. El componente solo vuelve a renderizarse cuando cambia el valor seleccionado.
function useAppSelector(selector) {
  const state = useContext(AppCtx);
  return useMemo(() => selector(state), [state, selector]);
}

// Consumer only re-renders when user.name changes
const name = useAppSelector(s => s.user.name);

Comprobación de igualdad superficial

El uso de useMemo con un selector sigue provocando una nueva renderización si el selector devuelve una referencia nueva de objeto o arreglo en cada llamada, por ejemplo, `s => s.items.filter(...)`. Use una comparación de igualdad superficial para omitir las nuevas renderizaciones cuando el contenido sea el mismo.
import { useRef } from 'react';

function useSelector(selector) {
  const state = useContext(AppCtx);
  const selected = selector(state);
  const ref = useRef(selected);
  if (!shallowEqual(ref.current, selected)) {
    ref.current = selected;
  }
  return ref.current;
}

Biblioteca use-context-selector

Para uso en producción, la biblioteca **use-context-selector** proporciona un hook `useContextSelector` con suscripciones y comprobaciones de igualdad eficientes, sin necesidad de gestores de estado externos.
import { useContextSelector } from 'use-context-selector';

const name = useContextSelector(AppCtx, s => s.user.name);

Zustand como solución nativa para selectores

El hook `useStore(selector)` de Zustand admite selectores de forma integrada y ofrece igualdad superficial de manera predeterminada, por lo que resulta adecuado para árboles de estado grandes en los que son importantes las suscripciones detalladas.
const name = useAppStore(state => state.user.name);

Cuándo los selectores son excesivos

Si las actualizaciones del contexto son poco frecuentes y los consumidores son baratos de volver a renderizar, los selectores añaden complejidad sin un beneficio medible. Analice primero el rendimiento y optimice siempre basándose en datos.

Memorización de las funciones selectoras

Si crea el selector en línea dentro del cuerpo del componente, obtendrá una nueva referencia de función en cada renderización, lo que podría romper la memorización. Defina los selectores fuera del componente o use useCallback.
// Outside component — stable reference
const selectName = s => s.user.name;

function Profile() {
  const name = useAppSelector(selectName);
  return <p>{name}</p>;
}

Selectores derivados

Componga selectores llamando a uno desde dentro de otro. Los selectores derivados calculan valores a partir de selectores base y mantienen la lógica de negocio fuera de los componentes.
const selectFullName = s => s.user.firstName + ' ' + s.user.lastName;

Comprobación rápida

¿Por qué deben definirse las funciones selectoras fuera del cuerpo del componente cuando se utilizan con useContextSelector o useMemo?

Resumen

Los selectores extraen una parte del estado del contexto y evitan nuevas renderizaciones cuando cambian partes no relacionadas. Defina los selectores fuera de los componentes para mantener referencias estables. Use use-context-selector o Zustand para disponer de compatibilidad con selectores adecuada para producción.

Próxima lección

Próxima lección: **Cuándo no usar Context**; aprenderá a reconocer cuándo el paso de props, la composición o un gestor de estado son opciones más adecuadas que Context.

Preguntas frecuentes

¿La lección «Patrón de selectores de contexto» es gratis?

Sí — el texto completo de «Patrón de selectores de contexto» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Patrón de selectores de contexto»?

Implemente un hook selector sencillo que solo vuelva a renderizar cuando cambie una parte del contexto. Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar React Academy?

No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Patrón de selectores de contexto»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de React Academy?

Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Separar contextos para limitar los renderizados
  2. Memorizar valores de contexto con useMemo
  3. Patrón de selectores de contexto
  4. Cuándo no utilizar Context
← Volver a React Academy