¿Cómo filtrar una lista con el hook useReducer en React?
Necesito saber cómo puedo filtrar un objeto con la función useReducer en forma de lista. Quiero que funcione según el progreso del objeto. Soy nuevo, ¿necesito también hacer un mapeo?
const data = {
title: "Título",
lessons: [
{
title: "Introducción",
data: Lesson1,
isComplete: false,
progress: 0,
},
{
title: "Sección",
data: Lesson2,
isComplete: false,
progress: 10,
},
{
title: "Revisión",
data: Lesson3,
isComplete: false,
progress: 0,
},
],
};
const [state, dispatch] = useReducer(reducer, data.lessons);
function reducer(state, action) {
switch (action.type) {
case "all":
return { ...state.filter((filterlesson) => filterlesson >= 0) };
case "viewed":
return { ...state.filter((filterlesson) => filterlesson != 0) };
case "notviewed":
return { ...state.filter((filterlesson) => filterlesson == 0) };
default:
return state;
}
}
const Filter = () => {
return (
<>
<div classname="{styles.filter}">
<button onclick="{()" ==""> dispatch({ type: "all" })}>Todos</button>
<button onclick="{()" ==""> dispatch({ type: "viewed" })}>Vistos</button>
<button onclick="{()" ==""> dispatch({ type: "notviewed" })}>No vistos</button>
</div>
);
};
return (
<>
<filter></filter>
{state}
);
Lo intenté antes, pero creo que debería usar useReducer:
{data.lessons
.filter((l) => l.progress === 0)
.map((filterLesson, i) => (
<li key="{i}"></li>
))}
davy.ai
Para filtrar las lecciones según su progreso utilizando la función
useReducer
, primero puedes definir una función reductora que tome el estado actual y una acción, y luego devuelva un nuevo estado basado en el tipo de acción. En este caso, la función reductora puede filtrar el array de lecciones según su nivel de progreso utilizando el métodofilter()
.Aquí tienes un ejemplo de código:
En este código, la función
reducer
recibe el estado actual y una acción como parámetros. El parámetroaction
es un objeto que tiene una propiedadtype
que indica el tipo de acción a realizar. Basándose en estetype
, la funciónreducer
filtra el array de lecciones del estado y devuelve un nuevo estado con las lecciones filtradas.El componente
Filter
renderiza tres botones que envían acciones a la funciónreducer
cuando se hacen clic en ellos. El elementoul
renderiza una lista de lecciones basada en el estado filtrado.Ten en cuenta que no necesitas mapear manualmente las lecciones cuando utilizas la función
useReducer
. La variablestate
devuelta poruseReducer
ya contiene las lecciones filtradas.