(useRef) 不能分配给 ‘current’ 因为它是只读属性
(useRef) Cannot assign to ‘current’ because it is read-only property
null
当我们使用值初始化 ref 但不包含null
在其类型中时,会出现错误“无法分配给‘current’,因为它是只读属性” 。
要解决该错误,请null
在 ref 的类型中包含,例如
const ref = useRef<string | null>(null)
.
下面是错误如何发生的示例。
应用程序.tsx
import {useEffect, useRef} from 'react'; const App = () => { const ref = useRef<string>(null); useEffect(() => { // ⛔️ Error: Cannot assign to 'current' because it is a read-only property.ts(2540) ref.current = 'hello'; }, []); return ( <div> <h2>hello world</h2> </div> ); }; export default App;
问题在于,当我们将null
初始值作为初始值传递给
useRef挂钩并且不包含null
在我们传递给挂钩的泛型的类型中时,我们创建了一个不可变ref
对象。
包含null
在类型中
为了解决这个错误,我们必须在null
我们传递给钩子的泛型的类型中包含。
应用程序.tsx
import {useEffect, useRef} from 'react'; const App = () => { // 👇️ include null in the ref's type const ref = useRef<string | null>(null); useEffect(() => { ref.current = 'hello'; }, []); return ( <div> <h2>hello world</h2> </div> ); }; export default App;
我们使用了一个
联合类型
来包含null
在 ref 的类型中,这使它成为一个可变的 ref 对象。
现在示例中 ref 的类型是
string
ornull
并且current
可以为其属性分配两种类型中的任何一种的值。如果您的 ref 指向 DOM 元素,情况也是如此。
您必须键入钩子,就const ref = useRef<HTMLElement | null>(null)
好像您需要更改 ref 的current
属性值一样。
null
请注意,如果您不直接分配给它的属性,则不必包含在引用的类型中current
。
应用程序.tsx
import {useEffect, useRef} from 'react'; const App = () => { const ref = useRef<HTMLInputElement>(null); useEffect(() => { ref.current?.focus(); }, []); return ( <div> <input ref={ref} type="text" defaultValue="" /> </div> ); }; export default App;
示例ref
中的 用于
聚焦input
元素。
ref 的属性没有赋值.current
,因此没有必要包含null
在它的类型中。
如果您收到错误 useRef Object is possibly null,请单击
以下文章。