简体   繁体   English

React:如何在不改变状态的情况下根据属性过滤状态?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM