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

在儿童的第一次渲染useEffect时,将hook useState与旧状态进行反应

苏阳州
2023-03-14

例子:https://codesandbox.io/s/react-hooks-playground-forked-15ctx?file=/src/index.tsx

一个父级有一个useState钩子,三个子级有一个use效应钩子。我希望子级通过回调更新父级中的状态,以便所有组件状态都更新为父级中的一个对象。这对于初始/第一渲染不起作用,因为当前状态不会在每个use效应触发的回调之间更新(参见上面的示例或下面的代码)。这意味着组合状态仅由最后一个子级的状态组成。

const ChildElement = ({ index, callback }) => {
  useEffect(() => {
    callback(index);
  }, []);
  return <>{index}</>;
};

const App = () => {
  const [state, setState] = useState(0);

  const callback = (index: any) => {
    const newObject = { a: index };
    setState({ ...state, [index]: newObject });
  };

  console.log(state);

  return (
    <>
      <ChildElement index={0} callback={callback} />
      <ChildElement index={1} callback={callback} />
      <ChildElement index={2} callback={callback} />
    </>
  );
};
  • 我可以在父级中声明初始状态,但这需要更多的代码

有什么建议吗?解决这个问题的最佳方法是什么?

共有1个答案

韩玉石
2023-03-14

你正面临一场比赛。

如果你有所改变

const callback = (index: any) => {
    const newObject = { a: index };
    setState({ ...state, [index]: newObject });
  };

致:

  const callback = (index: any) => {
    const newObject = { a: index };
    setState((currentState) => ({ ...currentState, [index]: newObject }));
  };

你的代码会起作用的

虽然这:

所有组件状态都更新为父对象中的一个对象

这不是一个好的做法。

子组件最好有自己的状态,如果这些状态彼此相似,您可以通过创建自定义钩子来减少代码。

 类似资料:
  • 我有一个非常简单的react应用程序。我试图设置一个状态变量,然后在console.log之后立即设置该变量,但得到一个空值。 我希望在第一次渲染时,它会在控制台中显示“Test”,但它会显示空字符串。这是怎么回事?

  • 我正在尝试使用按钮(传递给另一个组件)来切换暗模式。最初,我加载一个轻主题样式表。然后,切换主题按钮应删除页面上最新加载的样式表,并将状态设置为与当前状态相反的状态。 我的理解是,然后,useEffect将“看到”状态变化并启动。这就是我们加载新样式表的地方。应用正确加载初始样式表,切换按钮可以正常工作一次,但之后就不能正常工作。第一次更改后,它会删除所有样式。使用反应开发工具,看起来状态正在正确

  • 我无法理解为什么我的AppReact组件呈现两次,如下面的gif所示。 我插入了一个控制台。在返回组件之前记录日志,查看组件渲染的次数。 每当我移除useState钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的

  • 有一个案例我很困惑。 我有一个对象redux状态:{show:true,creative:{name:'a',tags:[t1,t2,t3]}。此对象已通过“react redux”的“connect”功能映射到道具。 当我改变属性“显示”或“creative.name”时,它确实会触发重新渲染。但是如果我将t0追加到"creative.tags",它就不会运行re-渲染。 我必须分配一个新变量来

  • 所以就像标题所说的,我的应用程序的主页因为某种原因渲染了两次,我不知道为什么。从我的浏览器路由器,我最初调用一个JS文件,从那里我调用我的HomePage组件和React路由器,但然后我的页面渲染两次,我不知道为什么。 我的浏览器路由器(index.js): 然后pp.js被称为: 然后我的主页组件(index.jsx): 和路线。js: 但是我的页面是这样渲染的: 我真的很困惑,所以任何建议都会

  • 我有一个组件,它获取作为道具的项目集合,并将它们映射到作为父组件的子组件呈现的组件集合。我们使用存储在WebSQL中的图像作为字节数组。在函数中,我从项中获取图像ID,并对进行异步调用,以获取图像的字节数组。我的问题是,我不能在React中传播这个promise,因为它不是为了处理渲染中的promise而设计的(至少我可以告诉你)。我来自一个背景,所以我想我正在寻找类似于关键字的东西来重新同步分支