使用 TypeScript React Refs:无法读取未定义的属性“当前”

2024-03-18

我正在使用 TypeScript 构建 React 应用程序。

我想创建按钮,滚动到主页上子组件的标题。

我在子组件中创建了一个引用,如下这个堆栈溢出 https://stackoverflow.com/questions/33796267/how-to-use-refs-in-react-with-typescript回答并(尝试)使用转发裁判 https://reactjs.org/docs/forwarding-refs.html#forwarding-refs-to-dom-components在我的父组件上访问它。

export class Parent extends Component {
  private testTitleRef!: RefObject<HTMLHeadingElement>;

  scrollToTestTitleRef = () => {
    if (this.testTitleRef.current !== null) {
      window.scrollTo({
        behavior: "smooth",
        top: this.testTitleRef.current.offsetTop
      });
    }
  };

  render() {
    return <Child ref={this.testTitleRef} />
  }
}

interface Props {
  ref: RefObject<HTMLHeadingElement>;
}

export class Child extends Component<Props> {
  render() {
    return <h1 ref={this.props.ref}>Header<h1 />
  }
}

不幸的是当我触发时scrollToTestTitleRef我收到错误:

Cannot read property 'current' of undefined

这意味着 ref 未定义。这是为什么?我究竟做错了什么?

EDIT: Estus https://stackoverflow.com/users/3731501/estus帮助我创建了参考。但是当我触发scrollToTestTitleRef()事件,它不滚动。 当我console.log this.testTitleRef.current我得到输出:

{"props":{},"context":{},"refs":{},"updater":{},"jss":{"id":1,"version":"9.8.7","plugins":{"hooks":{"onCreateRule":[null,null,null,null,null,null,null,null,null,null,null,null],"onProcessRule":[null,null,null],"onProcessStyle":[null,null,null,null,null,null],"onProcessSheet":[],"onChangeValue":[null,null,null],"onUpdate":[null]}},"options":{"plugins":[{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}]}},"sheetsManager":{},"unsubscribeId":null,"stylesCreatorSaved":{"options":{"index":-99999999945},"themingEnabled":false},"sheetOptions":{},"theme":{},"_reactInternalInstance":{},"__reactInternalMemoizedUnmaskedChildContext":{"store":{},"storeSubscription":null},"state":null}

Note:我删除了以下键cacheClasses, _reactInternalFiber and __reactInternalMemoizedMaskedChildContext,因为它们包含循环依赖性。

所以当前似乎没有关键offsetTop。这是否可能与以下事实有关:在我的实际应用程序中,子组件被包装在material-ui的内部withStyle和 React-Redux'connect?


!非空断言运算符抑制了实际问题。 JavaScript/TypeScript 中没有办法testTitleRef财产可以被指定为不被用作<Child ref={this.titleRef} />,所以它保持未定义(也与testTitleRef and titleRef).

它应该是这样的:

  private testTitleRef: React.createRef<HTMLHeadingElement>();

  scrollToTestTitleRef = () => {
      if (!this.testTitleRef.current) return;

      window.scrollTo({
        behavior: "smooth",
        top: this.testTitleRef.current.getBoundingClientRect().top + window.scrollY
      });
  };
  render() {
    return <Child scrollRef={this.testTitleRef} />
  }

and

