当前位置: 首页 > 知识库问答 >
问题:

React/javascript对数组的添加不改变数组长度[重复]

楚方伟
2023-03-14

我正在学习react native,我正在做一个小应用程序,记录每天的睡眠时间。

我正在使用useEffect()来触发对屏幕上显示的值的一些修改,其中之一是我在useEffect内部更新的平均时间avere():

const [updateAction, setUpdateAction] = useState(false);

useEffect(() => {
        console.log("lenght:" + registSleep.length);
        var registed = false;
        if (!isNaN(enteredHours)) {
            for (var i = 0; i < registSleep.length; i++) {
                if (
                    registSleep[i].day === selectedDay &&
                    registSleep[i].month === selectedMonth &&
                    registSleep[i].year === selectedYear
                ) {
                    registed = true;
                    registSleep[i].hours = enteredHours;
                }
            }
            if (!registed) {
                var newReg = {
                    day: selectedDay,
                    month: selectedMonth,
                    year: selectedYear,
                    hours: enteredHours,
                };
                setNewRegist((prevReg) => [
                    ...prevReg,
                    newReg,
                ]); 
            }
            if (registSleep.length != 0) {
                average();
            }       
        }
        console.log("2. lenght:" + registSleep.length);
        setviewInfoAction(!viewInfoAction);
    }, [updateAction]);

为了调试,如您所见,在向寄存器数组setNewRegist(...)添加新值之前,我先打印控制台lenght。据我所知,应该打印lenght:0然后打印2。lengt:1但它会打印lengt:0然后打印2。lengt:0并在下一个触发器上lengt:1然后2。lenght:1

为什么数组不在添加时更新?

共有2个答案

穆丁雨
2023-03-14

我假设setNewRegist是useState钩子,其中它的值是registSleep

const [registSleep, setNewRegist] = useState([ ... ])

它不起作用的两个原因。useState钩子是异步的,对于setstate内部的逻辑,逻辑不会停止。

setNewRegist( ... update registSleep)
console.log(registSleep) // will run before setState finishes

然而,即使它确实及时完成了,registSleep已经被设置为固定值,所以它不会改变,除非组件被重新发送,这就是setState所做的,以触发组件到Rerender。

孟茂
2023-03-14
//I am considering this
const [ registSleep , setNewRegist ] = useState([])

setNewRegist异步函数,因此在您的情况下,下一个状态将首先执行console.log,因此它不会更新RegistSleep

那么如何检查对不对呢?

塔达...!!!您可以通过useeffect检查registsleep的每次更新,如下所示:

useEffect(() => {
   // Here you can get updated length
   // as soon as registSleep updates
   console.log(registSleep.length); 
},[registSleep]) // <-- watch for any update on `registSleep`
 类似资料:
  • 基本上,我试图用一个名为“a”的变量设置数组的长度,并将其声明为3和int。当我试图用for循环查看所有元素时,我不会将“null”作为元素。到现在为止,一直都还不错。然而,当有人想向该数组中添加一个元素时,我会向提到的变量“a”中添加1,从而延长该数组的长度,并允许我向该数组中再添加一个元素。但它不起作用。以下是代码: }

  • 本文向大家介绍javascript 数组的定义和数组的长度,包括了javascript 数组的定义和数组的长度的使用技巧和注意事项,需要的朋友参考一下 本文提供一款简单的js入门教程,这是一款js数组定义与数组长度实例教程,如果你正在学习js数组的话,我们这里告诉你如何定义数组以及增加数组与数组长度计算实例。 先来看看如何定义数组 或者数组直接量: 下面看一下,在数组后面增加一个元素 数组的长度

  • 我尝试过创建循环,比如减去用户想要购买的物品的数量,同时计算取值时的模数为0,减去用户购买的数量,但我离它还很远。 数组来自其他方法: 是商品的价格是用户购买的商品数量是用户对折扣的选择,例如,用户可以将折扣设置为2包、3包甚至无。

  • 问题内容: 我如何遍历可变长度的Java数组。 我想我会设置一个while循环,但是如何检测到数组末尾。 我想我想要这样的东西[只需要弄清楚如何表示myArray.notEndofArray()] 问题答案: 要么 第二个版本是“ for-each”循环,它适用于数组和Collections。大多数循环可以使用for- each循环完成,因为您可能并不在乎实际的索引。如果您确实关心实际索引,请使用

  • 问题内容: 我有一个快速的问题。我在java中有一个整数数组,需要它的长度在整个类中变化。具体来说,在某些情况下,我需要将其增加一。我这样尝试过。 我会在需要时增加整数变量numberOfSBG,但我认为这不起作用。还有其他办法吗? 问题答案: 我建议您使用ArrayList,因为您不必担心长度。创建后,您将无法修改数组大小: 数组是一个包含固定数量的单一类型值的容器对象。创建数组时将确定数组的长

  • 我正在创建一个从网站获取信息和下载电影的应用程序。我成功地将信息设置在不同的数组中,并将它们组合到一个数组中。 然而,现在我试图把这个数组放在一个更大的数组中(想使用JSON),但失败了。 我当前的Json输出如下所示: 这是通过以下代码实现的: 我想在此之上添加另一个层,所以有一个名为“电影”的通用标签,对于每一部电影都有这个信息。我该怎么做呢? 更新:添加了以下代码: JSON似乎是正确的,但