将新数组而不是数组文字传递给useState会显示空数组

时间:2019-12-20 03:50:22

标签: javascript reactjs

这是个小问题,但很奇怪!

let checkedlistarr = new Array();
for (var i in items){  //items size is 30
    checkedlistarr.push(i)
 }
const [selected, setSelected] = React.useState(checkedlistarr);
console.log(selected)

它返回[]

但是

checkedlistarr = ["0","1","2","3"];
const [selected, setSelected] = React.useState(checkedlistarr);
console.log(selected)

它返回["0","1","2","3"]

为什么会这样?我也尝试了concat函数。但同样的问题。

3 个答案:

答案 0 :(得分:1)

我确信代码没有问题。 之所以返回空数组,是因为处理时间。

console.log(selected);

此行将在循环操作之前处理。

答案 1 :(得分:1)

可能有一个小误会。我相信 items 必须为空或没有可迭代的属性。

从文档 for-in 开始,迭代所有可枚举的属性。

例如:如果 items 是数字/布尔值(having not Iterable values),for-in 循环甚至不会执行。

const items = 30
for(var i in items) {
  console.log("this won't run") // Because `Object.getOwnPropertyDescriptors(items)` returns empty `{}`
}

如果 items 具有 Iterable 属性,则 for..in 循环会正确执行。意思

const items = new Array(30).fill(1) // fill some values or any object with values { 0: 0, 1: 1, 2: 2... }
for(var i in items) {
  console.log("this will run", i) // Because `Object.getOwnPropertyDescriptors(items)` returns empty `{0, {...}, 1: {...},2...}`
}

您可以在代码中看到 here demo

答案 2 :(得分:0)

这是我的答案。 上面的代码是正确的。 我使用循环指令多次尝试了上述代码模块。 结果,console.log(selected)的工作速度比for循环快。 所以我避免这种情况。 谢谢。