React Hooks 上的 useState 不更新数组

2024-02-12

我已经尝试了很多方法,但似乎无法理解为什么 setTypes 不会更新“类型”数组?

import { useState, useEffect } from 'react';
import { PostList } from './post-list';
import * as api from '../utils/api';

export const PostSelector = (props) => {
  const [posts, setPosts]     = useState([]);
  const [loading, setLoading] = useState(false);
  const [type, setType]       = useState('post');
  const [types, setTypes]     = useState([]);
  
  const fetchTypes = async () => {
    setLoading(true);
    const response = await api.getPostTypes();
    delete response.data.attachment;
    delete response.data.wp_block;
    const postTypes = response.data;
    console.log(response.data); // {post: {…}, page: {…}, case: {…}}
    setTypes(postTypes);
    console.log(types); // []

    // Why types remain empty??
  }

const loadPosts = async (args = {}) => {
  const defaultArgs = { per_page: 10, type };
  const requestArgs = { ...defaultArgs, ...args };
  

  requestArgs.restBase = types[requestArgs.type].rest_base; // Cannot read property 'rest_base' of undefined
  
  const response = await api.getPosts(requestArgs);
  console.log(response.data);
}

useEffect(() => {
  fetchTypes();
  loadPosts();
}, []);

  return (
    <div className="filter">
      <label htmlFor="options">Post Type: </label>
      <select name="options" id="options">
        { types.length < 1 ? (<option value="">loading</option>) : Object.keys(types).map((key, index) => <option key={ index } value={ key }>{ types[key].name }</option> ) }
      </select>
    </div>
  );
}

请查看 console.log 并注意不同的响应。

我想做的是加载类型列表,在本例中为“帖子”、“页面”和“案例”,然后根据当前“类型”呈现帖子列表。默认类型是“post”。

如果我将 [types] 添加到 useEffect.我终于得到了值,但组件渲染不停。

感谢大家的评论。很多人都指出了这个问题,因为我们设置状态并不意味着它会立即设置,因为它是异步的。

那我们如何解决这个问题呢?不管出于什么原因,我们如何才能做到这一点?如果我们不知道状态何时可用,我们如何在任何时间点处理我们的状态并根据我们的状态执行计算?我们如何确保我们等待我们需要的一切,然后使用我们期望的值?


