Em mới làm quen React Hooks , vấn đề ở đây của em là khi em filter dữ liệu thì nó bị lặp vô hạn và em tìm cách trên mạng thì thấy dùng useMemo() , em làm theo thì khắc phục được, chạy ổn không lỗi. Nhưng em có đọc doc useMemo() dũng kĩ thuật memorization để hạn chế việc render lại còn useEffect() có dependencies thì nó sẽ chạy khi mà dependencies thay đổi
Cái luồng đi của em là từ TaskList sẽ truyền giá trị filter ra thằng App để thằng App filter rồi trả ngược danh sách về TaskList để hiện thị. Trong TaskList và App em đều có state là filterName và filterStatus :
const [filter, setFilter] = useState({
filterName: '',
filterStatus: 0
})
Đây là lỗi lập vô hạn khi em dùng useEffect trong App component:
useEffect(() => {
if (filter) {
if (filter.filterName) {
setTaskList(taskList.filter(task => {
return task.name.toLowerCase().indexOf(filter.filterName.toLowerCase()) !== -1;
}))
}
let filterStatus = parseInt(filter.filterStatus);
setTaskList(taskList.filter(task => {
if (filterStatus === 0) {
return task;
} else {
return task.status === (filterStatus === 1 ? false : true);
}
}))
}
} , [filter , taskList])
Đây là cách khắc phục em tìm được trên mạng sử dũng useMemo() :
const tasks = useMemo(() => {
let tasksFilter = [...taskList];
if (filter) {
if (filter.filterName) {
tasksFilter = taskList.filter(task => {
return task.name.toLowerCase().indexOf(filter.filterName.toLowerCase()) !== -1;
});
}
let filterStatus = parseInt(filter.filterStatus);
return tasksFilter.filter(task => {
if (filterStatus === 0) {
return task;
} else {
return task.status === (filterStatus === 1 ? false : true);
}
});
}
}, [filter, taskList]);
Mọi người có thể giải thích cho em tại sao bị lập vô hạn và cách khắc phục trong trường hợp của em không ?
Đây là topic đầu tiên em hỏi cho nên có gì sai sót trong cách đưa vấn đề của mình , cách đặt câu hỏi và nhiều thứ khác , mong mọi người thông cảm và chỉ em khắc phục để em không bị mắc phải trong các topic khác