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

控制台记录使用use State后的状态不返回当前值[重复]

司徒经纶
2023-03-14

使用console.log()后使用reactjsuse State()钩子,不返回此状态的当前值,我该如何处理?

以下是该案例的代码,尝试找出控制台日志显示的内容。

import React, { useState } from "react";
import ReactDOM from "react-dom";

function Weather() {
  const [weather, setWeather] = useState();

  return (
    <input
      value={weather}
      onChange={(e) => {
        setWeather(e.target.value);
        console.log(weather);
      }}
    />
  );
}

const rootElement = document.getElementById("root");
ReactDOM.render(<Weather />, rootElement);

共有3个答案

融修平
2023-03-14
onChange={(e) => {
    setWeather(e.target.value);
    console.log(weather);
  }}

当这个函数被触发时,由于setWeather是异步的,它将被传递给web api。Javascript引擎不处理这个功能。wep api处理这个,当它完成时,作为web api一部分的事件循环将它传递给调用堆栈。

调用栈是函数被执行的地方。一旦异步函数被传递到web api,不管它的执行时间是多少(即使它有0秒的超时),它们都不会被移动到调用栈,除非javascript引擎完成了同步代码的执行。一旦调用栈被释放,事件循环将把函数传递给调用栈来执行。

所以在你的代码中,onChange() 被传递给调用堆栈。在此函数内部,必须执行 2 个函数。由于setWeather是异步的,它转到Web api,获取e.target.value,同时控制台.log被执行。当调用堆栈中没有剩余的同步代码时,事件循环会将 setWeather 推送到要执行的调用堆栈。

假设您在输入字段中输入“name”。在“nam”之后,状态是“nam”,但是当您键入“e”时,这将在webapi中执行,因此当它在web api中时,console.log将记录当前状态“nam”。这就是为什么你总是在一个字符后看到控制台

孔征
2023-03-14

当您调用< code>setWeather时,您触发了组件的重新呈现器,它将再次调用此函数。但是,< code>console.log(天气);仍然引用< code>useState返回的第一个值,这是您的原始值。如果您想打印它,您应该:

console.log(e.target.value);
万承志
2023-03-14

use State默认情况下只做一件事,设置新状态并导致函数的重新渲染。它本质上是异步的,因此默认情况下,在它之后运行的方法通常会运行。

在您的示例中,在页面的新加载中,键入“s”会导致useState更改状态,但是因为它是异步的,所以调用< code>console.log时会使用旧的状态值,即< code>undefined(因为您没有设置值。你应该考虑设置一个初始状态,如果你想)

const [weather, setWeather] = useState('');    // Set the intial state

真正读取状态值的唯一方法是使用 useEffect,当组件重新呈现时调用它。您的方法只需变成:

import React, { useEffect, useState } from 'react';
import ReactDOM from 'react-dom';

function Weather() {
    const [weather, setWeather] = useState('');

    useEffect(() => console.log(weather), [weather]);

    const changeValue = event => setWeather(event.target.value);

    return <input value={weather} onChange={changeValue} />;
}

const rootElement = document.getElementById('root');
ReactDOM.render(<Weather />, rootElement);
 类似资料:
  • 问题内容: 通过使用reactjs后挂机,不返回此状态下的电流值,我该如何处理呢? 这是这种情况的代码,尝试找出控制台日志的显示内容。 问题答案: 默认情况下,只做一件事,只做一件事,设置新状态并导致函数重新呈现。它本质上是异步的,因此默认情况下,通常在它运行之后运行的方法。 从您的示例中,在页面的全新加载中,键入’s’导致useState更改状态,但是由于它是异步的,因此将使用旧的状态值来调用,

  • 我编写了以下控制器方法: 当我在浏览器中请求此方法时,我看到以下内容: 我实现服务器端错误还是客户端问题? 更新NJNEX答案。 如果我想在控制器方法中实现以下逻辑,我应该怎么做:

  • 问题内容: 如何管理日志-或对异步函数内部返回的数据进行任何处理? 例如:JS FILE: JSON文件: 我如何返回/访问JSON文件中的所有信息并使用它。例如,我想使用“ First”和“ Second”并将其添加到div中。与“ FirstA”和“ FirstB”以及“ SecondA”和“ SecondB” …相同。 就目前而言,我得到了 Promise {:undefined} 任何帮助

  • 我有一个返回对象的方法。我想使用spring AOP在日志中打印该对象的值。我怎样才能做到呢?

  • 在MariaDB数据库中,使用语句和子句从表中检索一个或多个记录。 语法: 示例1: 以降序检索记录: 使用语句并带有子句查询表中的数据。结果列的值按降序显示,为。参考如下语句 - 执行上面查询语句,得到以下结果 - 示例2: 按列的值升序检索记录: 执行上面查询语句,得到以下结果 - 示例3:分页 在应用程序中,由于数据记录太多,不能全在一个页面中全部显示,我们经常要使用分页来显示。假设每页显示

  • 我引用了前台和后台接收firebase通知的答案-->https://stackoverflow.com/A/38451582/12553303 其实下面是我的疑问:-------- 如果我没有为前台条件编码(谈论推送通知),当我的应用程序在后台时,我仍然会得到通知,对吗????-->是的 但是,当im处于前台状态时,我从firebase推送了一个通知-->我不会在状态栏上看到通知,这也是可以的(

  • 渲染后,我得到了当前分配给USESTECT常量的值。我已经在useEffect中初始化了常量值,但仍然无法获得结果。