A veces, las personas usan partial en su lugar, pero conduce a los mismos problemas. Por ejemplo, en el componente de inicio de sesión, tendríamos que verificar si la función de inicio de sesión existía antes de poder invocarla, porque ahora es una propiedad opcional y no una propiedad requerida.
Un contexto simple como este no es útil a scale. Si cualquier propiedad dentro del contexto cambia, cada consumidor se vuelve a renderizar. En nuestro ejemplo anterior, el componente de inicio de sesión se vuelve a renderizar cuando iniciamos sesión, porque es la propiedad logged del contexto cambia, aunque no usamos esa propiedad en el componente de inicio de sesión en absoluto.
Un enfoque mejor es usar un contexto selectivo. Existe una excelente biblioteca llamada useContextSelector que nos permite hacer precisamente eso. Veamos el proveedor de API subyacente que maneja todos los datos primarios data para la aplicación CRUD. Esta API nos permite editar, agregar y eliminar servicios, y maneja la actualización del estado. Pero no queremos que los consumidores de contexto que no están utilizando los servicios NGATE se vuelvan a renderizar solo porque agregamos un nuevo servicio.
Ahora podemos pasar una función selectora. En el horario, seleccionamos una sola propiedad del proveedor de API, los empleados, para que podamos mostrarlos a todos. Pero más a menudo, en realidad seleccionamos múltiples propiedades, y para asegurarnos de que la caché y la renderización funcionen, necesitamos comparar superficialmente los objetos devueltos, por lo que también pasamos una bandera booleana. Veremos cómo funciona esta función selectora en un momento, pero primero veamos cómo se crea el contexto.
En realidad, todavía estamos permitiendo null aquí para facilitar la creación del contexto. Este contexto tiene múltiples valores, por lo que si tuviéramos que escribirlos todos, sería mucho trabajo. Permitir null hace que sea mucho más fácil y mucho más compacto. Esto se debe a que esta biblioteca.useContextSelector todavía se requiere como un valor inicial para el contexto. En el proveedor, aplicamos el valor de la misma manera que normalmente, y también puedes ver aquí que todavía permite que se pase null. Pero ahora las cosas se complican. Cuando seleccionamos de nuestro contexto, tenemos esta función sobrecargada. Nos permite seleccionar todo el contexto si no pasamos nada, seleccionar un solo valor si pasamos un selector, o seleccionar múltiples valores si pasamos un selector y verdadero. No es bonito. Es un poco complejo, pero funciona. Pero si necesitas esto para múltiples contextos en toda tu aplicación, es muy repetitivo copiarlo. Por esa misma razón, he creado una pequeña biblioteca llamada Recontextual que hace exactamente esto. Envuelve useContextSelector y simplifica la API. Es un poco opinativo sobre cómo debería ser la API, pero creo que esto es todavía muy genérico y puede ser utilizado por la mayoría de las personas. No permite un valor predeterminado, pero tampoco creo que las personas usen el valor predeterminado de contextos más complejos de todos modos. Veamos cómo usamos eso en ScheduleProvider.
Comments