我正在看这个yt视频,它解释了useRef是如何工作的,视频的结尾有一段代码让我感到困惑(https://www.youtube.com/watch?v=t2ypzz6gJm0)

它基本上是用一个useRef来告诉你previously在文本框中输入了什么,以及当前在文本框中输入了什么,但我不明白它为什么会起作用:

import React, { useState, useEffect, useRef } from "react";

export default function App() {
  const [name, setName] = useState("");
  const prevName = useRef("");
  useEffect(() => {
    prevName.current = name;
  }, [name]);
  return (
    <>
      <input value={name} onChange={(event) => setName(event.target.value)} />
      <div>
        {" "}
        my name is {name} and it used to be {prevName.current}
      </div>
    </>
  );
}

因此,我对useEffect的工作原理的理解是,它只会应用useEffect函数104来重新呈现组件.因此,根据这个逻辑,当调用useEffect函数时,name的值已经更改为它的最新值(即,当前输入文本框中的内容).

那么,为什么这种逻辑是错误的呢?

推荐答案

因此,我对useEffect工作原理的理解是,它只会在重新呈现组件之后应用useEffect函数.

对,是这样

因此,根据这个逻辑,当调用useEffect函数时,name的值已经更改为它的最新值(即,当前输入文本框中的内容).

也是正确的.

但useEffect不会try 更改当前渲染上发生的事情.它的目的只是为组件呈现的next次进行设置.当渲染正在进行时,效果还没有运行,因此prevName.current包含一个旧值(这正是我们想要的).只有渲染完成后,效果才会运行并更改为prevName.current.这太晚了,不能搞砸当前渲染,但可以在下一次渲染中使用.

Reactjs相关问答推荐

删除表2的收件箱未按预期工作

是否可能有不同的加载器用于路径有查询参数和没有查询参数,或者在React Router 6中添加它们时有条件地跳过一个加载器?

ReferenceError:未在Redux组件中定义窗口

Npm运行构建`在Next.js 14中不起作用

为什么我的react虚拟化列表不显示滚动条,除非我确保高度低于rowCount*rowHeight?

关于forwardRef,我可以';我不理解第二个用例

在react上隐藏源映射

React-apexcharts 中的 Y 轴刻度不会动态更新符号

Javascript - 正则表达式不适用于 MAC OS - 编码?

我从 S3 存储桶下载图像时收到错误

如何使用 App Router 和服务器组件在 Next.js 13 中实现分页

我如何使用 React toastify (Promise) toast 和邮箱 js

我无法通过 useContext 显示值

useMemo 依赖项的行为

VideoSDK api 不使用更新状态

为什么 setState 在 React 中不是异步的?

如何从一组对象映射 MUI 5 图标并更改其 colored颜色 ?

如何在 Reactjs 中判断受保护路由上的用户角色?

如何用实际的br标签替换axios响应中的br标签?

当页面重新加载react 路由导航到第一页 v6