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

React.useState不会从道具重新加载状态

燕文昌
2023-03-14

我期待状态重新加载道具更改,但这不起作用,并且user变量在下一次useState调用时没有更新,这是怎么了?

function Avatar(props) {
  const [user, setUser] = React.useState({...props.user});
  return user.avatar ? 
         (<img src={user.avatar}/>)
        : (<p>Loading...</p>);
}

代码

共有3个答案

宇文修文
2023-03-14

您可以为此创建自己的自定义简单挂钩。钩子在更改默认值时更改了默认值。

https://gist.github.com/mahmut-gundogdu/193ad830be31807ee4e232a05aeec1d8

    import {useEffect, useState} from 'react';

    export function useStateWithDep(defaultValue: any) {
      const [value, setValue] = useState(defaultValue);
    
      useEffect(() => {
        setValue(defaultValue);
      }, [defaultValue]);
      return [value, setValue];
    }

#范例

const [user, setUser] = useStateWithDep(props.user);
孙阳旭
2023-03-14

在函数组件中,我们使用useState为变量设置初始值,如果我们通过props传递初始值,它将始终设置相同的初始值,直到您不使用use效应钩子,

例如,您的案例这将完成您的工作

 React.useEffect(() => {
      setUser(props.user);
  }, [props.user])

传递给use效应的函数将在渲染提交到屏幕后运行。

默认情况下,效果在每次完成渲染后运行,但您可以选择仅在某些值发生更改时激发效果。

React.useEffect(FunctionYouWantToRunAfterEveryRender)

如果只将一个参数传递给useEffect,它将在每次渲染后运行此方法。通过将第二个参数传递给useEffect,您可以决定何时启动此函数YouwanttoRunafter EveryRender

React.useEffect(FunctionYouWantToRunAfterEveryRender, [props.user])

当你注意到我正在通过[props.user]现在use效应将只触发这个FunctionYouWantToRunAfterAnyRender函数时props.user被改变

我希望这有助于你的理解让我知道如果有任何改进需要感谢

东门宜
2023-03-14

传递给useState的参数是初始状态,就像在类组件的构造函数中设置状态一样,不用于在重新渲染时更新状态

如果您想更新prop更改的状态,请使用use效应钩子

function Avatar(props) {
  const [user, setUser] = React.useState({...props.user});

  React.useEffect(() => {
      setUser(props.user);
  }, [props.user])

  return user.avatar ? 
         (<img src={user.avatar}/>)
        : (<p>Loading...</p>);
}

工作演示

 类似资料:
  • 问题内容: 我希望状态在道具更改时重新加载,但这不起作用,并且变量在下次调用时不会更新,这是怎么回事? 码笔 问题答案: 传递给useState的参数是初始状态,就像在构造函数中为类组件设置状态一样,并且不用于在重新渲染时更新状态 如果您想在道具变更时更新状态,请使用钩子 工作演示

  • 我正在使用Angular UI路由器,希望重新加载当前状态并刷新所有数据/重新运行当前状态及其父级的控制器。 我有3个州级:directory.organisations.details 目录组织包含一个包含组织列表的表。单击表loads目录中的项目。组织。$StateParams传递项目ID的详细信息。因此,在详细信息状态下,我加载此项目的详细信息,编辑它们,然后保存数据。目前一切正常。 现在我

  • 问题内容: 我正在使用Angular UI Router,并希望重新加载当前状态并刷新所有数据/为当前状态及其父级重新运行控制器。 我有3个状态级别: directory.organisations.details directory.organisations 包含一个带有组织列表的表。单击表中的一个项目将加载$ directoryParams传递该项目的ID的 directory.organi

  • 我试图了解如何构建具有不同"页面"或"视图"的ReactJS应用程序。 我将以下组件作为我的基础应用程序,并且我正在React状态中使用currentState属性在视图中的活动组件之间切换。 它执行此任务,但在启动dataLoaded回调时,组件从不接收更新的recipes数组。 如何根据应用程序中的更新状态更新道具? 还是我处理这整件事的方式错了?

  • 问题内容: 我在由运行的docker容器中存在一些问题。 Docker文件 还有我的docker-compose.yml 当我运行它时,一切都很好,但编辑文件不会增加应用程序的重载。文件已更改,我确定是因为我通过ssh连接对其进行了检查,并且容器中的文件已被编辑。再次重新启动容器时,将应用所有更改。我以为当我仅通过docker切换建筑物图像来构成此图像时,它就会消失,但事实并非如此。 当我打电话时