正文从这开始~
总览
当我们用一个null
值初始化一个ref
,但在其类型中不包括null
时,就会发生"Cannot assign to 'current' because it is a read-only property"错误。为了解决该错误,请在ref
的类型中包含null
。比如说,const ref = useRef(null)
。
文章图片
这里有个例子来展示错误是如何发生的。
// App.tsx
import {useEffect, useRef} from 'react';
const App = () => {
const ref = useRef(null);
useEffect(() => {
// ?? Error: Cannot assign to 'current' because it is a read-only property.ts(2540)
ref.current = 'hello';
}, []);
return (hello world);
};
export default App;
上面例子的问题在于,当我们将
null
作为初始值传递到useRef
钩子中时,并且我们传递给钩子的泛型中没有包括null
类型,我们创建了一个不可变的ref
对象。正确的泛型 为了解决该错误,我们必须在传递给钩子的泛型中包括
null
类型。// App.tsx
import {useEffect, useRef} from 'react';
const App = () => {
// ? include null in the ref's type
const ref = useRef(null);
useEffect(() => {
ref.current = 'hello';
}, []);
return (hello world);
};
export default App;
在
ref
的类型中,我们使用联合类型来包括null
类型,这使它成为可变ref
对象。现在这个例子中DOM元素 如果你的引用指向一个DOM元素,情况也是一样的。如果你需要改变ref
的类型是字符串或null
,它的current
属性可以赋值为这两种类型中的任意一种的值。
ref
的current
属性的值,你必须将钩子的类型定为 const ref = useRef(null)
。注意,如果你不直接赋值给它的
current
属性,你不必在 ref
的类型中包含 null
。// App.tsx
import {useEffect, useRef} from 'react';
const App = () => {
const ref = useRef(null);
useEffect(() => {
ref.current?.focus();
}, []);
return ();
};
export default App;
【React报错之Cannot assign to 'current'】上述例子中的
ref
是用来聚焦input
元素的。因为没有对其.current
属性进行赋值,所以没有必要在其类型中包含null
。推荐阅读
- React报错之The tag is unrecognized in this browser
- react|react native常用插件
- react.js|React(9)—— Hooks - LazyLoad - Context - 组件优化 - 错误边界 - 组件通信方式总结
- 前端|Next.js 与 React 之间的比较
- react|react-router-dom v6 使用
- React|React 组件三大属性
- React|react-router-dom V6
- React|React组件三大核心属性(二)——props
- react|React 组件与组件实例的三大属性