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

React.js--在功能组件[重复]中状态不更新

隗嘉歆
2023-03-14

我有一个功能组件,带有一个名为“checked”的状态钩子,它是一个用于复选框列表的布尔数组。单击复选框时,我有一个更新状态的事件处理程序,因此复选框将呈现复选框或空框。

根据我的函数中的console.logs,状态正在更新,但是浏览器中的复选框没有响应,开发工具确认状态没有更新。如果我使用开发工具手动切换状态,复选框工作正常,所以我认为这是状态不更新的问题。任何建议将非常感谢!

import React, { useState, useContext } from 'react';

export default function MessengerCheckboxes() {
 const [checked, setChecked] = useState([false, false, false]);

...

 const handleChangeChild = (event) => {
   console.log('Currently state is: ' + checked); // Currently state is: [false, false, false]

   let index = parseInt(event.target.id.slice(0, 1));
   let localChecked = checked; //
   localChecked[index] = !checked[index];
    
   console.log('State should be: ' + localChecked); //State should be: [true, false, false] [[for example]]
   setChecked(localChecked);
    
   setTimeout(() => { // Added setTimeout for troubleshooting to make sure I wasn't calling state too quickly after setting it
       console.log('State is now: ' + checked); // State is now: [true, false, false] [[but won't trigger re-render and dev tools show state is [false, false, false]]
   }, 1 * 1000);
 };
}

我的控制台的图像。日志

我的开发工具的图像

提前向你表示衷心的感谢!

共有2个答案

孙博艺
2023-03-14

好吧,你应该读到那些评论,你不应该改变国家。所以为了处理这种情况,我通常会这样做:-

setChecked(data => ({
      ...data,
      [ind]: !checked[ind]
}))
商皓
2023-03-14

你不应该像那样更新状态。

在这种情况下,需要更复杂的状态对象。我喜欢使用对象来保持列表中每个项目的状态。检查此链接:https://codesandbox.io/s/checkbox-state-https-stackoverflow-com-questions-69680938-react-js-state-not-updating-in-functional-component-di0dd

import "./styles.css";
import { useState } from "react";

export default function App() {
  // 1.
  const stateObj = {
    cb1: false,
    cb2: false,
    cb3: false
  };
  const [cbState, setCbState] = useState(stateObj);
  const handleCb = (event) => {
    console.log(event.target.name, event.target.checked);
    // 4.
    setCbState({ ...cbState, [event.target.name]: event.target.checked });
  };
  return (
    <div>
      <input
        type="checkbox"
        name="cb1" // 2.
        onChange={handleCb}
        value={cbState["cb1"]} // 3.
      />
      <input
        type="checkbox"
        name="cb2"
        onChange={handleCb}
        value={cbState["cb2"]}
      />
      <input
        type="checkbox"
        name="cb3"
        onChange={handleCb}
        value={cbState["cb3"]}
      />
    </div>
  );
}

因此,对于外卖,分步骤进行:

  1. 创建/准备状态对象-键将用作html元素的名称
  2. 为html元素设置名称属性-使用1中的相同键
  3. 使用状态['key']设置html元素的值属性-括号表示法。这就是实现受控组件的方法
  4. 设置状态的方式是保存现有数据/值(使用扩展运算符)更新(用于访问属性的括号符号)。在本例中,我们使用事件namechecked属性来实现它
 类似资料:
  • 我创建了一个包含登录组件和注册组件的签名页面组件。我的问题是,我如何传递一个onhtml函数从父到子,以便更改我的父组件(签名页组件)的状态?我期望的是,通过单击子组件中的按钮,可以切换父组件的活动状态,并根据活动状态更改样式。我试图通过一个处理功能从父到子,但它不能很好地工作。 有什么解决办法吗? codesandbox中的详细信息:https://codesandbox.io/s/wizard

  • 问题内容: 我正在尝试将在这里找到的这个很棒的动画转换为React可重用的组件。看来此组件将需要一个父组件作为画布,而许多子组件则为。 出于性能方面的考虑,将它们变成无状态组件可能会更好,因为会有很多这样的组件。我不熟悉制作无状态组件,并且想知道应该在哪里定义和中定义的和函数。 无状态组件的功能是在组件内部还是外部?换句话说,以下哪个更好? 1: 2: 每种都有什么优点/缺点,其中哪一种对我的特定

  • 我目前有一个类组件和一个函数组件在我的主组件 以下是的代码段: 类组件 功能部件 因此,我想做的是通过按钮的onClick操作,从功能组件更改类组件的状态。我怎样才能完成任务?

  • 我正在从一个文件导出常量并将其导入另一个文件,如下所示: 常数.js App.js 我希望我的初始状态是在构造函数中设置的,然后在componentWillMount上,我希望使用常量文件中的值设置状态,然后再围绕组件和流添加进一步的逻辑。 但是,我发现,我的状态没有被更新,如果我在调用setState之后记录控制台日志,状态仍然没有定义,如果我引入一个方法,需要state中的值,那么在执行堆栈的

  • 本文向大家介绍在React.js功能组件中使用useEffect(),包括了在React.js功能组件中使用useEffect()的使用技巧和注意事项,需要的朋友参考一下 React钩子useEffect有助于在React的功能组件中添加componentDidUpdate和componentDidMount组合生命周期。 到目前为止,我们知道我们只能在有状态组件中添加生命周期方法。 要使用它,我

  • 在不使用类的情况下,如何在react的功能性无状态组件中使用PropTypes?

  • 我有一个带有两组按钮(功能和目标)的界面。当我点击一个按钮时,我希望它从一个团队转到另一个团队。我正在用react和redux实现这一点。我唯一的问题是,当状态更新并且我成功地记录了更新的状态时,除非我使用forceUpdate(),否则组件不会更新。我不明白的是,既然状态更新成功,组件不应该自动重新渲染吗? 一些js 正如您所看到的,当我单击一个按钮时,我触发updateLists函数,该函数将

  • 问题内容: 以下是两个 几乎 完成相同任务的React组件。一个是功能;另一个是功能。另一个是一类。每个组件都有一个带有异步侦听器的组件,该侦听器会在更改时进行更新。我需要能够像在经典组件中那样在功能组件中进行访问。 万一有一个以上的情况,不应在全球范围内。 不能包含在功能范围内,因为每次渲染时都会重新初始化。也不应处于状态,因为更改时组件无需呈现。 不会出现此问题,因为它在组件的整个生命周期中都