useEffect 状态更改后未触发

2024-01-02

我正在制作一个自定义下拉列表,允许在下拉列表中推送新项目。由于某种原因,useEffect 不会在状态更改时触发,但会在初始渲染时触发。我很确定我错过了一些小东西,但看不到它。当用户单击与“addNewOptionToTree”方法关联的按钮时,应推送新项目。然后,categoryList 应在下拉列表中显示新项目。控制台日志被触发并且新的 arr 出现......有什么想法吗?

以上返回:

    const [newOption, setNewOption] = useState('')

    const [categoryList, setCategoryList] = useState(["Calendars", "Meetings", "Apostrophes work!"])

    useEffect(() => {
        console.log("categoryList::::::::::::::::", categoryList)
      }, [categoryList]);
    
    
      function addNewOptionToTree() {
        console.log('category:', categoryList);
        console.log('newOption:', newOption);
        const categoryListArr = categoryList
        categoryListArr.push(newOption)
        setCategoryList(categoryListArr)
        console.log("category:", categoryListArr);
    
      }

在返回块中:

<div className='dropDownList'>
          <div className='listItem' key={'add-item-key'}>
            <Input
              type='text'
              label=''
              value={newOption}
              placeholder='Add New Category'
              onChange={val => setNewOption(val)}
            />
          <div className='icon-add-contain dropdown-add-btn' onClick={addNewOptionToTree}></div>
          </div>
          {
            categoryList.length > 0 &&
              categoryList.map((category, index) => (
                <div className='listItem' onClick={onOptionClicked(category)} key={'level1-'+index}>
                  {category}
                </div>
              ))
          }
        </div>

就你而言,它没有被改变,因为objects and arrays在 JS 中通过引用进行比较,而不是通过值进行比较。

例如

let foo = {bar: 1}
let faz = foo
let notFoo = {bar: 1}
foo === faz // true
foo === notFoo // false

话虽这么说,在这里:

 const categoryListArr = categoryList // you are passing categoryList by reference
 categoryListArr.push(newOption)
 setCategoryList(categoryListArr)

你直接改变你的状态,这通常不好。为了使其正常工作,您需要创建您的categoryListArr以不可变的方式数组

 const categoryListArr = [...categoryList] // this is a new array, which contains the same items from the state
 categoryListArr.push(newOption)
 setCategoryList(categoryListArr)

或者像这样

setCategoryList(prev => [...prev, newOption])

现在你的useEffect将被触发。

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

