微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 let 在 React 中失去了它的价值?

如何解决为什么 let 在 React 中失去了它的价值?

我有这个 React 代码organizationId一个 let 变量,如您所见。首先和 sendond 我可以看到价值,但第三个没有,这怎么可能?它是基于 Next.js 的项目。

function Event(props: EventProps) {
  const { lang,translations,eventId } = props;
  const [event,setEvent] = useState<EventOut | undefined>();
  const [enableSaleSwitch,setEnableSaleSwitch] = useState<boolean>(false);
  const [
    enableSaleSwitchOnwordpress,setEnableSaleSwitchOnwordpress,] = useState<boolean>(false);
  let isTiketAdmin: string | null;
  let jwt: string | null;
  let eventIdNew: string | undefined;
  let organizationId: string | undefined;
  let organization: OrganizationOut | undefined;
  let userFbId: string | null;
  let permission: string | undefined;

  useEffect(() => {
    isTiketAdmin = localStorage.getItem("isTiketAdmin");
    jwt = localStorage.getItem("jwt");
    userFbId = localStorage.getItem("userFbId");
  },[]);

  useEffect(() => {
    organizationId = getorganizationFbIdFromEventId(eventId);
    if (organizationId != undefined) {
      organization = getorganizationByFbId(organizationId!);
      if (organization && userFbId) {
        permission = organization.usersWithPermission[userFbId];
        setEvent(organization.events[eventId]);
      }
    }
  },[eventId]);

  useEffect(() => {
    if (event) {
      if (checkEnableSaleOnTiket(event,eventId)) {
        setEnableSaleSwitch(true);
      } else {
        setEnableSaleSwitch(false);
      }
      if (checkEnableSaleOnwordpress(event,eventId)) {
        setEnableSaleSwitchOnwordpress(true);
      } else {
        setEnableSaleSwitchOnwordpress(false);
      }
    }
  },[event]);

enter image description here

解决方法

首先,您应该描述发生了什么以及为什么它不是您所期望的,而不是仅仅发布 GIF 图片。

作为一个实际的答案,它为什么重要?您对该 useEffect 的依赖数组未指定 organizationId

会发生什么:

  1. 首次渲染,所有 useEffects 钩子都设置为运行。
  2. 第二个钩子首先运行(忽略不相关的第一个钩子)。它分配 organizationId
  3. 第二个钩子调用 setEvent,排队重新渲染以备后用
  4. 随后运行第三个钩子(“并行”)并查看更新后的值。
  5. 第二次渲染,由第 3 步引起。
  6. 第二个钩子不运行,因为 eventId 没有改变。它的依赖数组表示仅在 eventId 更改时重新运行钩子效果。因此organizationId 不会再次设置。
  7. 由于 event 发生了变化,因此运行了第三个钩子。如第 6 步所示,前一个钩子未运行此渲染,因此未设置变量。

如果您有一个变量需要在渲染之间保留并与钩子共享,请将其设为状态变量或引用。例如。使用 useStateuseRef,具体取决于更新变量是否应重新渲染组件。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?