[英]React: how can I filter the state based on a property without mutating the state?
I have two button, one is completedTasks
and another is incompleteTasks
so when user click on completedTasks
I want to filter the state array based on a property.我有两个按钮,一个是
completedTasks
,另一个是incompleteTasks
所以当用户点击completedTasks
我想根据属性过滤状态数组。 and vice versa.反之亦然。
but, the problem is after clicking on completedTasks
my state array is mutated to only completedTasks filtered values.但是,问题是点击后
completedTasks
我的状态阵列突变只过滤值completedTasks。 so that, when I clicked on incompltedTasks I don't get my state back这样,当我点击 incompltedTasks 时,我的状态不会恢复
here is my two method:这是我的两种方法:
const incompleteTasks = () => {
const tasks = todos.filter((todo) => todo.completed === false);
setTodos(tasks);
};
const completedTasks = () => {
const tasks = todos.filter((todo) => todo.completed === true);
setTodos(tasks);
};
How to fix this so that the actual array is not modified, and just show the filtered property based on button click instead.如何解决此问题,以便不修改实际数组,而仅显示基于按钮单击的过滤属性。
- First solution could be using a state for storing status of filter - 第一个解决方案可能是使用状态来存储过滤器的状态
const [completed,setCompleted] = useState(null); //true , false
const incompleteTasks = () => setCompleted(false);
const completedTasks = () => setCompleted(true);
and use filteredTodos where you want to show并在要显示的地方使用filteredTodos
const filteredTodos = completed !==null ? todos.filter((todo) => todo.completed === completed):todos;
- Second soultion could be using a temp state: - 第二个灵魂可能使用临时状态:
const [filteredTodos,setFilteredTodos] = useState([]);
const incompleteTasks = () => {
const tasks = todos.filter((todo) => todo.completed === false);
setFilteredTodos(tasks);
};
const completedTasks = () => {
const tasks = todos.filter((todo) => todo.completed === true);
setFilteredTodos(tasks);
};
then show filteredTodos where you want.然后在你想要的地方显示filteredTodos 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.