useEffect 状态更改后未触发 的相关文章

  • 如何发送和接收大型 JSON 数据

    我对全栈开发比较陌生 目前正在尝试找出一种有效的方法send and fetch我的前端 React 和后端 Express 之间存在大量数据 同时最大限度地减少内存使用 具体来说 我正在构建一个地图应用程序 它需要我处理大型 JSON 文
  • Redux - 从函数调用操作

    我正在尝试从函数调用 redux 操作 我调用该函数的组件已连接到商店 但是 如果我通过以下操作 它就不起作用 function myFunc action action 有没有办法通过参数传递动作 谢谢 using bindActionC
  • Firestore 查询 .toUpperCase() 不起作用

    我正在尝试创建一个网站 使用户能够搜索 Firebase Firestore 中的文档集合 该过程涉及将用户的输入保存为状态 useState 并利用 useEffect 挂钩来查询 Firebase 数据库 但是 我遇到了一个问题 即使用
  • 带换行符的 React/Momentjs 日期格式

    我有一个日期字符串 我想对其进行格式化 其中数字位于月份下 Jul 6 我尝试了几种不同的方法来添加新行
  • 使用 Jest 和 React JS TestUtils 测试表单

    我有一个带有 3 个单选按钮的表单 如下所示 假名
  • Jwt 签名和前端登录身份验证

    我有这个特殊的 jwt sign 函数 Backend const token jwt sign id user id process env TOKEN SECRET expiresIn 1m res header auth token
  • 使用 Reactjs 获取滚动位置

    我使用reactjs并想要处理滚动click event 首先 我呈现了帖子列表componentDidMount 其次 通过click event在列表中的每个帖子上 它将显示帖子详细信息并滚动到顶部 因为我将帖子详细信息放在页面的顶部位
  • 使用 React.js + Express.js 发送电子邮件

    我在 ES6 中使用 React js 构建了一个 Web 应用程序 我目前想要创建一个基本的 联系我们 页面并想要发送电子邮件 我是 React 新手 刚刚发现我实际上无法使用 React 本身发送电子邮件 我正在遵循教程nodemail
  • 从旧的外部 Javascript 更改 React 组件的状态?

    如何从旧的 jQuery soup 中更改 React 组件的状态 代码 我有一个这样的组件 var AComponent React createClass getInitialState function return ids rend
  • ReactJS - Redux Form - 如何根据单选字段元素有条件地显示/隐藏元素?

    我对 Redux 比较陌生 我有一个表单 其中有一些无线电输入 是 或 否 基本上 我想根据该无线电输入选择有条件地显示包含另一个 redux 表单字段的另一个元素 有直接的方法可以做到这一点吗 我想检查一下formProps site v
  • 您在 javascript Web 应用程序中使用的第三方 API ApiKey 存储在哪里?

    如何以及在何处存储您在 javascript Web 应用程序中使用的第三方 API ApiKey 又名 AppId AppSecret AppKey 如果它用于获取 URL 并且在浏览器网络选项卡中可见 我是否应该对其保密 示例 在我的
  • 打字稿 - 字符串'不可分配给类型'FC

    我收到以下错误 Type props PropsWithChildren lt amount number gt gt string is not assignable to type FC lt amount number gt Type
  • 如何在react-router-dom v6中的路由组件中添加道具

    正如标题所述 我曾经有一个带有状态组件的页面 该组件根据 url 的更改获取不同的 props 现在 升级到React Router v6 我真的不明白如何让它再次工作 我确实知道现在解决这个问题的唯一方法是使用诸如 useNavigate
  • React Context 的范围是什么?

    我不清楚在哪里Context可以在 React 应用程序中创建 我可以在组件树中的任何位置创建上下文吗 如果可以 该上下文的范围是否仅限于创建它的子级 或者 Context 本质上是全局的 我可以在文档中的哪里找到这个 案例 我在页面上多次
  • React onSubmit e.preventDefault() 有时不起作用 + Axios

    现在我在 React 中面临这个奇怪的问题 其中带有 e preventDefault 的 onSubmit 函数有时会避免刷新页面 有时则不会 我创建了两个挂钩来跟踪上传的文件及其进度条 const uploadedFiles setUp
  • HTMLImageElement 作为 React Child 无效

    我正在尝试异步加载图像 并且仅在加载图像后才将其显示在 React 应用程序中 componentDidMount const img new Image img onload gt this setState originalImage
  • 将 Sweet Alert 弹出窗口添加到 React 组件中的按钮

    我为 Bootstrap 和 React 找到了这个完美的 Sweet Alert 模块 我在 Meteor 应用程序中使用它 http djorg83 github io react bootstrap sweetalert http d
  • React无限滚动scrollableTarget动态获取id?

    我在我的项目中使用react infinite scroll component 如何让scrollableTarget动态获取item id 我试过这样scrollableTarget item id 但它不起作用 必须与该 div 具有
  • 如何将React版本17降级到16?

    由于 React 17 不支持许多 React 包 如何将 React 版本从 17 降级到 16 假设您使用 npm yarn 或其他节点包管理器 依赖项版本列在package json 搜索react and react dom包下de
  • React Native - 跨屏幕传递数据

    我遇到了一些麻烦react native应用程序 我不知道如何跨屏幕传递数据 我意识到还有其他类似的问题在 SO 上得到了回答 但是这些解决方案对我来说不起作用 我正在使用StackNavigator 这是我的设置App js file e

