【发布时间】:2022-01-17 02:29:10
【问题描述】:
我需要知道如何使用 useReducer 函数以列表的形式过滤对象。我希望它根据对象的进度工作。我是新人,我也需要映射一些东西吗?
const data = {
title: "Title",
lessons: [
{
title: "Introduction",
data: Lesson1,
isComplete: false,
progress: 0,
},
{
title: "Section",
data: Lesson2,
isComplete: false,
progress: 10,
},
{
title: "Review",
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" })}>All</button>
<button onClick={() => dispatch({ type: "viewed" })}>Viewed</button>
<button onClick={() => dispatch({ type: "notviewed" })}>Not Viewed</button>
</div>
</>
);
};
return (
<Fragment>
<Filter />
{state}
</Fragment>
);
我之前尝试过,但认为应该使用 useReducer :
{data.lessons
.filter((l) => l.progress === 0)
.map((filterLesson, i) => (
<li key={i}></li>
))}
【问题讨论】:
标签: reactjs filter state dispatch use-reducer