对于任何来到这里并且无法设置/更新 useState 数组的人,您需要使用扩展运算符 (...) 而不仅仅是数组,例如在 Typescript 中使用“[...initState]”而不是“initState”...

 //initialise
  const initState: boolean[] = new Array(data.length).fill(false);
  const [showTable, setShowTable] = useState<boolean[]>([...initState]);

  // called from an onclick to update
  const updateArray = (index: number) => {
    showTable[index] = !showTable[index];
    setShowTable([...showTable]);
  };
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React Hooks 上的 useState 不更新数组 的相关文章

  • JSX 支持哪些 ES6 功能?

    我在用着与 JSX 进行反应 with 反应工具 https www npmjs com package react tools将 JSX 代码编译为 JavaScript JSX 支持哪些 ES6 功能harmony选项已启用 感谢康加克
  • Safari 不触发表单提交

    对于一个项目 我有两个选择表单字段 它们通过 jquery 触发器 提交 发送 这在 Firefox 和 Chrome 中运行良好 但在 Safari 中没有任何反应 这是 HTML 代码
  • YouTube 360​​ 视频 iframe 无法在移动浏览器中工作

    我正在尝试为 YouTube 360 视频获取嵌入的 iframe 以便在我的移动网站上播放 它在桌面浏览器上运行良好 但在移动浏览器中我只能播放平面立体视图 我可以确认它绝对是一个 HTML5 播放器 这显然是其他人正在经历的一个未解决的
  • Chart.js 渲染垂直堆积条形图太慢

    我正在使用 Chart js API 渲染多个堆叠的垂直条形图 但性能很慢 我什至做了一些改变 这样所有的content对象已经由服务器而不是浏览器处理 但我意识到大部分时间来自最终函数new Chart overallStatsChart
  • 当 img.crossOrigin="Anonymous" 时,Chrome MJPEG CORS“响应无效”

    Image from origin http 192 168 1 67 5555 has been blocked from loading by Cross Origin Resource Sharing policy Invalid r
  • 如何在 的每四个循环项之后添加

    我想在循环中的每第四个数字项之后退出循环 我想创建一个二十人的名单 在每一个tr应该是4个人 So I want to break from the loop after every 4th number of loop My one tr
  • 在 angularJS 中覆盖模块值/常量的最佳方法

    我用 angularJS 编写了一个模块 封装了所有后端通信 为了获得更大的灵活性 我将 api 前缀作为模块上的常量值 可能是值 因为我没有在配置阶段使用它 所以像 angular module myapp data constant a
  • 内容丰富的 api markdown 转换为 HTML

    有没有什么简单的方法可以将 Markdown 文本从 Contentful api 转换为 html 代码以显示在 html 页面上 我尝试过使用 pagedown 和一些类似的技术 但似乎没有一个对我有用 我是 Contentful 的客
  • 如何使用谷歌地图检测一个点是否在多边形内部?

    我想检测到google maps LatLng是在一个里面google maps Polygon 我怎样才能做到这一点 Cheers 你可以使用这个谷歌地图V3 google maps geometry poly containsLocat
  • 如何从矩形点计算旋转角度?

    我有4分1 2 3 4闭合一个矩形 这些点按以下方式排列在数组中 x1 y1 x2 y2 x3 y3 x4 y4 我遇到的问题是矩形可以旋转一定角度 如何计算原始点 灰色轮廓 和角度 我试图在 javascript css3 transfo
  • 无法将中间件与 Firebase 和 NuxtJS 3 一起使用

    我正在尝试在示例项目中使用 Firebase 身份验证 身份验证按预期工作 但是一旦我想使用中间件来阻止用户访问管理页面或在已经登录的情况下访问登录页面 这是不可能的 我已经尝试了几个小时 但没有任何效果 这是我的package json
  • 使用 ngx-translate 时更改 URL

    当有人使用 ngx translate 单击所选语言时 我尝试更改 URL 我想我应该通过订阅语言更改事件然后修改当前的 url 以反映所选的语言来做到这一点 因为我是新手 所以我不确定是否需要服务来做到这一点 或者可能是另一种解决方法 我
  • Immutable.js 推入嵌套对象中的数组

    假设有一个对象 const object foo bar 1 2 3 我需要推动4 to object foo bar array 现在我正在这样做 const initialState Immutable fromJS object co
  • Ajax调用完成后执行函数

    我是 Ajax 新手 我尝试在使用 for 循环时使用 Ajax Ajax 调用之后 我正在运行一个使用 Ajax 调用中创建的变量的函数 该函数只执行两次 我认为 Ajax 调用可能没有足够的时间在循环开始之前进行调用 有没有办法在运行
  • 添加元数据到快速路线

    有什么方法可以将元数据添加到 Express 的路线中吗 例如 app get some route function req res some meta data 我正在寻找一种针对我的节点应用程序的 AOP 方法 因此我想通过身份验证和
  • jQuery.ajax() 记录 HTTP 请求

    我有一个发送 HTTP POST 请求的函数 我想记录它以进行调试 这是函数 function serverRequest URL DATA callback ajax url URL type POST dataType text con
  • 401 未经授权的帖子回复

    我一直在使用 Angular 模板制作 Node js 网站 但我无法在 DB Mongo 上创建数据 这是代码 节点路由 var Property mongoose model Property var jwt require expre
  • 如何清除画布中图像上的矩形

    我需要清除画布中图像上绘制的矩形 而不损坏现有图像 我可以绘制小矩形点并将其清除 但问题是 当我清除矩形时 它在图像上仍保留为白色小斑点 有人可以告诉我如何清除图像上的矩形而不损坏现有图像 我使用了以下方法来清除矩形 但没有用 1 cont
  • 检测未定义的对象属性

    如何检查 JavaScript 中的对象属性是否未定义 检查属性值是否为特殊值的常用方法undefined is if o myProperty undefined alert myProperty value is the special
  • 使用 Google Visualization,为什么 DataView 内容显示在 ChartRangeFilter 中,而不显示在其关联的 LineChart 中?

    下面的代码应该从 CSV 文件填充 DataView 然后 DataView 被输入到 DashBoard 其中包含绑定在一起的 LineChart 和 ChartRangeFilter 我的问题是 虽然 ChartRangeFilter