随机推荐

  • 在express中获取rawBody

    我正在尝试从帖子中检索某些内容 并且需要传入请求中的 rawBody 属性 我怎样才能取回它 我尝试使用express bodyParser 在我的帖子处理程序中 我正在寻找req rawBody 但它是未定义的 我什至尝试使用 conne
  • 属性“x”是私有的,只能在类“y”内访问

    我有这段代码 import Component from angular core import NavController Loading Alert from ionic angular Component templateUrl bu
  • MapView 检测滚动

    我希望如此MKMapView继承自UIScrollView就像UITableView and UICollectionView是 这样你就可以覆盖UIScrollView委托方法并执行您需要执行的操作 我找到了将平移手势附加到的方法MapV
  • 使用黄瓜运行量角器时如何仅运行一个特征文件?

    我有多个功能文件 我真的很想只运行一个文件或一个场景或一个标签 我知道我可以只在 cucumberConf js 的规范中提供一个文件 但我想运行一次而不用摆弄我的 cucumberConf js 运行量角器时需要输入哪些参数 在量角器的配
  • 如何使用您自己的编程语言来利用 VDSO 对象?

    最近的 Linux 内核 至少在 amd64 上 提供了一个名为的神奇对象文件linux vdso so 1它抽象了内核的系统调用接口 允许内核选择最佳的调用约定 如果你用 C 语言编写代码 glibc 会自动使用这个对象 现在 如果我想编
  • 我应该使用什么模型/模式来处理多个数据源?

    作为电子商务系统的一部分 我需要设计和实现某种黑匣子 这需要从各种内部和外部数据源 即网站 外联网 雅虎商店 亚马逊 xml 提要等 接受客户和订单 并插入 更新后端系统 用于插入 更新客户和订单数据的 API 已在网站上到位并且运行良好
  • 如何从 sip.voidptr (QImage.constBits()) 转换为 ctypes void 或 char 指针?

    我使用的是 python 当然你不能很快地循环遍历大图像的每个像素 所以我遵循 C DLL 我想做这样的事情 img QImage myimage png constBits imgPtr c void p img found ctypes
  • 如何使用 Java 在 Android 中获取 Google 搜索结果?

    我想将 Google 搜索功能添加到我的 Android 应用程序中 我想创建一种布局 可以在其中显示来自不同分支 书籍 视频 地图等 的结果 如何以编程方式获得结果 有 API 和示例吗 谷歌网页搜索 http code google c
  • Flurry Session 数据与 Google Analytics

    我们在 Android 和 iOS 应用程序上运行 Flurry 和 GA 然而 在同一时间段内 Flurry 上的会话数比 GA 上的会话数多 30 有人也经历过这个吗 理想情况下不想同时运行两者 在 Flurry 中 每次一项活动启动
  • 匹配任何 URL 参数值的正则表达式(Perl 语法)

    我正在努力寻找一种模式 允许我选择 URL 字符串的 Parameter Value 元素的值部分 我希望它足够通用 以便我可以用任何术语替换 参数 并检索其值 例如 如果 URL 字符串是 它始终遵循以下一般形式 我需要能够有选择地获取用
  • 如何将 JavaScript 和 HTML 保存在选项中而不自动转义?

    我自以为我很了解 WordPress 现在看来 update option 自动转义代码 如果我想在选项中保存一些 Javascript 或 HTML 代码 此行为会导致代码无法使用 我拒绝对返回值执行 str replace 来过滤掉每个
  • 将 UIAutomation Provider 添加到 Delphi 控件(特别是网格)

    我们的 VCL Delphi 应用程序有许多网格 我们需要开始通过 UIAutomation 与之交互 存在许多问题 尤其是 TStringGrid 没有实现任何 IUIAutomation 模式 IGridProvider 或 ITabl
  • Django 反向和 url 默认值而不是 NoReverseMatch

    是否可以设置一个默认 URL 当无法找到反向匹配时将使用该默认 URL 这个想法是 如果在生产中出现拼写错误 我想显示类似于 404 或描述性错误页面的内容 而不是获得 NoReverseMatch 异常 templatetag url 引
  • Docker EE(企业版)、Docker CE(社区版)和 Docker(自定义支持)之间的具体区别是什么

    Docker 安装指南确实包含三种不同的安装 Docker 的方法 我想知道这三个组件之间的确切区别 Docker CE 社区版 是简单经典的OSS 开源软件 Docker 引擎 Docker EE 企业版 https docs docke
  • 当 Modal 和 Popup 设置为 True 时,MS Access 表单会调整大小

    我过去多次遇到过这个问题 想知道如何解决 When Modal and Popup在 MS Access 2003 表单上设置为 True 在看起来不一致的情况下 当表单加载时 表单将在屏幕的左上角聚集在一起 有时会发生 有时不会 我似乎无
  • c# webservice返回错误

    我需要一些关于这方面的帮助 请对我温柔一点 我还不是专家 问题是我试图通过 JSON 将数据从客户端 浏览器 发送到服务器 Web 服务 当我在 Fiddler 中查看 POST 数据时 我可以看到我发送的 JSON 这是有效的 经过测试
  • 强制代码优先始终初始化不存在的数据库?

    有时 我会删除我的开发数据库并运行我的 EF 代码优先应用程序 我会收到错误 无法打开登录请求的数据库 AssessmentSystem 登录失败 用户 AssessmentAdmin 登录失败 我认为这是因为DbContext仅 首次使用
  • 调用performSeguewithIdentifier不会调用shouldperformseguewithIdentifier

    我有两个视图控制器 在视图控制器1上我有以下内容 将我带到 viewcontroller2 的 Segue 此 Segue 名为 showme 并附加到 viewcontroller UIButton 的 IBAction 在我的代码中 我
  • 制作 JFrame 和可观察对象

    我有一堂课 比方说MyJFrame它代表我的应用程序的 GUI 它实现了接口Observer并重写该方法update public class MyJFrame extends JFrame implements Observer publ
  • useEffect 状态更改后未触发

    我正在制作一个自定义下拉列表 允许在下拉列表中推送新项目 由于某种原因 useEffect 不会在状态更改时触发 但会在初始渲染时触发 我很确定我错过了一些小东西 但看不到它 当用户单击与 addNewOptionToTree 方法关联的按