export class Child extends Component<Props> {
  render() {
    return <h1 ref={this.props.scrollRef}>Header<h1 />
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 TypeScript React Refs:无法读取未定义的属性“当前” 的相关文章

随机推荐

  • 如何将 Quickbook 桌面应用程序与网站集成

    我是 Quick Book 的新人 现在我正在准备一个管理面板 在线网站 其中我必须与 Quick Book 桌面版本集成 我正在使用 NET C 平台制作这个网站 这里有一些帖子 但我仍然不清楚 简而言之 我的要求是 我们需要发送提供商名
  • javascript 函数在 jquery $(document).ready 块中不起作用

    我正在尝试打电话JavaScript函数从onclick扳机 HTML部分 div class my radio div
  • 如何使用 Sublime Text 运行节点应用程序

    如何使用 Sublime Text 运行节点应用程序 像这样 在sublime中打开app js文件 进入菜单 gt 工具 gt 构建 它 就运行了 就这么简单 Cmd Shift P 搜索 Nodejs Default File Sett
  • 反序列化 MongoDB BSON

    我尝试从查询 MongoDB 实例的 REST 服务获取响应并将响应解析为 Java 对象 Web 服务使用 MIME 类型的 html 返回响应 并用换行符分隔返回的每个记录 尽管我能够调整服务返回的内容 将 BSON 响应转换为 Jav
  • 自动更新数据库Mysql中的库存

    我需要了解数据库中的一件事 我有产品表及其总库存 如图所示 如果有人知道我该怎么做 请分享 谢谢 当提到关系数据库时 您所问的问题在技术上并不是技术意义上的 关系 这种关系就像有一个表引用另一个表的 键 例如将具有客户地址的表与具有客户订单
  • Azure - 启动命令 - 无法访问 jarfile app.jar

    我有一个 Java Spring Boot 应用程序 部署在 Azure Web 服务上 一切正常 我此刻真正想做的是 java jar Dspring profiles active test app jar 我想通过 Azure 云上的
  • 将 msbuild 任务作为 nuget 传送

    我需要你的帮助 我正在开发一个 msbuild 任务 该任务对 msbuild 执行某些操作 我希望我的用户能够下载并安装 nuget 包 安装包后 构建任务将成为构建过程的一部分 我知道如何发布 nuget 包 并且知道如何将自定义目标文
  • C++:受保护的类构造函数

    如果一个类总是要被继承 那么创建构造函数是否有意义protected class Base protected Base class Child protected Base public Child Base Thanks 仅当您不希望客
  • tsql 脚本来查找未被存储过程、视图、函数等使用的表?

    是否有一个 t sql 脚本来找出 sql server 中没有通过存储过程 视图 函数等使用的表 我有一个数据库 有 100 个表 如果不是更多的话 在我删除表之前 我想知道是否有一个脚本可以遍历数据库中的每个对象并告诉我是否有任何表正在
  • 共享互斥体的交替例程

    我有方法a在某个随机时间重复调用 从而触发方法b 它在一段随机时间后完全执行 并且在它自己的线程中 我想确保随后执行a等到b已完成 由当前执行触发a 换句话说 a and b均须交替执行 我尝试使用互斥体和条件变量来执行此操作 如下所示 d
  • pytorch - “conv1d”在哪里实现?

    我想看看 conv1d 模块是如何实现的https pytorch org docs stable modules torch nn modules conv html Conv1d https pytorch org docs stabl
  • DI 和存储库模式

    目前 我的代码与此类似 为了说明一点而缩短 DAL 存储库接口 public interface IRepository
  • VM Tracker 显示较大的脏大小

    我的应用程序的一部分是我同时执行操作的 它们包括初始化许多 CALayer 并将它们渲染为位图 不幸的是 在这些操作期间 在 iphone 4 上每个操作大约需要 2 秒才能完成 VM Tracker 指示的脏大小飙升至约 120MB 分配
  • Java泛型:获取泛型方法的返回类型的类

    背景 我曾经写过这个方法 private
  • 动态标签宽度文本字段概述材料ui反应

    我有一个文本字段变体outlined 我有一个动态标签 问题是当它改变时 顶线的宽度保持与第一次相同
  • Mac OS X 的 CMake 2.8.10 安装无法创建符号链接

    我正在使用 OS X Lion 10 7 5 更新 Mac Book pro 中的 Cmake Cmake的旧版本是2 8 8 新版本是2 8 10 当我运行到安装过程快结束时 安装程 序提示 用于创建多个工具的 usr bin 的符号链接
  • WAR 文件和 Subversion

    我应该如何在 Eclipse 中处理 WAR 文件 使用 GWT 和 Subversion 问题自动柜员机 就是当将 war 文件夹添加到 SVN 时 它包含所有已编译的代码 我没有选项过滤掉这些代码 这使得 svn 签出变得漫长且毫无意义
  • 读取PPM文件并将其存储在数组中;用C编码

    我需要读取 PPM 文件并将其存储在用 C 编写的数组中 有人可以帮我做这个吗 多谢 以下代码展示了如何读取 更改像素颜色以及写入图像 PPM 格式 我希望它有帮助 include
  • Android Studio - “用于编码 UTF-8 的不可映射字符”

    在 Windows 中使用 Eclipse 一切都工作得很好 直到我切换到使用 Android Studio V1 0 的 Mac OS X Yosemite 我将该项目作为非 Android Studio 项目导入 因为它是使用 Ecli
  • 使用 TypeScript React Refs:无法读取未定义的属性“当前”

    我正在使用 TypeScript 构建 React 应用程序 我想创建按钮 滚动到主页上子组件的标题 我在子组件中创建了一个引用 如下这个堆栈溢出 https stackoverflow com questions 33796267 how