- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
通常当我使用 React + Typescript 并且我必须使用 refs 时,我通常会使用这个检查:
const ref = useRef<HTMLDivElement>(null)
...
if(ref && ref.current)
但最近,我收到了这个错误:
Property 'current' does not exist on type '((instance: HTMLDivElement | null) => void) | RefObject<HTMLDivElement>'.
Property 'current' does not exist on type '(instance: HTMLDivElement | null) => void'.ts(2339)
关于这个错误意味着什么的任何想法?为了解决这个问题,作为一种解决方法,我添加了第三个检查:
if(ref && "current" in ref && ref.current)
但这看起来很糟糕,主要是当您必须同时使用多个 refs 时。
最佳答案
现代 React 中有两种 ref:ref 对象和 ref 回调。 Ref 对象是由 useRef
创建的。 (或在类组件中,createRef
):它是一个带有 current
的对象属性(property)。在 typescript 中,这些类型为 RefObject<T>
, 其中 T
是 current
上的任何值.
Ref 回调是另一种选择,某些高级案例需要它。您将一个函数传递给元素,该函数将在创建或销毁实例时回调。它们的类型为 (instance: T) => void
.
将 ref 对象和 ref 回调组合成一个类型的简写是 Ref<T>
,看起来这就是您的代码所期望的。由于您尚未显示该代码,因此我必须对其外观进行一些有根据的猜测。假设您有一个接受 ref 作为 prop 的组件(也许它可以将它交给它的内部组件之一):
interface ExampleProps {
buttonRef: Ref<HTMLButtonElement>
}
const Example: FC<ExampleProps> = ({ buttonRef }) => {
return (
<div>
<button ref={buttonRef}>Hello</button>
<div>
)
}
由于我已将 prop 定义为 Ref,因此可以在 ref 对象或 ref 回调中传递它。在这种情况下这很好,因为除了将它传递给按钮之外,我没有对它做任何事情。但是如果我尝试编写一些代码来与之交互,我不能假设它是一个对象或函数。
.current
interface ExampleProps {
buttonRef: RefObject<HTMLButtonElement>
}
const Example: FC<ExampleProps> = ({ buttonRef }) => {
useEffect(() => {
console.log(buttonRef.current);
});
return (
<div>
<button ref={buttonRef}>Hello</button>
<div>
)
}
但也许我不想限制我的组件的使用方式,但我仍然需要能够以某种方式与 ref 交互。在这种情况下,我可能需要自己创建一个回调 ref,然后向其中添加逻辑来处理我对 ref 的使用以及 prop 对 ref 的使用:
interface ExampleProps {
buttonRef: Ref<HTMLButtonElement>
}
const Example: FC<ExampleProps> = ({ buttonRef }) => {
const myRef = useRef<HTMLButtonElement>(null);
useEffect(() => {
console.log(myRef.current);
});
return (
<div>
<button ref={(element) => {
(myRef as MutableRefObject<HTMLButtonElement>).current = element;
if (typeof buttonRef === 'function') {
buttonRef(element);
} else {
buttonRef.current = element;
}
}}>Hello</button>
<div>
)
}
as MutableRefObject<HTMLButtonElement>
的类型断言需要,因为
myRef
被标记为不可变。这种类型反射(reflect)了只有 react 应该修改
.current
的事实。属性(property)。这对于正常的用例来说是好的,但是由于我们从 react 中接管了这个责任,所以改变值是可以的。
关于javascript - 类型 'current' 上不存在属性 '((instance: HTMLDivElement | null) => void) | RefObject<HTMLDivElement>',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65876809/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!