【问题标题】:ReactJs UseState : insert element into array not updatingReactJs UseState:将元素插入数组不更新
【发布时间】:2020-03-06 10:11:44
【问题描述】:

我正在尝试使用 React Hooks,但不知何故我的状态没有更新。当我点击复选框时(参见示例),我希望将后者的索引添加到数组selectedItems,反之亦然

我的函数如下所示:

const [selectedItems, setSelectedItems] = useState([]);

const handleSelectMultiple = index => {
    if (selectedItems.includes(index)) {
        setSelectedItems(selectedItems.filter(id => id !== index));
    } else {
        setSelectedItems(selectedItems => [...selectedItems, index]);
    }
    console.log("selectedItems", selectedItems, "index", index);
};

您可以找到console.log 结果 here

结果中的一个空数组,有人可以向我解释我错过了什么吗?

【问题讨论】:

  • 其实你的代码没有问题。只是当您登录selectedItems 时,状态尚未更新。
  • setSelectedItems 是异步的,它不会立即更新状态。您的状态已过时。
  • @hussain.codes ,那么添加了什么指令来获得数组的当前状态

标签: reactjs react-hooks use-state


【解决方案1】:

因为useState 是异步的 - 调用它后您不会立即看到更新。

尝试添加一个useEffect,它使用依赖数组来检查值何时更新。

useEffect(() => {
    console.log(selectedItems);
}, [selectedItems])

【讨论】:

  • 当我尝试 useEffect 并且我记录(selectedItems)我在数组中添加了最新索引而不是索引列表时,索引的连接没有正确执行此操作的问题
【解决方案2】:

其实你的代码没有问题。只是当您登录selectedItems 时,状态尚未更新。

如果您在更新函数中的状态后需要selectedItems,您可以执行以下操作:

const handleSelectMultiple = index => {
    let newSelectedItems;
    if (selectedItems.includes(index)) {
        newSelectedItems = selectedItems.filter(id => id !== index);
    } else {
        newSelectedItems = [...selectedItems, index];
    }
    setSelectedItems(newSelectedItems);
    console.log("selectedItems", newSelectedItems, "index", index);
};

【讨论】:

  • 当我在函数中执行此更改时,这是添加 3 个新索引后的结果,newSelectedItems [1] index 1 newSelectedItems [2] index 2 newSelectedItems [3] index 3 预期结果 = > newSelectedItems[1,2,3] 索引 3 。就像 setSelectedItems() 不起作用,它不会更新数组,它始终保持数组的初始状态
  • 你能发布你的整个组件吗?我刚刚测试了它,它工作正常。
猜你喜欢
  • 2020-10-16
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 2021-03-30
  • 2018-03-11
  • 1970-01-01
  • 2017-11-06
相关资源
最近更新 更多