过滤出一组项目设置状态

Posted

技术标签:

【中文标题】过滤出一组项目设置状态【英文标题】:filtering out an array of items setting state 【发布时间】:2022-01-23 22:20:21 【问题描述】:

我希望过滤一个数组并返回数组的所有元素,除了被点击的元素,所以我有一个列表元素的映射,每个元素都有一个 key=index 的映射,onClick 它应该调用我的删除函数,并传入要删除的元素的索引,然后我需要过滤该数组,删除元素,更新状态,并将此信息发送到我的后端。

这里是删除功能

  const deleteItem = (id) => 
    // use filter, to loop through all pieces of index
    const element = list.todoItems.indexOf(id - 1);
    setList( todoItems: list.todoItems.filter(element !== id) );
    console.log(list.todoItems);
    dispatch(updateTodo(list));
  ;

这里是映射数组

list.todoItems.map((Item, index) => (
                <div
                  // setup anonymous function, that will call
                  // ONLY when the div
                  // is clicked on.
                  key=index
                  onClick=() => deleteItem(index)
                >
                  /* list item, gets text from props */
                  <li>Item</li>
                </div>
              ))

我一定遗漏了一些东西,因为这应该可以工作,尽管我可能不得不换档并将每个项目作为我的数据库中的实际对象,尽管 id 而不是这样做,因为我觉得字符串数组更合适对于这个应用程序。

【问题讨论】:

【参考方案1】:

删除您的 indexOf 逻辑,这将起作用。

您不必查找数组的索引,因为您已经将它作为参数接收。

const deleteItem = (id) => 
        setList( todoItems: list.todoItems.filter((_, filterID) => filterID !== id) );
        console.log(list.todoItems);
        dispatch(updateTodo(list));
 ;

【讨论】:

在这种情况下我该如何处理元素?因为您将它保存在过滤器中,但从未为其分配值? 这应该工作【参考方案2】:

你不需要从 indexOf 函数的索引中减去一个

在这种情况下,拼接比过滤器效果更好

const deleteItem = (id) => 
  const element = list.todoItems.indexOf(id);
  setList( todoItems: ...list.todoItems.splice(element, 1));
  dispatch(updateTodo(list));
;

【讨论】:

我不建议这种方法。因为你直接改变状态 你说得对,我解决了这个问题。 伙计,重要的不是他的事,而是他的事。你不应该直接改变状态。你可以使用不会改变状态的东西。 我知道,你是对的,我修好了 既然你在谈论什么是正确的,你的回答并没有指出他的代码的实际问题

以上是关于过滤出一组项目设置状态的主要内容,如果未能解决你的问题,请参考以下文章

Vuex 命名空间存储设置两种状态

java项目和web项目中的过滤器文件怎么使用?

如何在点击时同时过滤和处理项目

SQL 语句,用于查找项目的类型、包含状态以及最近添加的项目

从真实项目中抠出来的设计模式——第二篇:过滤器模式

eclipse项目-关闭状态的项目不展示到Package Explorer