随机推荐

  • Android SecurityException:uid xxxxx 无法显式添加帐户

    我收到错误消息 java lang SecurityException uid 10178 cannot explicitly add accounts of type net roughdesign swms 即使是我可以创建的最基本的示
  • 带有 RuntimeWarning 的 numpy 除法:double_scalars 中遇到无效值

    我写了以下脚本 import numpy d numpy array 1089 1093 e numpy array 1000 4443 answer numpy exp 3 d answer1 numpy exp 3 e res answ
  • Python从大型文本文件中读取完整行的块(列值拆分为多行)

    我想分块读取一个大的 txt 文件 c 2 5GB 然后在加载到数据库之前执行一些操作 该文件只有 2 列 列分隔符为 并且有资格double quotes 第二列中的值可以跨越多行 下面的示例 我想用这个answer https stac
  • 如何减少大量包装类的实现代码?

    我正在开发一个包含一些类的库 我们称它们为C1 C2 and Cn 这些类中的每一个都实现一些接口 即I1 I2 Im n gt m 库中对象之间的关系很复杂 我必须 为我的库用户提供一些 API 以使用智能指针访问这些对象 经过一番讨论
  • 由于 org.eclipse.core.runtime 无法启动 eclipse

    我将一些插件复制到我的 eclipse 安装中 特别是 Green 和 ObjectAid answer https stackoverflow com questions 14772602 create class diagram aut
  • iOS 中 UITouch 时间戳的精度是多少?

    iOS 中 UITouch 类的时间戳属性有多精确 毫秒 几十毫秒 我正在将 iPad 的内部测量值与贴在屏幕上的自定义触摸检测电路进行比较 发现两者之间存在相当大的差异 标准偏差约 15 毫秒 我已经看到它建议时间戳根据帧刷新间隔进行离散
  • 将电子表格的一半格式化为红色,然后向下填充直到最后一行

    我有一个宏 它成功地获取了一个有 44 列的表格 并将其减少到 12 列 它分割了顶部部分 我们的供应商没有发送任何库存 总列中的单元格将显示 0 并将其粘贴在工作表的顶部 并插入复选框 在一定程度上 我非常努力地制作一个降价表 但它无法正
  • 没有 if 的语言?

    一位同事说他听说过一种没有 如果 概念的语言 那可能吗 如果是的话 它是什么语言 也许除了 Prolog 之外 我不知道任何特定的语言 但我可以想到一种没有语言的语言的几种方法if 语句可能有效 事实上 您也不需要循环构造 显然 您需要某种
  • 如何从linux中完全删除jenkins

    我已经删除了不同文件夹中的詹金斯所有目录 但当我访问 URL 时 它仍然显示 jenkins 登录 我想完全卸载詹金斯 已经尝试了来自互联网的许多命令 但服务器上仍然有詹金斯 我只能通过 putty 进行命令行访问 所以我尝试通过命令尽可能
  • 为什么我的 iPhone 应用程序的图标在构建后被划掉?

    我刚刚构建了我的第一个 iPhone 应用程序 但它的图标似乎被划掉了 当我构建代码时确实有一些警告 但为什么它们会导致应用程序图标交叉 我的应用程序没有错误 图标如下所示 这完全没问题 这只是意味着您的应用程序无法在您的 Mac 上执行
  • 在gvim中,是否可以有多行文件选项卡?

    在gvim中 是否可以有多行文件选项卡 也就是说 它不应该显示左 右箭头来围绕选项卡行导航 对于不适合选项卡行的选项卡 而是应该 开始 新的一行选项卡 AFAIK 不 除非你打算改变 vim 的源代码 但是 如果您需要那么多选项卡 请不要误
  • JavaScript:具有 SRC 属性的内联脚本?

    我习惯于像这样包含和使用 JS 出于好奇 有谁知道带有 src 属性的内联脚本的规则 例如
  • Scala 中的 forSome 关键字有什么用?

    我找到了以下代码片段 List T forSome type T The forSome看起来像一个方法 但我的朋友告诉我这是一个关键字 我用谷歌搜索了一下 但发现很少有关于forSome 它是什么意思 我在哪里可以获得相关文档 The f
  • 为什么这两种情况下putty中tmux的分割线显示不同(xxxxx,qqqqqq)?

    Why the split line of tmux within PuTTY shows different xxxxx qqqqqq in these tow cases If I do not set PuTTY any thing
  • 如何在 xsl if 中使用 xsl 变量

    我正在尝试将 xsl 变量中的值分配给 xml 文件中的新节点 此代码有效 但当 lbi GetCooperatives PVAL 的值为空时添加一个空的 PROP PVAL 节点
  • 如何根据依赖解析器的输出创建一棵树?

    我试图从依赖解析器的输出中创建一棵树 嵌套字典 这句话是 我在睡梦中射杀了一头大象 我能够获得链接中所述的输出 如何在 NLTK 中进行依存解析 https stackoverflow com questions 7443330 how d
  • 尝试 doSMP 示例时出错

    我尝试运行 doSMP 小插图中的简单示例 但出现以下错误 首先 我不确定如何存在现有的 doSMP 会话 因为我在重新启动计算机后立即执行了下面的代码 此外 关于包 doSMP 不存在的重复错误 但库 doSMP 调用工作正常 帮助 gt
  • 如何在 Android 模拟器中缩小 Google 地图?

    我正在模拟器上测试基于地图的应用程序 我通过在屏幕上双击鼠标来放大地图 但无法缩小 请告诉我如何缩小 双击然后按住第二次单击并向上 缩小 或向下 放大 移动鼠标
  • KineticJS 撤消图层:撤消时图层不会消失?

    我在 Canvas HTML5 中的设计器绘图工具上遇到了一个特定问题 我正在开发一个动作历史系统 撤消和重做 我正在构建我的系统projeqht的回答这个问题 https stackoverflow com questions 16096
  • React Hooks 上的 useState 不更新数组

    我已经尝试了很多方法 但似乎无法理解为什么 setTypes 不会更新 类型 数组 import useState useEffect from react import PostList from post list import as