En mi primera aplicación con Redux, intento mantener mis colecciones normalizadas como se recomienda. De esta forma solo tienes que cambiar las Entidades en un lugar. (esto se siente bien para mí)
Al principio, normalicé con éxito mi matriz de datos a un objeto de entidades similar a una matriz con los ID como claves
Luego quise enumerar las entidades en una Vista, así que tuve que volver a analizarlas en una matriz. Además, si quiero filtrar mis Entidades, necesito el Array real. ¿Es este realmente el enfoque correcto?
Ejemplo con volver a seleccionar:
// As "id" for my images i use "uri"
imageEntities = {
uri1: {image...},
uri2: {image...},
....
}
// Selectors:
const imagesSelector = state => state.images;
// parse the Array-like-Object to an Array
const imagesArySelector = createSelector(
[imagesSelector],
images => {
let ary = [];
for (var key in images) {
if (images.hasOwnProperty(key)) {
ary.push(images[key]);
}
}
return ary;
}
);
// filter the Array to get only the new images
export const newImagesSelector = createSelector(
[imagesArySelector],
images => images.filter(image => image.isNew)
);
¿Es este realmente el enfoque correcto? (está funcionando bien, por lo que veo hasta ahora)
Creo que se puede hacer con más elegancia.
Cómo lo hago:
import { createSelector } from 'reselect';
const providersSelector = state => state.entities.providers;
const subscribersSelector = state => state.entities.subscribers;
export const providersArraySelector = createSelector(
[providersSelector],
providers => Object.keys(providers).map(id => providers[id])
);
export const subscribersArraySelector = createSelector(
[subscribersSelector],
subscribers => Object.keys(subscribers).map(id => subscribers[id])
);
@itsmepetrov se ve mucho mejor ... gracias.
Entonces, en principio, estoy en el camino correcto. ¿Nadie más?
Luego quise enumerar las entidades en una Vista, así que tuve que volver a analizarlas en una matriz.
Puede mantener una matriz de ID cuando sea más conveniente trabajar con las matrices. _Necesitarás_ hacer esto para cosas como la paginación. El real-world
ejemplo en examples
carpeta hace eso.
Comentario más útil
Creo que se puede hacer con más elegancia.
Cómo lo hago: