React 无法更新状态

2024-01-22

I can't figure why I can't update my state (see setCoords). The request returns with a 200 code and the elements I'm trying to retrieve exists : enter image description here

这是我的代码:

const App = () => {
    const [city, setCity] = useState("");
    const [forecast, setForecast] = useState(null);
    const [coords, setCoords] = useState({});

    const handleSearchChange = ev => {
        setCity(ev.target.value);
    };

    async function onSearch() {
        if (city) {
            await apiGet(`/geo/1.0/direct?q=${city}`)
                .then(r => r.json())
                .then(r => setCoords({lat: r[0].lat, lon:r[0].lon})); // doesn't't set anything

            await console.log(coords) // console logs {}
            await apiGet(
                `/data/2.5/onecall?lat=${coords.lat}&lon=${coords.lon}&exclude=current,minutely,hourly,alerts`
            )
                .then(r => r.json())
                .then(r => setForecast(r));
        }
    }

感谢您的帮助!


需要注意的一件事是不要混合await with then(更多相关内容:可以先等待然后混合在一个实现中吗? https://stackoverflow.com/questions/54574662/can-await-and-then-be-mixed-in-one-implementation)。既然你正在使用async,我建议你全部更改为await,如下所示

另一件需要注意的事情是setStates调用(即setCoords and setForecast and setCity) is 异步本质上,这意味着立即console.log设置状态后将not记录刚刚更新的值。相反,React 会将这些 setState 安排到下一个渲染 - 因此,您只能在下一个渲染周期中查看/访问最新的值。如果您想记录值,可以将它们放在<pre>HTML 中的标记,或者执行console.log一开始,如下所示:

const App = () => {
    const [city, setCity] = useState("");
    const [forecast, setForecast] = useState(null);
    const [coords, setCoords] = useState({});

    console.log("City", city, "Forecast", forecast, "Coords", coords);

    const handleSearchChange = ev => {
        setCity(ev.target.value);
    };

    async function onSearch() {
        if (city) {
            const resNonJson = await apiGet(`/geo/1.0/direct?q=${city}`)
            const resJson = await resNonJson.json())
            const item = resJson[0];
            setCoords({lat: item.lat, lon: item.lon}));

            // Note that `setState` is async so console.log will not get the just-updated value
            console.log(coords) // {}
            console.log(item) // {lat:..., lon:...}
            const resNonJson2 = await apiGet(
                `/data/2.5/onecall?lat=${item.lat}&lon=${item.lon}&exclude=current,minutely,hourly,alerts`
            )
             const resJson2 = await resNonJson2.json())
             setForecast(resJson2);
        }
    }
    ... (other codes that I trust you do correctly)

    return <div>
    <pre>{JSON.stringify(coords)}</pre>
    </div>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React 无法更新状态 的相关文章

  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 摩卡 - Chai Karma“套件未定义”

    我对 jscript tdd 很陌生 遇到了问题 希望有人能告诉我我在做什么 在浏览器中运行测试 通过 HTML 文件 一切正常 通过节点和业力运行它们我得到以下异常 我想在 node js 主机的 karma 中使用 Mocha 和 Ch
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • Bootstrap按钮加载+Ajax

    我正在使用 Twitter Bootstrap 的按钮加载状态 http twitter github com bootstrap javascript html buttons http twitter github com bootst
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 如何纠正流警告:解构(缺少注释)

    我正在编写一个小型 React Native 应用程序 并且正在尝试使用 Flow 但我无法在任何地方真正获得有关它的正确教程 我不断收到错误 destructuring Missing annotation 有关 station 这段代码
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 检查 jQuery 1.7 中是否存在基于文本的选择选项

    所以我有以下 HTML 片段
  • DataTables row.add 到特定索引

    我正在替换这样的行项目 var targetRow entity row dataTable targetRow closest table dataTable DataTable dataTable row targetRow remov
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • 可以设置标题样式吗? (并且使用CSS或js?)[重复]

    这个问题在这里已经有答案了 我想知道是否可以设计一个title a href title This is a title Hello a 样式问题有两个方面 文本格式 编码 我猜这是可能的 所以在问题中这样做 工具提示样式 你能把它弄大一点
  • 在 ReactJS 中创建动态目录

    我有一个组件 它代表一个页面 其中有多个SectionHeader 组件作为该页面的子组件 我想通过检查 Page 的子项 SectionHeaders 来动态创建目录
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 使用 ApolloClient 从 useContext 挂钩导入一个简单变量

    我的反应相对较新 似乎无法导入client来自上下文的变量 我有一个名为 federation tsx 的文件 其中包含一些代码 我相信这应该是相关部分 const link createHttpLink uri process env U
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea
  • 如何在react-highcharts中使用图表工具提示格式化程序?

    如何使用图表工具提示格式化程序 我正在使用高图表的反应包装器 我有这样的配置 const CHART CONFIG tooltip formatter tooltip gt var s b this x b each this points

随机推荐

  • 尝试将 Moles 与 NUnit 一起使用。获得“Moles 需要测试成为一个仪器化过程”

    我尝试将 Moles 与 NUnit 一起使用 但收到以下错误 Moles 需要测试才能成为仪表化过程 我还在 Visual Studio 2008 中使用 Visual NUnit 来实现此功能 欢迎任何帮助 为了让 Moles 能够与
  • CIFilter 的便利初始化器给出了奇怪的异常

    这是我正在尝试的代码 typealias Parameters Dictionary
  • 在javascript中添加两个大数字[重复]

    这个问题在这里已经有答案了 我一直在尝试使用 javascript 添加以下数字 76561197960265728 912447736 遗憾的是 由于 JavaScript 中的四舍五入 它不会得到正确的数字 我需要该数字作为字符串 我尝
  • 在 Brave 中发送 XMLHttpRequest 时,引用者的这种行为是有意的吗?

    var xhr new XMLHttpRequest xhr open GET https httpbin org true xhr send 当运行上面这个简单的代码时example org Chrome devtools 中的请求标头显
  • Bootstrap 4 卡相同高度和底部对齐

    我正在尝试对齐 Bootstrap 4 卡并使用d flex随着align self stretch对于卡片本身 这太棒了 但是 我不知道如何让红色边框的部分浮到底部 使用 Bootstrap 4 的任何想法公用事业 https getbo
  • 如何使用 Kivy 获取文本输入的值

    我是 Kivy 的新手 因为我无法在 PySide 上练习 一些动态库损坏了或者我不知道是什么 所以我想尝试这个巨大的工具 我现在迷路了 我尝试这样做 在 Kivy 应用程序中获取文本输入值 https stackoverflow com
  • gsub 或 scan 中的匹配位置

    实现匹配位置的最佳方法是什么 由 对于使用时的每场比赛gsub or scan hello gsub Regexp last match offset 0 first gt 01234 See 正则表达式 last match http w
  • 使用谷歌地图上的 pincode 获取纬度和经度

    我需要加载给定 pin 码或区号的 Google 地图位置 我尝试使用地理编码器方法来查找给定地址的纬度和经度 当给定位置或区域但不适用于密码 特别是印度 时 此功能有效 有没有任何方法或途径可以使用 pincode 查找给定区域的纬度和经
  • Excel,将总和应用于多列上的某些单元格

    Excel 将总和应用于多列上的某些单元格 A B C D A 1 2 3 4 B 1 2 3 4 C 1 2 3 4 D sum A1 A2 A3 so A4 3 我们如何将总和分别应用于 B C D 列上的 4 个 B C D 您需要动
  • Google 电子表格 - 将多列转换为一列

    我想循环遍历 Google 电子表格中的一组行 如下所示 XXX 123 234 234 YYY 789 098 765 ZZZ 76 123 345 最终结果需要是 XXX 123 XXX 234 XXX 234 YYY 789 YYY
  • Python局部变量初始化

    我对 python 相当陌生 我想知道局部变量是如何工作的 让我们从一个简单方法的示例开始 def do sth local dict a 1 b 2 c 3 我们假设 local dict 的使用方式类似于 const 变量 问题是 每次
  • 这个要点
  • 没有以圆圈显示是什么?
  • 我试图在我的网页上显示一些项目符号列表圆圈 但它似乎没有显示 我尝试使用 firebug 但我找不到问题所在 我浏览了整个 css 文件 但我没有不知道问题出在哪里 我希望列表与圆圈垂直 请你帮我 这是代码 Browser resets h
  • 安全套接字连接的最佳实践

    安全套接字连接 无 SSL 的最佳实践是什么 我将通过 TCP 套接字连接移动敏感数据 登录名 密码 帐户 并想知道是否有一种好的 快速的加密 解密方法并避免恶意注入 如果您对 SSL 过敏 请使用 SSH 但原理是相同的 密钥通过非对称算
  • options 参数中可选参数的默认值

    我想传递一个对象作为类构造函数的参数 选项对象的某些键是可选的 在打字稿中是否有更好 更惯用的方法来完成以下任务 谢谢 class Car color number numberOfWheels number constructor opt
  • Python Seaborn 图表 - 阴影区域

    抱歉我的菜鸟问题 但是如何在seaborn图表的上下线之间添加阴影区域 颜色 我正在处理的主要代码如下 plt figure figsize 18 10 sns set style darkgrid palette sns color pa
  • 如何修复“未找到初始内容”错误?

    在客户端的一些代码上使用 Flash Builder 4 6 单击调试 也尝试运行 并收到此错误 Process terminated unexpectedly initial content not found Launch comman
  • 如何在使用通配符的目录指令中使用 apache2 mod_rewrite?

    我编写了一个 Web 应用程序 在托管该 Web 应用程序的专用服务器下运行 此 Web 应用程序的实例可在不同的域中使用 每个域都有自己的 Web 应用程序文件副本 允许根据需要进行自定义 我在 Debian Squeeze 下运行 Ap
  • Google Sign in API - 获取照片 Uri 为空

    我使用 Google Sign in API 来请求用户个人资料 例如用户显示名称 头像照片 我有null值 GoogleSignInAccount getPhotoUrl 获取值 GoogleSignInAccount getDispla
  • 检测 PHP 代码块的超时

    如果 PHP 中的代码块花费太长时间 有没有办法可以中止该代码块 也许是这样的 Set the max time to 2 seconds time new TimeOut 2 time gt startTime sleep 3 time
  • React 无法更新状态

    I can t figure why I can t update my state see setCoords The request returns with a 200 code and the elements I m trying